diff --git a/cmd/user_data.go b/cmd/user_data.go index b13b6d89..6ae1f2b6 100644 --- a/cmd/user_data.go +++ b/cmd/user_data.go @@ -2,14 +2,14 @@ package cmd import ( "fmt" - "github.com/mayswind/ezbookkeeping/pkg/errs" - "github.com/mayswind/ezbookkeeping/pkg/models" "os" "github.com/urfave/cli/v2" clis "github.com/mayswind/ezbookkeeping/pkg/cli" + "github.com/mayswind/ezbookkeeping/pkg/errs" "github.com/mayswind/ezbookkeeping/pkg/log" + "github.com/mayswind/ezbookkeeping/pkg/models" "github.com/mayswind/ezbookkeeping/pkg/utils" ) @@ -621,6 +621,7 @@ func printUserInfo(user *models.User) { fmt.Printf("[DecimalSeparator] %s (%d)\n", user.DecimalSeparator, user.DecimalSeparator) fmt.Printf("[DigitGroupingSymbol] %s (%d)\n", user.DigitGroupingSymbol, user.DigitGroupingSymbol) fmt.Printf("[DigitGrouping] %s (%d)\n", user.DigitGrouping, user.DigitGrouping) + fmt.Printf("[CurrencyDisplayType] %s (%d)\n", user.CurrencyDisplayType, user.CurrencyDisplayType) fmt.Printf("[Deleted] %t\n", user.Deleted) fmt.Printf("[EmailVerified] %t\n", user.EmailVerified) fmt.Printf("[CreatedAt] %s (%d)\n", utils.FormatUnixTimeToLongDateTimeInServerTimezone(user.CreatedUnixTime), user.CreatedUnixTime) diff --git a/pkg/api/users.go b/pkg/api/users.go index 28b9160a..dec95bbd 100644 --- a/pkg/api/users.go +++ b/pkg/api/users.go @@ -361,6 +361,14 @@ func (a *UsersApi) UserUpdateProfileHandler(c *core.Context) (any, *errs.Error) userNew.DigitGrouping = models.DIGIT_GROUPING_TYPE_INVALID } + if userUpdateReq.CurrencyDisplayType != nil && *userUpdateReq.CurrencyDisplayType != user.CurrencyDisplayType { + user.CurrencyDisplayType = *userUpdateReq.CurrencyDisplayType + userNew.CurrencyDisplayType = *userUpdateReq.CurrencyDisplayType + anythingUpdate = true + } else { + userNew.CurrencyDisplayType = models.CURRENCY_DISPLAY_TYPE_INVALID + } + if modifyUserLanguage || userNew.DecimalSeparator != models.DECIMAL_SEPARATOR_INVALID || userNew.DigitGroupingSymbol != models.DIGIT_GROUPING_SYMBOL_INVALID { decimalSeparator := userNew.DecimalSeparator digitGroupingSymbol := userNew.DigitGroupingSymbol diff --git a/pkg/models/currency.go b/pkg/models/currency.go new file mode 100644 index 00000000..e4be34f3 --- /dev/null +++ b/pkg/models/currency.go @@ -0,0 +1,45 @@ +package models + +import "fmt" + +// CurrencyDisplayType represents the display type of amount with currency +type CurrencyDisplayType byte + +// Currency Display Type +const ( + CURRENCY_DISPLAY_TYPE_DEFAULT CurrencyDisplayType = 0 + CURRENCY_DISPLAY_TYPE_NONE CurrencyDisplayType = 1 + CURRENCY_DISPLAY_TYPE_SYMBOL_BEFORE_AMOUNT CurrencyDisplayType = 2 + CURRENCY_DISPLAY_TYPE_SYMBOL_AFTER_AMOUNT CurrencyDisplayType = 3 + CURRENCY_DISPLAY_TYPE_CODE_BEFORE_AMOUNT CurrencyDisplayType = 4 + CURRENCY_DISPLAY_TYPE_CODE_AFTER_AMOUNT CurrencyDisplayType = 5 + CURRENCY_DISPLAY_TYPE_NAME_BEFORE_AMOUNT CurrencyDisplayType = 6 + CURRENCY_DISPLAY_TYPE_NAME_AFTER_AMOUNT CurrencyDisplayType = 7 + CURRENCY_DISPLAY_TYPE_INVALID CurrencyDisplayType = 255 +) + +// String returns a textual representation of the currency display type enum +func (d CurrencyDisplayType) String() string { + switch d { + case CURRENCY_DISPLAY_TYPE_DEFAULT: + return "Default" + case CURRENCY_DISPLAY_TYPE_NONE: + return "None" + case CURRENCY_DISPLAY_TYPE_SYMBOL_BEFORE_AMOUNT: + return "Symbol Before Amount" + case CURRENCY_DISPLAY_TYPE_SYMBOL_AFTER_AMOUNT: + return "Symbol After Amount" + case CURRENCY_DISPLAY_TYPE_CODE_BEFORE_AMOUNT: + return "Code Before Amount" + case CURRENCY_DISPLAY_TYPE_CODE_AFTER_AMOUNT: + return "Code After Amount" + case CURRENCY_DISPLAY_TYPE_NAME_BEFORE_AMOUNT: + return "Name Before Amount" + case CURRENCY_DISPLAY_TYPE_NAME_AFTER_AMOUNT: + return "Name After Amount" + case CURRENCY_DISPLAY_TYPE_INVALID: + return "Invalid" + default: + return fmt.Sprintf("Invalid(%d)", int(d)) + } +} diff --git a/pkg/models/user.go b/pkg/models/user.go index 69b5fb85..f0e7adce 100644 --- a/pkg/models/user.go +++ b/pkg/models/user.go @@ -67,6 +67,7 @@ type User struct { DecimalSeparator DecimalSeparator `xorm:"TINYINT"` DigitGroupingSymbol DigitGroupingSymbol `xorm:"TINYINT"` DigitGrouping DigitGroupingType `xorm:"TINYINT"` + CurrencyDisplayType CurrencyDisplayType `xorm:"TINYINT"` Disabled bool Deleted bool `xorm:"NOT NULL"` EmailVerified bool `xorm:"NOT NULL"` @@ -95,6 +96,7 @@ type UserBasicInfo struct { DecimalSeparator DecimalSeparator `json:"decimalSeparator"` DigitGroupingSymbol DigitGroupingSymbol `json:"digitGroupingSymbol"` DigitGrouping DigitGroupingType `json:"digitGrouping"` + CurrencyDisplayType CurrencyDisplayType `json:"currencyDisplayType"` EmailVerified bool `json:"emailVerified"` } @@ -151,6 +153,7 @@ type UserProfileUpdateRequest struct { DecimalSeparator *DecimalSeparator `json:"decimalSeparator" binding:"omitempty,min=0,max=3"` DigitGroupingSymbol *DigitGroupingSymbol `json:"digitGroupingSymbol" binding:"omitempty,min=0,max=4"` DigitGrouping *DigitGroupingType `json:"digitGrouping" binding:"omitempty,min=0,max=2"` + CurrencyDisplayType *CurrencyDisplayType `json:"currencyDisplayType" binding:"omitempty,min=0,max=7"` } // UserProfileUpdateResponse represents the data returns to frontend after updating profile @@ -178,6 +181,7 @@ type UserProfileResponse struct { DecimalSeparator DecimalSeparator `json:"decimalSeparator"` DigitGroupingSymbol DigitGroupingSymbol `json:"digitGroupingSymbol"` DigitGrouping DigitGroupingType `json:"digitGrouping"` + CurrencyDisplayType CurrencyDisplayType `json:"currencyDisplayType"` EmailVerified bool `json:"emailVerified"` LastLoginAt int64 `json:"lastLoginAt"` } @@ -244,6 +248,7 @@ func (u *User) ToUserBasicInfo() *UserBasicInfo { DecimalSeparator: u.DecimalSeparator, DigitGroupingSymbol: u.DigitGroupingSymbol, DigitGrouping: u.DigitGrouping, + CurrencyDisplayType: u.CurrencyDisplayType, EmailVerified: u.EmailVerified, } } @@ -268,6 +273,7 @@ func (u *User) ToUserProfileResponse() *UserProfileResponse { DecimalSeparator: u.DecimalSeparator, DigitGroupingSymbol: u.DigitGroupingSymbol, DigitGrouping: u.DigitGrouping, + CurrencyDisplayType: u.CurrencyDisplayType, EmailVerified: u.EmailVerified, LastLoginAt: u.LastLoginUnixTime, } diff --git a/pkg/services/users.go b/pkg/services/users.go index 9b9541ca..95a7a130 100644 --- a/pkg/services/users.go +++ b/pkg/services/users.go @@ -260,6 +260,10 @@ func (s *UserService) UpdateUser(c *core.Context, user *models.User, modifyUserL updateCols = append(updateCols, "digit_grouping") } + if models.CURRENCY_DISPLAY_TYPE_DEFAULT <= user.CurrencyDisplayType && user.CurrencyDisplayType <= models.CURRENCY_DISPLAY_TYPE_NAME_AFTER_AMOUNT { + updateCols = append(updateCols, "currency_display_type") + } + user.UpdatedUnixTime = now updateCols = append(updateCols, "updated_unix_time") diff --git a/src/consts/currency.js b/src/consts/currency.js index 3427a095..7bcc4d05 100644 --- a/src/consts/currency.js +++ b/src/consts/currency.js @@ -641,21 +641,103 @@ const allCurrencies = { } }; -const allCurrencyDisplayModes = { +const allCurrencyDisplaySymbol = { None: 0, Symbol: 1, Code: 2, Name: 3 }; +const allCurrencyDisplayLocation = { + BeforeAmount: 0, + AfterAmount: 1 +}; + +const allCurrencyDisplayType = { + None: { + type: 1, + name: 'None', + symbol: allCurrencyDisplaySymbol.None, + separator: '' + }, + SymbolBeforeAmount: { + type: 2, + name: 'Currency Symbol', + symbol: allCurrencyDisplaySymbol.Symbol, + location: allCurrencyDisplayLocation.BeforeAmount, + separator: ' ' + }, + SymbolAfterAmount: { + type: 3, + name: 'Currency Symbol', + symbol: allCurrencyDisplaySymbol.Symbol, + location: allCurrencyDisplayLocation.AfterAmount, + separator: ' ' + }, + CodeBeforeAmount: { + type: 4, + name: 'Currency Code', + symbol: allCurrencyDisplaySymbol.Code, + location: allCurrencyDisplayLocation.BeforeAmount, + separator: ' ' + }, + CodeAfterAmount: { + type: 5, + name: 'Currency Code', + symbol: allCurrencyDisplaySymbol.Code, + location: allCurrencyDisplayLocation.AfterAmount, + separator: ' ' + }, + NameBeforeAmount: { + type: 6, + name: 'Currency Name', + symbol: allCurrencyDisplaySymbol.Name, + location: allCurrencyDisplayLocation.BeforeAmount, + separator: ' ' + }, + NameAfterAmount: { + type: 7, + name: 'Currency Name', + symbol: allCurrencyDisplaySymbol.Name, + location: allCurrencyDisplayLocation.AfterAmount, + separator: ' ' + } +}; + +const allCurrencyDisplayTypeArray = [ + allCurrencyDisplayType.None, + allCurrencyDisplayType.SymbolBeforeAmount, + allCurrencyDisplayType.SymbolAfterAmount, + allCurrencyDisplayType.CodeBeforeAmount, + allCurrencyDisplayType.CodeAfterAmount, + allCurrencyDisplayType.NameBeforeAmount, + allCurrencyDisplayType.NameAfterAmount +]; + +const allCurrencyDisplayTypeMap = { + [allCurrencyDisplayType.None.type]: allCurrencyDisplayType.None, + [allCurrencyDisplayType.SymbolBeforeAmount.type]: allCurrencyDisplayType.SymbolBeforeAmount, + [allCurrencyDisplayType.SymbolAfterAmount.type]: allCurrencyDisplayType.SymbolAfterAmount, + [allCurrencyDisplayType.CodeBeforeAmount.type]: allCurrencyDisplayType.CodeBeforeAmount, + [allCurrencyDisplayType.CodeAfterAmount.type]: allCurrencyDisplayType.CodeAfterAmount, + [allCurrencyDisplayType.NameBeforeAmount.type]: allCurrencyDisplayType.NameBeforeAmount, + [allCurrencyDisplayType.NameAfterAmount.type]: allCurrencyDisplayType.NameAfterAmount +}; + const defaultCurrency = allCurrencies.USD.code; -const defaultCurrencyDisplayMode = allCurrencyDisplayModes.Symbol; +const defaultCurrencyDisplayType = allCurrencyDisplayType.SymbolBeforeAmount; +const defaultCurrencyDisplayTypeValue = 0; export default { parentAccountCurrencyPlaceholder: parentAccountCurrencyPlaceholder, defaultCurrencySymbol: defaultCurrencySymbol, all: allCurrencies, defaultCurrency: defaultCurrency, - allCurrencyDisplayModes: allCurrencyDisplayModes, - defaultCurrencyDisplayMode: defaultCurrencyDisplayMode + allCurrencyDisplaySymbol: allCurrencyDisplaySymbol, + allCurrencyDisplayLocation: allCurrencyDisplayLocation, + allCurrencyDisplayType: allCurrencyDisplayType, + allCurrencyDisplayTypeArray: allCurrencyDisplayTypeArray, + allCurrencyDisplayTypeMap: allCurrencyDisplayTypeMap, + defaultCurrencyDisplayType: defaultCurrencyDisplayType, + defaultCurrencyDisplayTypeValue: defaultCurrencyDisplayTypeValue }; diff --git a/src/lib/currency.js b/src/lib/currency.js new file mode 100644 index 00000000..131261fd --- /dev/null +++ b/src/lib/currency.js @@ -0,0 +1,46 @@ +import currencyConstants from '@/consts/currency.js'; + +import { isString, isNumber } from './common.js'; + +export function appendCurrencySymbol(value, currencyDisplayType, currencyCode, currencyName) { + if (!currencyDisplayType) { + return value; + } + + if (isNumber(value)) { + value = value.toString(); + } + + if (!isString(value)) { + return value; + } + + let symbol = ''; + let separator = currencyDisplayType.separator || ''; + + if (currencyDisplayType.symbol === currencyConstants.allCurrencyDisplaySymbol.Symbol) { + const currencyInfo = currencyConstants.all[currencyCode]; + + if (currencyInfo && currencyInfo.symbol) { + symbol = currencyInfo.symbol; + } else if (currencyInfo && currencyInfo.code) { + symbol = currencyInfo.code; + } + + if (!symbol) { + symbol = currencyConstants.defaultCurrencySymbol; + } + } else if (currencyDisplayType.symbol === currencyConstants.allCurrencyDisplaySymbol.Code) { + symbol = currencyCode; + }else if (currencyDisplayType.symbol === currencyConstants.allCurrencyDisplaySymbol.Name) { + symbol = currencyName; + } + + if (currencyDisplayType.location === currencyConstants.allCurrencyDisplayLocation.BeforeAmount) { + return `${symbol}${separator}${value}`; + } else if (currencyDisplayType.location === currencyConstants.allCurrencyDisplayLocation.AfterAmount) { + return `${value}${separator}${symbol}`; + } else { + return value; + } +} diff --git a/src/lib/i18n.js b/src/lib/i18n.js index 816f587d..0fdf3595 100644 --- a/src/lib/i18n.js +++ b/src/lib/i18n.js @@ -45,6 +45,10 @@ import { getAdaptiveDisplayAmountRate } from './numeral.js'; +import { + appendCurrencySymbol +} from './currency.js'; + import { getCategorizedAccounts, getAllFilteredAccountsBalance @@ -852,6 +856,42 @@ function getAllDigitGroupingTypes(translateFn) { return ret; } +function getAllCurrencyDisplayTypes(userStore, settingsStore, translateFn) { + const defaultCurrencyDisplayTypeName = translateFn('default.currencyDisplayType'); + let defaultCurrencyDisplayType = currency.allCurrencyDisplayType[defaultCurrencyDisplayTypeName]; + + if (!defaultCurrencyDisplayType) { + defaultCurrencyDisplayType = currency.defaultCurrencyDisplayType; + } + + const defaultCurrency = userStore.currentUserDefaultCurrency; + + const ret = []; + const defaultSampleValue = getFormatedAmountWithCurrency(12345, defaultCurrency, translateFn, userStore, settingsStore, false, defaultCurrencyDisplayType); + + ret.push({ + type: currency.defaultCurrencyDisplayTypeValue, + displayName: `${translateFn('Language Default')} (${defaultSampleValue})` + }); + + for (let i = 0; i < currency.allCurrencyDisplayTypeArray.length; i++) { + const type = currency.allCurrencyDisplayTypeArray[i]; + let displayName = translateFn(type.name); + + if (type.symbol !== currency.allCurrencyDisplaySymbol.None) { + const sampleValue = getFormatedAmountWithCurrency(12345, defaultCurrency, translateFn, userStore, settingsStore, false, type); + displayName = `${displayName} (${sampleValue})` + } + + ret.push({ + type: type.type, + displayName: displayName + }); + } + + return ret; +} + function getCurrentDecimalSeparator(translateFn, decimalSeparator) { let decimalSeparatorType = numeral.allDecimalSeparatorMap[decimalSeparator]; @@ -920,7 +960,7 @@ function getFormatedAmount(value, translateFn, userStore) { return formatAmount(value, numberFormatOptions); } -function getFormatedAmountWithCurrency(value, currencyCode, translateFn, userStore, settingsStore, notConvertValue) { +function getFormatedAmountWithCurrency(value, currencyCode, translateFn, userStore, settingsStore, notConvertValue, currencyDisplayType) { if (!isNumber(value) && !isString(value)) { return value; } @@ -950,30 +990,25 @@ function getFormatedAmountWithCurrency(value, currencyCode, translateFn, userSto currencyCode = ''; } - const currencyDisplayMode = settingsStore.appSettings.currencyDisplayMode; - - if (currencyCode && currencyDisplayMode === currency.allCurrencyDisplayModes.Symbol) { - const currencyInfo = currency.all[currencyCode]; - let currencySymbol = currency.defaultCurrencySymbol; - - if (currencyInfo && currencyInfo.symbol) { - currencySymbol = currencyInfo.symbol; - } else if (currencyInfo && currencyInfo.code) { - currencySymbol = currencyInfo.code; - } - - return translateFn('format.currency.symbol', { - amount: value, - symbol: currencySymbol - }); - } else if (currencyCode && currencyDisplayMode === currency.allCurrencyDisplayModes.Code) { - return `${value} ${currencyCode}`; - } else if (currencyCode && currencyDisplayMode === currency.allCurrencyDisplayModes.Name) { - const currencyName = getCurrencyName(currencyCode, translateFn); - return `${value} ${currencyName}`; - } else { + if (!currencyCode) { return value; } + + if (!currencyDisplayType) { + currencyDisplayType = currency.allCurrencyDisplayTypeMap[userStore.currentUserCurrencyDisplayType]; + + if (!currencyDisplayType) { + const defaultCurrencyDisplayTypeName = translateFn('default.currencyDisplayType'); + currencyDisplayType = currency.allCurrencyDisplayType[defaultCurrencyDisplayTypeName]; + } + + if (!currencyDisplayType) { + currencyDisplayType = currency.defaultCurrencyDisplayType; + } + } + + const currencyName = getCurrencyName(currencyCode, translateFn); + return appendCurrencySymbol(value, currencyDisplayType, currencyCode, currencyName); } function getFormatedExchangeRateAmount(value, translateFn, userStore) { @@ -1534,6 +1569,7 @@ export function i18nFunctions(i18nGlobal) { getAllDecimalSeparators: () => getAllDecimalSeparators(i18nGlobal.t), getAllDigitGroupingSymbols: () => getAllDigitGroupingSymbols(i18nGlobal.t), getAllDigitGroupingTypes: () => getAllDigitGroupingTypes(i18nGlobal.t), + getAllCurrencyDisplayTypes: (settingsStore, userStore) => getAllCurrencyDisplayTypes(userStore, settingsStore, i18nGlobal.t), getCurrentDecimalSeparator: (userStore) => getCurrentDecimalSeparator(i18nGlobal.t, userStore.currentUserDecimalSeparator), getCurrentDigitGroupingSymbol: (userStore) => getCurrentDigitGroupingSymbol(i18nGlobal.t, userStore.currentUserDigitGroupingSymbol), getCurrentDigitGroupingType: (userStore) => getCurrentDigitGroupingType(i18nGlobal.t, userStore.currentUserDigitGrouping), diff --git a/src/lib/services.js b/src/lib/services.js index 80514028..2bab78a5 100644 --- a/src/lib/services.js +++ b/src/lib/services.js @@ -169,7 +169,7 @@ export default { getProfile: () => { return axios.get('v1/users/profile/get.json'); }, - updateProfile: ({ email, nickname, password, oldPassword, defaultAccountId, transactionEditScope, language, defaultCurrency, firstDayOfWeek, longDateFormat, shortDateFormat, longTimeFormat, shortTimeFormat, decimalSeparator, digitGroupingSymbol, digitGrouping }) => { + updateProfile: ({ email, nickname, password, oldPassword, defaultAccountId, transactionEditScope, language, defaultCurrency, firstDayOfWeek, longDateFormat, shortDateFormat, longTimeFormat, shortTimeFormat, decimalSeparator, digitGroupingSymbol, digitGrouping, currencyDisplayType }) => { return axios.post('v1/users/profile/update.json', { email, nickname, @@ -186,7 +186,8 @@ export default { shortTimeFormat, decimalSeparator, digitGroupingSymbol, - digitGrouping + digitGrouping, + currencyDisplayType }); }, resendVerifyEmailByLoginedUser: () => { diff --git a/src/lib/settings.js b/src/lib/settings.js index ea0f39eb..febb0ac8 100644 --- a/src/lib/settings.js +++ b/src/lib/settings.js @@ -1,4 +1,3 @@ -import currencyConstants from '@/consts/currency.js'; import timezoneConstants from '@/consts/timezone.js'; import statisticsConstants from '@/consts/statistics.js'; @@ -13,7 +12,6 @@ const defaultSettings = { applicationLockWebAuthn: false, autoUpdateExchangeRatesData: true, autoGetCurrentGeoLocation: false, - currencyDisplayMode: currencyConstants.defaultCurrencyDisplayMode, showAmountInHomePage: true, timezoneUsedForStatisticsInHomePage: timezoneConstants.defaultTimezoneTypesUsedForStatistics, itemsCountInTransactionListPage: 15, @@ -166,14 +164,6 @@ export function setAutoGetCurrentGeoLocation(value) { setOption('autoGetCurrentGeoLocation', value); } -export function getCurrencyDisplayMode() { - return getOption('currencyDisplayMode'); -} - -export function setCurrencyDisplayMode(value) { - setOption('currencyDisplayMode', value); -} - export function isShowAmountInHomePage() { return getOption('showAmountInHomePage'); } diff --git a/src/locales/en.js b/src/locales/en.js index 11597502..536c412e 100644 --- a/src/locales/en.js +++ b/src/locales/en.js @@ -13,7 +13,8 @@ export default { 'shortTimeFormat': 'HHMMA', 'decimalSeparator': 'Dot', 'digitGroupingSymbol': 'Comma', - 'digitGrouping': 'ThousandsSeparator' + 'digitGrouping': 'ThousandsSeparator', + 'currencyDisplayType': 'SymbolBeforeAmount' // see allCurrencyDisplayType @ currency.js }, 'format': { // The type of date or time format is moment format, ref: https://momentjs.com/docs/#/displaying/ 'longDate': { @@ -66,9 +67,6 @@ export default { 'a_hh_mm': 'A hh:mm', 'hh_mm_a': 'hh:mm A' }, - 'currency': { - 'symbol': '{symbol} {amount}' - }, 'misc': { 'multiTextJoinSeparator': ', ', 'hoursBehindDefaultTimezone': '{hours} hour(s) behind default timezone', diff --git a/src/locales/zh_Hans.js b/src/locales/zh_Hans.js index e9b2cb43..8f555aa2 100644 --- a/src/locales/zh_Hans.js +++ b/src/locales/zh_Hans.js @@ -13,7 +13,8 @@ export default { 'shortTimeFormat': 'HHMM', 'decimalSeparator': 'Dot', 'digitGroupingSymbol': 'Comma', - 'digitGrouping': 'ThousandsSeparator' + 'digitGrouping': 'ThousandsSeparator', + 'currencyDisplayType': 'SymbolBeforeAmount' }, 'format': { 'longDate': { @@ -66,9 +67,6 @@ export default { 'a_hh_mm': 'A hh:mm', 'hh_mm_a': 'hh:mm A' }, - 'currency': { - 'symbol': '{symbol} {amount}' - }, 'misc': { 'multiTextJoinSeparator': '、', 'hoursBehindDefaultTimezone': '比默认时区晚{hours}小时', diff --git a/src/stores/index.js b/src/stores/index.js index 52c9458b..b8f203d3 100644 --- a/src/stores/index.js +++ b/src/stores/index.js @@ -383,7 +383,8 @@ export const useRootStore = defineStore('root', { shortTimeFormat: profile.shortTimeFormat, decimalSeparator: profile.decimalSeparator, digitGroupingSymbol: profile.digitGroupingSymbol, - digitGrouping: profile.digitGrouping + digitGrouping: profile.digitGrouping, + currencyDisplayType: profile.currencyDisplayType }).then(response => { const data = response.data; diff --git a/src/stores/setting.js b/src/stores/setting.js index 25ec79d0..6dacc905 100644 --- a/src/stores/setting.js +++ b/src/stores/setting.js @@ -14,7 +14,6 @@ export const useSettingsStore = defineStore('settings', { applicationLockWebAuthn: settings.isEnableApplicationLockWebAuthn(), autoUpdateExchangeRatesData: settings.isAutoUpdateExchangeRatesData(), autoGetCurrentGeoLocation: settings.isAutoGetCurrentGeoLocation(), - currencyDisplayMode: settings.getCurrencyDisplayMode(), showAmountInHomePage: settings.isShowAmountInHomePage(), timezoneUsedForStatisticsInHomePage: settings.getTimezoneUsedForStatisticsInHomePage(), itemsCountInTransactionListPage: settings.getItemsCountInTransactionListPage(), @@ -67,10 +66,6 @@ export const useSettingsStore = defineStore('settings', { settings.setAutoGetCurrentGeoLocation(value); this.appSettings.autoGetCurrentGeoLocation = value; }, - setCurrencyDisplayMode(value) { - settings.setCurrencyDisplayMode(value); - this.appSettings.currencyDisplayMode = value; - }, setShowAmountInHomePage(value) { settings.setShowAmountInHomePage(value); this.appSettings.showAmountInHomePage = value; diff --git a/src/stores/user.js b/src/stores/user.js index 2aa05d4c..c1ddffa8 100644 --- a/src/stores/user.js +++ b/src/stores/user.js @@ -65,6 +65,10 @@ export const useUserStore = defineStore('user', { currentUserDigitGrouping(state) { const userInfo = state.currentUserInfo || {}; return userInfo.digitGrouping; + }, + currentUserCurrencyDisplayType(state) { + const userInfo = state.currentUserInfo || {}; + return userInfo.currencyDisplayType; } }, actions: { diff --git a/src/views/desktop/app/settings/tabs/AppBasicSettingTab.vue b/src/views/desktop/app/settings/tabs/AppBasicSettingTab.vue index d4c5caf1..413f3b70 100644 --- a/src/views/desktop/app/settings/tabs/AppBasicSettingTab.vue +++ b/src/views/desktop/app/settings/tabs/AppBasicSettingTab.vue @@ -47,23 +47,6 @@ /> - - - - + + + + @@ -303,7 +316,8 @@ export default { shortTimeFormat: 0, decimalSeparator: 0, digitGroupingSymbol: 0, - digitGrouping: 0 + digitGrouping: 0, + currencyDisplayType: 0 }, oldProfile: { email: '', @@ -319,7 +333,8 @@ export default { shortTimeFormat: 0, decimalSeparator: 0, digitGroupingSymbol: 0, - digitGrouping: 0 + digitGrouping: 0, + currencyDisplayType: 0 }, emailVerified: false, loading: true, @@ -371,6 +386,9 @@ export default { allDigitGroupingTypes() { return this.$locale.getAllDigitGroupingTypes(); }, + allCurrencyDisplayTypes() { + return this.$locale.getAllCurrencyDisplayTypes(this.settingsStore, this.userStore); + }, allTransactionEditScopeTypes() { return this.$locale.getAllTransactionEditScopeTypes(); }, @@ -405,7 +423,8 @@ export default { this.newProfile.shortTimeFormat === this.oldProfile.shortTimeFormat && this.newProfile.decimalSeparator === this.oldProfile.decimalSeparator && this.newProfile.digitGroupingSymbol === this.oldProfile.digitGroupingSymbol && - this.newProfile.digitGrouping === this.oldProfile.digitGrouping) { + this.newProfile.digitGrouping === this.oldProfile.digitGrouping && + this.newProfile.currencyDisplayType === this.oldProfile.currencyDisplayType) { return 'Nothing has been modified'; } else { return null; @@ -535,6 +554,7 @@ export default { this.oldProfile.decimalSeparator = profile.decimalSeparator; this.oldProfile.digitGroupingSymbol = profile.digitGroupingSymbol; this.oldProfile.digitGrouping = profile.digitGrouping; + this.oldProfile.currencyDisplayType = profile.currencyDisplayType; this.newProfile.email = this.oldProfile.email this.newProfile.nickname = this.oldProfile.nickname; @@ -550,6 +570,7 @@ export default { this.newProfile.decimalSeparator = this.oldProfile.decimalSeparator; this.newProfile.digitGroupingSymbol = this.oldProfile.digitGroupingSymbol; this.newProfile.digitGrouping = this.oldProfile.digitGrouping; + this.newProfile.currencyDisplayType = this.oldProfile.currencyDisplayType; } } }; diff --git a/src/views/mobile/SettingsPage.vue b/src/views/mobile/SettingsPage.vue index d7bdca1c..7c2cb9c9 100644 --- a/src/views/mobile/SettingsPage.vue +++ b/src/views/mobile/SettingsPage.vue @@ -47,18 +47,6 @@ - - - - {{ $t('Show Account Balance') }} @@ -90,7 +78,6 @@ import { useOverviewStore } from '@/stores/overview.js'; import { useStatisticsStore } from '@/stores/statistics.js'; import { useExchangeRatesStore } from '@/stores/exchangeRates.js'; -import currencyConstants from '@/consts/currency.js'; import { getDesktopVersionPath } from '@/lib/version.js'; export default { @@ -116,9 +103,6 @@ export default { allTimezones() { return this.$locale.getAllTimezones(true); }, - allCurrencyDisplayModes() { - return currencyConstants.allCurrencyDisplayModes; - }, currentNickName() { return this.userStore.currentUserNickname || this.$t('User'); }, @@ -160,14 +144,6 @@ export default { isEnableApplicationLock() { return this.settingsStore.appSettings.applicationLock; }, - currencyDisplayMode: { - get: function () { - return this.settingsStore.appSettings.currencyDisplayMode; - }, - set: function (value) { - this.settingsStore.setCurrencyDisplayMode(value); - } - }, showAccountBalance: { get: function () { return this.settingsStore.appSettings.showAccountBalance; diff --git a/src/views/mobile/users/UserProfilePage.vue b/src/views/mobile/users/UserProfilePage.vue index 511e97ae..97de99c4 100644 --- a/src/views/mobile/users/UserProfilePage.vue +++ b/src/views/mobile/users/UserProfilePage.vue @@ -245,6 +245,19 @@ + + + + @@ -303,7 +316,8 @@ export default { shortTimeFormat: 0, decimalSeparator: 0, digitGroupingSymbol: 0, - digitGrouping: 0 + digitGrouping: 0, + currencyDisplayType: 0 }, oldProfile: { email: '', @@ -319,7 +333,8 @@ export default { shortTimeFormat: 0, decimalSeparator: 0, digitGroupingSymbol: 0, - digitGrouping: 0 + digitGrouping: 0, + currencyDisplayType: 0 }, emailVerified: false, currentPassword: '', @@ -373,6 +388,9 @@ export default { allDigitGroupingTypes() { return this.$locale.getAllDigitGroupingTypes(); }, + allCurrencyDisplayTypes() { + return this.$locale.getAllCurrencyDisplayTypes(this.settingsStore, this.userStore); + }, allTransactionEditScopeTypes() { return this.$locale.getAllTransactionEditScopeTypes(); }, @@ -420,7 +438,8 @@ export default { this.newProfile.shortTimeFormat === this.oldProfile.shortTimeFormat && this.newProfile.decimalSeparator === this.oldProfile.decimalSeparator && this.newProfile.digitGroupingSymbol === this.oldProfile.digitGroupingSymbol && - this.newProfile.digitGrouping === this.oldProfile.digitGrouping) { + this.newProfile.digitGrouping === this.oldProfile.digitGrouping && + this.newProfile.currencyDisplayType === this.oldProfile.currencyDisplayType) { return 'Nothing has been modified'; } else if (!this.newProfile.password && this.newProfile.confirmPassword) { return 'Password cannot be blank'; @@ -572,6 +591,7 @@ export default { this.oldProfile.decimalSeparator = profile.decimalSeparator; this.oldProfile.digitGroupingSymbol = profile.digitGroupingSymbol; this.oldProfile.digitGrouping = profile.digitGrouping; + this.oldProfile.currencyDisplayType = profile.currencyDisplayType; this.newProfile.email = this.oldProfile.email this.newProfile.nickname = this.oldProfile.nickname; @@ -587,6 +607,7 @@ export default { this.newProfile.decimalSeparator = this.oldProfile.decimalSeparator; this.newProfile.digitGroupingSymbol = this.oldProfile.digitGroupingSymbol; this.newProfile.digitGrouping = this.oldProfile.digitGrouping; + this.newProfile.currencyDisplayType = this.oldProfile.currencyDisplayType; } } };