From 607c1ddc48d0935d9bb9ec0628b7358671e80a73 Mon Sep 17 00:00:00 2001 From: MaysWind Date: Sun, 11 May 2025 23:50:18 +0800 Subject: [PATCH] show amount in default currency in transaction edit page / dialog when account currency is not default currency --- .../transactions/TransactionEditPageBase.ts | 32 +++++++++++++++++++ .../transactions/list/dialogs/EditDialog.vue | 3 +- src/views/mobile/transactions/EditPage.vue | 4 +-- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/views/base/transactions/TransactionEditPageBase.ts b/src/views/base/transactions/TransactionEditPageBase.ts index 6a9ed5fd..b5a296c9 100644 --- a/src/views/base/transactions/TransactionEditPageBase.ts +++ b/src/views/base/transactions/TransactionEditPageBase.ts @@ -26,6 +26,10 @@ import { isArray } from '@/lib/common.ts'; +import { + getExchangedAmountByRate +} from '@/lib/numeral.ts'; + import { getUtcOffsetByUtcOffsetMinutes, getTimezoneOffsetMinutes, @@ -165,6 +169,33 @@ export function useTransactionEditPageBase(type: TransactionEditPageType, initMo } }); + const sourceAmountTitle = computed(() => { + const sourceAccount = allAccountsMap.value[transaction.value.sourceAccountId]; + const amountName = tt(sourceAmountName.value); + + if (!sourceAccount || sourceAccount.currency === defaultCurrency.value || !transaction.value.sourceAmount || transaction.value.hideAmount) { + return amountName; + } + + const fromExchangeRate = exchangeRatesStore.latestExchangeRateMap[sourceAccount.currency]; + const toExchangeRate = exchangeRatesStore.latestExchangeRateMap[defaultCurrency.value]; + + if (!fromExchangeRate || !fromExchangeRate.rate || !toExchangeRate || !toExchangeRate.rate) { + return amountName; + } + + let amountInDefaultCurrency = getExchangedAmountByRate(transaction.value.sourceAmount, fromExchangeRate.rate, toExchangeRate.rate); + + if (!amountInDefaultCurrency) { + return amountName; + } + + amountInDefaultCurrency = Math.floor(amountInDefaultCurrency); + + const displayAmountInDefaultCurrency = getDisplayAmount(amountInDefaultCurrency, transaction.value.hideAmount, defaultCurrency.value); + return amountName + ` (${displayAmountInDefaultCurrency})`; + }); + const sourceAccountTitle = computed(() => { if (transaction.value.type === TransactionType.Expense || transaction.value.type === TransactionType.Income) { return 'Account'; @@ -404,6 +435,7 @@ export function useTransactionEditPageBase(type: TransactionEditPageType, initMo saveButtonTitle, cancelButtonTitle, sourceAmountName, + sourceAmountTitle, sourceAccountTitle, transferInAmountTitle, sourceAccountName, diff --git a/src/views/desktop/transactions/list/dialogs/EditDialog.vue b/src/views/desktop/transactions/list/dialogs/EditDialog.vue index bbc30826..e336db2b 100644 --- a/src/views/desktop/transactions/list/dialogs/EditDialog.vue +++ b/src/views/desktop/transactions/list/dialogs/EditDialog.vue @@ -104,7 +104,7 @@ :disabled="loading || submitting" :persistent-placeholder="true" :hide="transaction.hideAmount" - :label="tt(sourceAmountName)" + :label="sourceAmountTitle" :placeholder="tt(sourceAmountName)" :enable-formula="mode !== TransactionEditPageMode.View" v-model="transaction.sourceAmount"/> @@ -583,6 +583,7 @@ const { saveButtonTitle, cancelButtonTitle, sourceAmountName, + sourceAmountTitle, sourceAccountTitle, transferInAmountTitle, sourceAccountName, diff --git a/src/views/mobile/transactions/EditPage.vue b/src/views/mobile/transactions/EditPage.vue index 66fe242f..c6dda5f4 100644 --- a/src/views/mobile/transactions/EditPage.vue +++ b/src/views/mobile/transactions/EditPage.vue @@ -64,7 +64,7 @@ class="transaction-edit-amount" link="#" no-chevron :class="sourceAmountClass" - :header="tt(sourceAmountName)" + :header="sourceAmountTitle" :title="getDisplayAmount(transaction.sourceAmount, transaction.hideAmount, sourceAccountCurrency)" @click="showSourceAmountSheet = true" > @@ -570,7 +570,7 @@ const { canAddTransactionPicture, title, saveButtonTitle, - sourceAmountName, + sourceAmountTitle, sourceAccountTitle, transferInAmountTitle, sourceAccountName,