Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
8eda82c
Add IOURequestStepDistanceOdometer page
jakubkalinski0 Dec 12, 2025
139eaf6
Setup navigation for IOURequestStepDistanceOdometer page
jakubkalinski0 Dec 12, 2025
9ad8cfa
Add IOURequestStepDistanceOdometer to TabSelector of Track distance
jakubkalinski0 Dec 12, 2025
f91e66a
Add utils and proper redirect for IOURequestStepDistanceOdometer
jakubkalinski0 Dec 12, 2025
95a006e
Adjust HOC to work for IOURequestStepDistanceOdometer
jakubkalinski0 Dec 12, 2025
add4518
Adjuste IOURequestStepConfirmation to properly handle Odometer expense
jakubkalinski0 Dec 12, 2025
fb26c40
Add proper DiscardChangesConfirmation handling for IOURequestStepDist…
jakubkalinski0 Dec 12, 2025
b53561b
Add english translation for Odometer
jakubkalinski0 Dec 12, 2025
2007e56
Merge branch 'main' into jakubkalinski0/Create_NewDot_Odometer_expens…
jakubkalinski0 Dec 15, 2025
a5c0fde
Removed backTo and fixed proper handling of unsaved changes during ed…
jakubkalinski0 Dec 16, 2025
2c98761
Merge branch 'main' into jakubkalinski0/Create_NewDot_Odometer_expens…
jakubkalinski0 Dec 16, 2025
01bca21
Remove image handling from IOURequestStepDistanceOdometer.tsx
jakubkalinski0 Dec 16, 2025
61951eb
Added coverage for shouldUseDefaultExpensePolicy following the patter…
jakubkalinski0 Dec 16, 2025
581d8f1
Merge branch 'main' into jakubkalinski0/Create_NewDot_Odometer_expens…
jakubkalinski0 Dec 19, 2025
fc7ca57
Merge branch 'main' into jakubkalinski0/Create_NewDot_Odometer_expens…
jakubkalinski0 Dec 19, 2025
612f908
Merge branch 'main' into jakubkalinski0/Create_NewDot_Odometer_expens…
jakubkalinski0 Dec 22, 2025
295e5b1
Merge branch 'main' into jakubkalinski0/Create_NewDot_Odometer_expens…
jakubkalinski0 Dec 23, 2025
6354c70
Added skipConfirmation functionality to odometer
jakubkalinski0 Dec 23, 2025
7d3cff2
Prettier run
jakubkalinski0 Dec 23, 2025
28553f5
Added missing dependencies in attempt to fix react-compiler check
jakubkalinski0 Dec 23, 2025
401d39a
Attempt to fix react-compiler check nr 2
jakubkalinski0 Dec 23, 2025
f56c72d
Spellcheck fix
jakubkalinski0 Dec 23, 2025
a2541d1
Merge branch 'main' into jakubkalinski0/Create_NewDot_Odometer_expens…
jakubkalinski0 Dec 23, 2025
9cdeffb
Added missing PAY type
jakubkalinski0 Dec 23, 2025
deb334b
Merge branch 'main' into jakubkalinski0/Create_NewDot_Odometer_expens…
jakubkalinski0 Dec 23, 2025
1c682ec
Added spanish translation
jakubkalinski0 Dec 23, 2025
bdf3c4e
Remove unused translations
jakubkalinski0 Dec 23, 2025
9498e77
Added odometerStart and odometerEnd to getTrackExpenseInformationTran…
jakubkalinski0 Dec 23, 2025
ddc1d1c
Eslint check fix
jakubkalinski0 Dec 23, 2025
052ebca
Second eslint check fix
jakubkalinski0 Dec 23, 2025
2aa27e3
Fixing more of lint warnings and errors
jakubkalinski0 Dec 23, 2025
03f3bf5
Prettier run
jakubkalinski0 Dec 23, 2025
5389ed7
Fix typecheck fail
jakubkalinski0 Dec 23, 2025
a387ca2
Fix react compiler check
jakubkalinski0 Dec 23, 2025
ca6c090
Added translations
jakubkalinski0 Dec 23, 2025
d4f4e20
Merge branch 'main' into jakubkalinski0/Create_NewDot_Odometer_expens…
jakubkalinski0 Dec 23, 2025
fe7f38a
Merge main into jakubkalinski0/Create_NewDot_Odometer_expense_flow
Julesssss Jan 6, 2026
a1f0a3a
fix recognition of odometer quick action
Julesssss Jan 6, 2026
25d2fc3
optimisticly set odometer tab as most recent
Julesssss Jan 6, 2026
c7dddf6
remove unecessary computeReportName change
Julesssss Jan 6, 2026
4b43d42
remove unecessary null fallback
Julesssss Jan 6, 2026
9421c57
extract duplicated logic
Julesssss Jan 6, 2026
b732727
show odometer edit view from preview component
Julesssss Jan 6, 2026
e364b82
align odometer backTo logic with distance requests
Julesssss Jan 6, 2026
e07fc17
remove duplicated string from language files
Julesssss Jan 6, 2026
0869336
remove more null fallbacks
Julesssss Jan 6, 2026
b4ae629
fix codition for detecting manual distance requests, remove unused logic
Julesssss Jan 6, 2026
79e8c7b
remove unnecessary optimistic data protection
Julesssss Jan 6, 2026
15aa760
remove another unnecessary optional null
Julesssss Jan 6, 2026
7add61d
align submodule commit
Julesssss Jan 6, 2026
90ca4ea
dont show discard modal when editing odometer expense
Julesssss Jan 7, 2026
d55f79d
fix typescript issues, add missing translations back
Julesssss Jan 7, 2026
86e8c6c
remove now unused nav param
Julesssss Jan 7, 2026
1d8b577
revert complicated transactionChanges logic
Julesssss Jan 7, 2026
19728d1
improve transactionDistance calculation
Julesssss Jan 7, 2026
41282e8
improve english string naming
Julesssss Jan 7, 2026
5ea58ee
update other languages using pollygot parrot output
Julesssss Jan 7, 2026
286db57
Merge branch 'main' into jakub-odometerExpenseFlow
Julesssss Jan 7, 2026
9daf5a3
fix conflicts in translation files after merging main
Julesssss Jan 7, 2026
e99e8af
remove unused translation from some files
Julesssss Jan 7, 2026
2d0cd84
revert mobile-expensify submode to main
Julesssss Jan 7, 2026
5368398
remove unused string
Julesssss Jan 7, 2026
6a3173b
remove backTo workaround
Julesssss Jan 7, 2026
e0acf4c
remove dupe import to fix lint error
Julesssss Jan 7, 2026
d9ade69
various prettier and translation fixes
Julesssss Jan 7, 2026
5b71f11
eslint import fixes
Julesssss Jan 7, 2026
cabc1fd
multiple code improvements
Julesssss Jan 7, 2026
9d861a6
fix bug where participant selection page not shown
Julesssss Jan 7, 2026
7fb8488
hide the odometer tab, while development is ongoing
Julesssss Jan 7, 2026
e2837ff
removed outdated isEditingConfirmation with simpler condition
Julesssss Jan 8, 2026
5c7da37
edit odometer distance properly and fix typescript issue
Julesssss Jan 8, 2026
4a7515e
fix UI issue when updating odometer distance on confirm page
Julesssss Jan 8, 2026
fc48efb
fix style issue when editing odometer distance
Julesssss Jan 8, 2026
56d82ef
vastly simplify the back navigation logic
Julesssss Jan 8, 2026
8a4bcf5
use backTo more defensively
Julesssss Jan 8, 2026
817b517
further simplify the navigation handling
Julesssss Jan 8, 2026
a155760
Merge branch 'main' into jakub-odometerExpenseFlow
Julesssss Jan 8, 2026
bd786d6
update translations from the parrot
Julesssss Jan 8, 2026
fe2a52f
fix duplicate route
Julesssss Jan 8, 2026
53e82e4
remove Route type cast to fix eslint error
Julesssss Jan 8, 2026
4a1e38c
remove unused import again
Julesssss Jan 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2913,6 +2913,7 @@ const CONST = {
DISTANCE_MAP: 'distance-map',
DISTANCE_MANUAL: 'distance-manual',
DISTANCE_GPS: 'distance-gps',
DISTANCE_ODOMETER: 'distance-odometer',
},
EXPENSE_TYPE: {
DISTANCE: 'distance',
Expand All @@ -2924,7 +2925,9 @@ const CONST = {
DISTANCE_MAP: 'distance-map',
DISTANCE_MANUAL: 'distance-manual',
DISTANCE_GPS: 'distance-gps',
DISTANCE_ODOMETER: 'distance-odometer',
},

REPORT_ACTION_TYPE: {
PAY: 'pay',
CREATE: 'create',
Expand Down Expand Up @@ -5505,6 +5508,7 @@ const CONST = {
DISTANCE_MAP: 'distance-map',
DISTANCE_MANUAL: 'distance-manual',
DISTANCE_GPS: 'distance-gps',
DISTANCE_ODOMETER: 'distance-odometer',
},

STATUS_TEXT_MAX_LENGTH: 100,
Expand Down
16 changes: 16 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1175,6 +1175,17 @@ const ROUTES = {
return getUrlWithBackToParam(`${action as string}/${iouType as string}/distance-manual/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo);
},
},
MONEY_REQUEST_STEP_DISTANCE_ODOMETER: {
route: ':action/:iouType/distance-odometer/:transactionID/:reportID',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '') => {
Comment on lines +1179 to +1180

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Julesssss we shouldn't use backTo param in new implementation following the guideline

## How to remove backTo from URL
> [!WARNING]
> **Deprecated**: The `backTo` parameter is deprecated and should not be used in new implementations. Most problems that `backTo` solved can be resolved by adding one or more routes for a single screen. If you don't know how to solve your problem, contact someone from the navigation team. Old documentation on how to use `backTo` can be found below.

I think we should create another issue to remove the backTo param to avoid block the main implementaion

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Completely agree, will will handle this here.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Julesssss we shouldn't use backTo param in new implementation following the guideline

## How to remove backTo from URL
> [!WARNING]
> **Deprecated**: The `backTo` parameter is deprecated and should not be used in new implementations. Most problems that `backTo` solved can be resolved by adding one or more routes for a single screen. If you don't know how to solve your problem, contact someone from the navigation team. Old documentation on how to use `backTo` can be found below.

I think we should create another issue to remove the backTo param to avoid block the main implementaion

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Completely agree, being handled here

if (!transactionID || !reportID) {
Log.warn('Invalid transactionID or reportID is used to build the MONEY_REQUEST_STEP_DISTANCE_ODOMETER route');
}

// eslint-disable-next-line no-restricted-syntax -- Legacy route generation
return getUrlWithBackToParam(`${action as string}/${iouType as string}/distance-odometer/${transactionID}/${reportID}`, backTo);
},
},
MONEY_REQUEST_STEP_DISTANCE_RATE: {
route: ':action/:iouType/distanceRate/:transactionID/:reportID/:reportActionID?',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backTo = '', reportActionID?: string) => {
Expand Down Expand Up @@ -1294,6 +1305,11 @@ const ROUTES = {
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string | undefined, reportID: string | undefined, backToReport?: string) =>
`${action as string}/${iouType as string}/start/${transactionID}/${reportID}/distance-new${backToReport ? `/${backToReport}` : ''}/distance-gps` as const,
},
DISTANCE_REQUEST_CREATE_TAB_ODOMETER: {
route: 'distance-odometer',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backToReport?: string) =>
`${action as string}/${iouType as string}/start/${transactionID}/${reportID}/distance-new${backToReport ? `/${backToReport}` : ''}/distance-odometer` as const,
},
IOU_SEND_ADD_BANK_ACCOUNT: 'pay/new/add-bank-account',
IOU_SEND_ADD_DEBIT_CARD: 'pay/new/add-debit-card',
IOU_SEND_ENABLE_PAYMENTS: 'pay/new/enable-payments',
Expand Down
1 change: 1 addition & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,7 @@ const SCREENS = {
STEP_DISTANCE_MAP: 'Money_Request_Step_Distance_Map',
STEP_DISTANCE_MANUAL: 'Money_Request_Step_Distance_Manual',
STEP_DISTANCE_GPS: 'Money_Request_Step_Distance_GPS',
STEP_DISTANCE_ODOMETER: 'Money_Request_Step_Distance_Odometer',
RECEIPT_PREVIEW: 'Money_Request_Receipt_preview',
},

Expand Down
5 changes: 5 additions & 0 deletions src/components/MoneyRequestConfirmationList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,9 @@ type MoneyRequestConfirmationListProps = {
/** Whether the expense is a manual distance expense */
isManualDistanceRequest: boolean;

/** Whether the expense is an odometer distance expense */
isOdometerDistanceRequest?: boolean;

/** Whether the expense is a per diem expense */
isPerDiemRequest?: boolean;

Expand Down Expand Up @@ -213,6 +216,7 @@ function MoneyRequestConfirmationList({
iouAmount,
isDistanceRequest,
isManualDistanceRequest,
isOdometerDistanceRequest = false,
isPerDiemRequest = false,
isPolicyExpenseChat = false,
iouCategory = '',
Expand Down Expand Up @@ -1144,6 +1148,7 @@ function MoneyRequestConfirmationList({
isCategoryRequired={isCategoryRequired}
isDistanceRequest={isDistanceRequest}
isManualDistanceRequest={isManualDistanceRequest}
isOdometerDistanceRequest={isOdometerDistanceRequest}
isPerDiemRequest={isPerDiemRequest}
isMerchantEmpty={isMerchantEmpty}
isMerchantRequired={isMerchantRequired}
Expand Down
16 changes: 13 additions & 3 deletions src/components/MoneyRequestConfirmationListFooter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import CONST from '@src/CONST';
import type {IOUAction, IOUType} from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import type {Route} from '@src/ROUTES';
import type * as OnyxTypes from '@src/types/onyx';
import type {Attendee, Participant} from '@src/types/onyx/IOU';
import type {Unit} from '@src/types/onyx/Policy';
Expand Down Expand Up @@ -114,6 +115,9 @@ type MoneyRequestConfirmationListFooterProps = {
/** Flag indicating if it is a manual distance request */
isManualDistanceRequest: boolean;

/** Flag indicating if it is an odometer distance request */
isOdometerDistanceRequest?: boolean;

/** Flag indicating if it is a per diem request */
isPerDiemRequest: boolean;

Expand Down Expand Up @@ -231,6 +235,7 @@ function MoneyRequestConfirmationListFooter({
isCategoryRequired,
isDistanceRequest,
isManualDistanceRequest,
isOdometerDistanceRequest = false,
isPerDiemRequest,
isMerchantEmpty,
isMerchantRequired,
Expand Down Expand Up @@ -301,8 +306,8 @@ function MoneyRequestConfirmationListFooter({

const hasPendingWaypoints = transaction && isFetchingWaypointsFromServer(transaction);
const hasErrors = !isEmptyObject(transaction?.errors) || !isEmptyObject(transaction?.errorFields?.route) || !isEmptyObject(transaction?.errorFields?.waypoints);
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
const shouldShowMap = isDistanceRequest && !isManualDistanceRequest && !!(hasErrors || hasPendingWaypoints || iouType !== CONST.IOU.TYPE.SPLIT || !isReadOnly);
const shouldShowMap =
isDistanceRequest && !isManualDistanceRequest && !isOdometerDistanceRequest && [hasErrors, hasPendingWaypoints, iouType !== CONST.IOU.TYPE.SPLIT, !isReadOnly].some(Boolean);
const isFromGlobalCreate = !!transaction?.isFromGlobalCreate;

const senderWorkspace = useMemo(() => {
Expand Down Expand Up @@ -504,6 +509,11 @@ function MoneyRequestConfirmationListFooter({
return;
}

if (isOdometerDistanceRequest) {
Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DISTANCE_ODOMETER.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute()) as Route);
return;
}

Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_DISTANCE.getRoute(action, iouType, transactionID, reportID, Navigation.getActiveRoute(), reportActionID));
}}
disabled={didConfirm}
Expand Down Expand Up @@ -1031,7 +1041,7 @@ function MoneyRequestConfirmationListFooter({
<View style={styles.dividerLine} />
</>
)}
{(!shouldShowMap || isManualDistanceRequest) && (
{(!shouldShowMap || isManualDistanceRequest || isOdometerDistanceRequest) && (
<View style={!hasReceiptImageOrThumbnail && !showReceiptEmptyState ? undefined : styles.mv3}>
{hasReceiptImageOrThumbnail
? receiptThumbnailContent
Expand Down
17 changes: 16 additions & 1 deletion src/components/ReportActionItem/MoneyRequestView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ import {
isDistanceRequest as isDistanceRequestTransactionUtils,
isExpenseUnreported as isExpenseUnreportedTransactionUtils,
isManualDistanceRequest as isManualDistanceRequestTransactionUtils,
isOdometerDistanceRequest as isOdometerDistanceRequestTransactionUtils,
isPerDiemRequest as isPerDiemRequestTransactionUtils,
isScanning,
isTimeRequest as isTimeRequestTransactionUtils,
Expand Down Expand Up @@ -278,6 +279,7 @@ function MoneyRequestView({
transactionMerchant === '' || transactionMerchant === CONST.TRANSACTION.PARTIAL_TRANSACTION_MERCHANT || transactionMerchant === CONST.TRANSACTION.DEFAULT_MERCHANT;
const isDistanceRequest = isDistanceRequestTransactionUtils(transaction);
const isManualDistanceRequest = isManualDistanceRequestTransactionUtils(transaction, !!mergeTransactionID);
const isOdometerDistanceRequest = isOdometerDistanceRequestTransactionUtils(transaction);
const isMapDistanceRequest = isDistanceRequest && !isManualDistanceRequest;
const isTransactionScanning = isScanning(updatedTransaction ?? transaction);
const hasRoute = hasRouteTransactionUtils(transactionBackup ?? transaction, isDistanceRequest);
Expand Down Expand Up @@ -555,6 +557,19 @@ function MoneyRequestView({
return;
}

if (isOdometerDistanceRequest) {
Navigation.navigate(
ROUTES.MONEY_REQUEST_STEP_DISTANCE_ODOMETER.getRoute(
CONST.IOU.ACTION.EDIT,
iouType,
transaction.transactionID,
transactionThreadReport.reportID,
getReportRHPActiveRoute(),
),
);
return;
}

if (isManualDistanceRequest) {
Navigation.navigate(
ROUTES.MONEY_REQUEST_STEP_DISTANCE_MANUAL.getRoute(
Expand Down Expand Up @@ -834,7 +849,7 @@ function MoneyRequestView({
copyable={!!descriptionCopyValue}
/>
</OfflineWithFeedback>
{isManualDistanceRequest || (isMapDistanceRequest && transaction?.comment?.waypoints) ? (
{isManualDistanceRequest || isOdometerDistanceRequest || (isMapDistanceRequest && transaction?.comment?.waypoints) ? (
distanceRequestFields
) : (
<OfflineWithFeedback pendingAction={getPendingFieldAction('merchant')}>
Expand Down
18 changes: 17 additions & 1 deletion src/components/TabSelector/TabSelector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,21 @@ type IconTitleAndTestID = {
testID?: string;
};

const MEMOIZED_LAZY_TAB_SELECTOR_ICONS = ['CalendarSolid', 'UploadAlt', 'User', 'Car', 'Hashtag', 'Map', 'Pencil', 'ReceiptScan', 'Receipt', 'MoneyCircle', 'Percent', 'Crosshair'] as const;
const MEMOIZED_LAZY_TAB_SELECTOR_ICONS = [
'CalendarSolid',
'UploadAlt',
'User',
'Car',
'Hashtag',
'Map',
'Pencil',
'ReceiptScan',
'Receipt',
'MoneyCircle',
'Percent',
'Crosshair',
'Meter',
] as const;

function getIconTitleAndTestID(
icons: Record<TupleToUnion<typeof MEMOIZED_LAZY_TAB_SELECTOR_ICONS>, IconAsset>,
Expand Down Expand Up @@ -73,6 +87,8 @@ function getIconTitleAndTestID(
return {icon: icons.Pencil, title: translate('tabSelector.manual'), testID: 'distanceManual'};
case CONST.TAB_REQUEST.DISTANCE_GPS:
return {icon: icons.Crosshair, title: translate('tabSelector.gps'), testID: 'distanceGPS'};
case CONST.TAB_REQUEST.DISTANCE_ODOMETER:
return {icon: icons.Meter, title: translate('tabSelector.odometer'), testID: 'distanceOdometer'};
case CONST.TAB.SPLIT.AMOUNT:
return {icon: icons.MoneyCircle, title: translate('iou.amount'), testID: 'split-amount'};
case CONST.TAB.SPLIT.PERCENTAGE:
Expand Down
7 changes: 5 additions & 2 deletions src/hooks/useBeforeRemove.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@ import type {EventListenerCallback, EventMapCore, NavigationState} from '@react-
import {useEffect} from 'react';

// beforeRemove have some limitations. When the react-navigation is upgraded to 7.x, update this to use usePreventRemove hook.
const useBeforeRemove = (onBeforeRemove: EventListenerCallback<EventMapCore<NavigationState>, 'beforeRemove'>) => {
const useBeforeRemove = (onBeforeRemove: EventListenerCallback<EventMapCore<NavigationState>, 'beforeRemove'>, isEnabled = true) => {
const navigation = useNavigation();

useEffect(() => {
if (!isEnabled) {
return undefined;
}
const unsubscribe = navigation.addListener('beforeRemove', onBeforeRemove);
return unsubscribe;
}, [navigation, onBeforeRemove]);
}, [navigation, onBeforeRemove, isEnabled]);
};

export default useBeforeRemove;
13 changes: 4 additions & 9 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -956,15 +956,7 @@ const translations: TranslationDeepObject<typeof en> = {
subscription: 'Abonnement',
domains: 'Domänen',
},
tabSelector: {
chat: 'Chat',
room: 'Raum',
distance: 'Entfernung',
manual: 'Manuell',
scan: 'Scannen',
map: 'Karte',
gps: 'GPS',
},
tabSelector: {chat: 'Chat', room: 'Raum', distance: 'Entfernung', manual: 'Manuell', scan: 'Scannen', map: 'Karte', gps: 'GPS', odometer: 'Kilometerzähler'},
spreadsheet: {
upload: 'Eine Tabellenkalkulation hochladen',
import: 'Tabellenkalkulation importieren',
Expand Down Expand Up @@ -1292,6 +1284,8 @@ const translations: TranslationDeepObject<typeof en> = {
invalidRate: 'Satz für diesen Workspace ungültig. Bitte wählen Sie einen verfügbaren Satz aus dem Workspace aus.',
endDateBeforeStartDate: 'Das Enddatum darf nicht vor dem Startdatum liegen',
endDateSameAsStartDate: 'Das Enddatum darf nicht mit dem Startdatum identisch sein',
invalidReadings: 'Bitte geben Sie sowohl Anfangs- als auch Endstand ein',
negativeDistanceNotAllowed: 'Endablesung muss größer als Startablesung sein',
},
dismissReceiptError: 'Fehler ausblenden',
dismissReceiptErrorConfirmation: 'Achtung! Wenn du diesen Fehler verwirfst, wird dein hochgeladener Beleg vollständig entfernt. Bist du sicher?',
Expand Down Expand Up @@ -7104,6 +7098,7 @@ Fordere Spesendetails wie Belege und Beschreibungen an, lege Limits und Standard
error: {
selectSuggestedAddress: 'Bitte wählen Sie eine vorgeschlagene Adresse aus oder verwenden Sie den aktuellen Standort',
},
odometer: {startReading: 'Mit dem Lesen beginnen', endReading: 'Lesen beenden', saveForLater: 'Für später speichern', totalDistance: 'Gesamtdistanz'},
Comment thread
Julesssss marked this conversation as resolved.
},
reportCardLostOrDamaged: {
screenTitle: 'Zeugnis verloren oder beschädigt',
Expand Down
9 changes: 9 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -946,6 +946,7 @@ const translations = {
scan: 'Scan',
map: 'Map',
gps: 'GPS',
odometer: 'Odometer',
},
spreadsheet: {
upload: 'Upload a spreadsheet',
Expand Down Expand Up @@ -1242,6 +1243,8 @@ const translations = {
invalidTagLength: 'The tag name exceeds 255 characters. Please shorten it or choose a different tag.',
invalidAmount: 'Please enter a valid amount before continuing',
invalidDistance: 'Please enter a valid distance before continuing',
invalidReadings: 'Please enter both start and end readings',
negativeDistanceNotAllowed: 'End reading must be greater than start reading',
invalidIntegerAmount: 'Please enter a whole dollar amount before continuing',
invalidTaxAmount: ({amount}: RequestAmountParams) => `Maximum tax amount is ${amount}`,
invalidSplit: 'The sum of splits must equal the total amount',
Expand Down Expand Up @@ -6974,6 +6977,12 @@ const translations = {
error: {
selectSuggestedAddress: 'Please select a suggested address or use current location',
},
odometer: {
startReading: 'Start reading',
endReading: 'End reading',
saveForLater: 'Save for later',
totalDistance: 'Total distance',
},
},
gps: {
tooltip: "GPS tracking in progress! When you're done, stop tracking below.",
Expand Down
9 changes: 9 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -692,6 +692,7 @@ const translations: TranslationDeepObject<typeof en> = {
scan: 'Escanear',
map: 'Map',
gps: 'GPS',
odometer: 'Odómetro',
},
spreadsheet: {
upload: 'Importar',
Expand Down Expand Up @@ -989,6 +990,8 @@ const translations: TranslationDeepObject<typeof en> = {
invalidTagLength: 'La longitud de la etiqueta escogida excede el máximo permitido (255). Por favor, escoge otra etiqueta o acorta la etiqueta primero.',
invalidAmount: 'Por favor, ingresa un importe válido antes de continuar',
invalidDistance: 'Por favor, ingresa una distancia válida antes de continuar',
invalidReadings: 'Por favor ingrese ambas lecturas de inicio y fin',
negativeDistanceNotAllowed: 'La lectura final debe ser mayor que la lectura inicial',
invalidIntegerAmount: 'Por favor, introduce una cantidad entera en dólares antes de continuar',
invalidTaxAmount: ({amount}) => `El importe máximo del impuesto es ${amount}`,
invalidSplit: 'La suma de las partes debe ser igual al importe total',
Expand Down Expand Up @@ -7183,6 +7186,12 @@ ${amount} para ${merchant} - ${date}`,
error: {
selectSuggestedAddress: 'Por favor, selecciona una dirección sugerida o usa la ubicación actual',
},
odometer: {
startReading: 'Lectura inicial',
endReading: 'Lectura final',
saveForLater: 'Guardar para después',
totalDistance: 'Distancia total',
},
},
reportCardLostOrDamaged: {
screenTitle: 'Notificar la pérdida o deterioro de la tarjeta',
Expand Down
13 changes: 4 additions & 9 deletions src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -957,15 +957,7 @@ const translations: TranslationDeepObject<typeof en> = {
subscription: 'Abonnement',
domains: 'Domaines',
},
tabSelector: {
chat: 'Discussion',
room: 'Salle',
distance: 'Distance',
manual: 'Manuel',
scan: 'Scanner',
map: 'Carte',
gps: 'GPS',
},
tabSelector: {chat: 'Discussion', room: 'Salle', distance: 'Distance', manual: 'Manuel', scan: 'Scanner', map: 'Carte', gps: 'GPS', odometer: 'Compteur kilométrique'},
spreadsheet: {
upload: 'Téléverser une feuille de calcul',
import: 'Importer une feuille de calcul',
Expand Down Expand Up @@ -1294,6 +1286,8 @@ const translations: TranslationDeepObject<typeof en> = {
invalidRate: 'Taux non valide pour cet espace de travail. Veuillez sélectionner un taux disponible dans l’espace de travail.',
endDateBeforeStartDate: 'La date de fin ne peut pas être antérieure à la date de début',
endDateSameAsStartDate: 'La date de fin ne peut pas être identique à la date de début',
invalidReadings: 'Veuillez saisir les relevés de début et de fin',
negativeDistanceNotAllowed: 'La lecture de fin doit être supérieure à la lecture de début',
},
dismissReceiptError: 'Ignorer l’erreur',
dismissReceiptErrorConfirmation: 'Attention ! Ignorer cette erreur supprimera entièrement votre reçu téléchargé. Êtes-vous sûr ?',
Expand Down Expand Up @@ -7117,6 +7111,7 @@ Exigez des informations de dépense comme les reçus et les descriptions, défin
error: {
selectSuggestedAddress: 'Veuillez sélectionner une adresse suggérée ou utiliser la position actuelle',
},
odometer: {startReading: 'Commencer la lecture', endReading: 'Fin de lecture', saveForLater: 'Enregistrer pour plus tard', totalDistance: 'Distance totale'},
},
reportCardLostOrDamaged: {
screenTitle: 'Bulletin perdu ou endommagé',
Expand Down
Loading
Loading