From f6dd4c03c39d3a7e8ab4606efb36bf8eb8ec30a7 Mon Sep 17 00:00:00 2001 From: MaysWind Date: Sun, 10 Nov 2024 20:50:03 +0800 Subject: [PATCH] support custom tips in login page --- conf/ezbookkeeping.ini | 9 +++++++ pkg/api/server_settings.go | 25 +++++++++++++++++++ pkg/settings/setting.go | 43 +++++++++++++++++++++++++++++++++ src/lib/i18n.js | 15 ++++++++++++ src/lib/server_settings.js | 4 +++ src/views/desktop/LoginPage.vue | 7 +++++- src/views/mobile/LoginPage.vue | 10 +++++++- 7 files changed, 111 insertions(+), 2 deletions(-) diff --git a/conf/ezbookkeeping.ini b/conf/ezbookkeeping.ini index 893d283e..12adef01 100644 --- a/conf/ezbookkeeping.ini +++ b/conf/ezbookkeeping.ini @@ -242,6 +242,15 @@ enable_import = true # Maximum allowed import file size (1 - 4294967295 bytes) max_import_file_size = 10485760 +[tip] +# Set to true to display custom tips in login page +enable_tips_in_login_page = false + +# The custom tips displayed in login page, it supports multi-language configuration +# Add an underscore and a language tag after the setting key to configure the notification content in that language, the same below +# For example, login_page_tips_content_zh_hans means the notification content in Simplified Chinese +login_page_tips_content = + [notification] # Set to true to display custom notification in home page every time users register enable_notification_after_register = false diff --git a/pkg/api/server_settings.go b/pkg/api/server_settings.go index 6e16fac3..2afacb6e 100644 --- a/pkg/api/server_settings.go +++ b/pkg/api/server_settings.go @@ -41,6 +41,11 @@ func (a *ServerSettingsApi) ServerSettingsJavascriptHandler(c *core.WebContext) a.appendBooleanSetting(builder, "s", config.EnableScheduledTransaction) a.appendBooleanSetting(builder, "e", config.EnableDataExport) a.appendBooleanSetting(builder, "i", config.EnableDataImport) + + if config.LoginPageTips.Enabled { + a.appendMultiLanguageTipSetting(builder, "lpt", config.LoginPageTips) + } + a.appendStringSetting(builder, "m", config.MapProvider) if config.EnableMapDataFetchProxy && @@ -118,6 +123,26 @@ func (a *ServerSettingsApi) appendStringSetting(builder *strings.Builder, key st builder.WriteString(";\n") } +func (a *ServerSettingsApi) appendMultiLanguageTipSetting(builder *strings.Builder, key string, value settings.TipConfig) { + builder.WriteString(ezbookkeepingServerSettingsGlobalVariableFullName) + builder.WriteString("[") + a.appendEncodedString(builder, key) + builder.WriteString("]={\n") + + builder.WriteString("'default'") + builder.WriteRune(':') + a.appendEncodedString(builder, value.DefaultContent) + + for languageTag, content := range value.MultiLanguageContent { + builder.WriteString(",\n") + a.appendEncodedString(builder, languageTag) + builder.WriteRune(':') + a.appendEncodedString(builder, content) + } + + builder.WriteString("\n};\n") +} + func (a *ServerSettingsApi) appendBooleanSetting(builder *strings.Builder, key string, value bool) { builder.WriteString(ezbookkeepingServerSettingsGlobalVariableFullName) builder.WriteString("[") diff --git a/pkg/settings/setting.go b/pkg/settings/setting.go index 95e566e6..e3ac984f 100644 --- a/pkg/settings/setting.go +++ b/pkg/settings/setting.go @@ -181,6 +181,13 @@ type MinIOConfig struct { RootPath string } +// TipConfig represents a tip setting config +type TipConfig struct { + Enabled bool + DefaultContent string + MultiLanguageContent map[string]string +} + // NotificationConfig represents a notification setting config type NotificationConfig struct { Enabled bool @@ -289,6 +296,9 @@ type Config struct { EnableDataImport bool MaxImportFileSize uint32 + // Tip + LoginPageTips TipConfig + // Notification AfterRegisterNotification NotificationConfig AfterLoginNotification NotificationConfig @@ -408,6 +418,12 @@ func LoadConfiguration(configFilePath string) (*Config, error) { return nil, err } + err = loadTipConfiguration(config, cfgFile, "tip") + + if err != nil { + return nil, err + } + err = loadNotificationConfiguration(config, cfgFile, "notification") if err != nil { @@ -780,6 +796,12 @@ func loadDataConfiguration(config *Config, configFile *ini.File, sectionName str return nil } +func loadTipConfiguration(config *Config, configFile *ini.File, sectionName string) error { + config.LoginPageTips = getTipConfiguration(configFile, sectionName, "enable_tips_in_login_page", "login_page_tips_content") + + return nil +} + func loadNotificationConfiguration(config *Config, configFile *ini.File, sectionName string) error { config.AfterRegisterNotification = getNotificationConfiguration(configFile, sectionName, "enable_notification_after_register", "after_register_notification_content") config.AfterLoginNotification = getNotificationConfiguration(configFile, sectionName, "enable_notification_after_login", "after_login_notification_content") @@ -908,6 +930,27 @@ func getFinalPath(workingPath, p string) (string, error) { return p, err } +func getTipConfiguration(configFile *ini.File, sectionName string, enableKey string, contentKey string) TipConfig { + config := TipConfig{ + Enabled: getConfigItemBoolValue(configFile, sectionName, enableKey, false), + DefaultContent: getConfigItemStringValue(configFile, sectionName, contentKey, ""), + MultiLanguageContent: make(map[string]string), + } + + for languageTag := range locales.AllLanguages { + multiLanguageContentKey := strings.ToLower(languageTag) + multiLanguageContentKey = strings.Replace(multiLanguageContentKey, "-", "_", -1) + multiLanguageContentKey = contentKey + "_" + multiLanguageContentKey + content := getConfigItemStringValue(configFile, sectionName, multiLanguageContentKey, "") + + if content != "" { + config.MultiLanguageContent[languageTag] = content + } + } + + return config +} + func getNotificationConfiguration(configFile *ini.File, sectionName string, enableKey string, contentKey string) NotificationConfig { config := NotificationConfig{ Enabled: getConfigItemBoolValue(configFile, sectionName, enableKey, false), diff --git a/src/lib/i18n.js b/src/lib/i18n.js index a39e265e..8ce76941 100644 --- a/src/lib/i18n.js +++ b/src/lib/i18n.js @@ -1435,6 +1435,20 @@ function getCategorizedAccountsWithDisplayBalance(allVisibleAccounts, showAccoun return ret; } +function getServerTipContent(tipConfig, i18nGlobal) { + if (!tipConfig) { + return ''; + } + + const currentLanguage = getCurrentLanguageTag(i18nGlobal); + + if (tipConfig[currentLanguage]) { + return tipConfig[currentLanguage]; + } + + return tipConfig.default || ''; +} + function joinMultiText(textArray, translateFn) { if (!textArray || !textArray.length) { return ''; @@ -1707,6 +1721,7 @@ export function i18nFunctions(i18nGlobal) { getAllSupportedImportFileTypes: () => getAllSupportedImportFileTypes(i18nGlobal, i18nGlobal.t), getEnableDisableOptions: () => getEnableDisableOptions(i18nGlobal.t), getCategorizedAccountsWithDisplayBalance: (allVisibleAccounts, showAccountBalance, defaultCurrency, settingsStore, userStore, exchangeRatesStore) => getCategorizedAccountsWithDisplayBalance(allVisibleAccounts, showAccountBalance, defaultCurrency, userStore, settingsStore, exchangeRatesStore, i18nGlobal.t), + getServerTipContent: (tipConfig) => getServerTipContent(tipConfig, i18nGlobal), joinMultiText: (textArray) => joinMultiText(textArray, i18nGlobal.t), setLanguage: (locale, force) => setLanguage(i18nGlobal, locale, force), setTimeZone: (timezone) => setTimeZone(timezone), diff --git a/src/lib/server_settings.js b/src/lib/server_settings.js index 0584395d..73f0f94f 100644 --- a/src/lib/server_settings.js +++ b/src/lib/server_settings.js @@ -33,6 +33,10 @@ export function isDataImportingEnabled() { return getServerSetting('i') === 1; } +export function getLoginPageTips() { + return getServerSetting('lpt'); +} + export function getMapProvider() { return getServerSetting('m'); } diff --git a/src/views/desktop/LoginPage.vue b/src/views/desktop/LoginPage.vue index 7824fcef..1e1844f9 100644 --- a/src/views/desktop/LoginPage.vue +++ b/src/views/desktop/LoginPage.vue @@ -24,6 +24,7 @@

{{ $t('Welcome to ezBookkeeping') }}

{{ $t('Please log in with your ezBookkeeping account') }}

+

{{ tips }}

@@ -179,7 +180,8 @@ import apiConstants from '@/consts/api.js'; import { isUserRegistrationEnabled, isUserForgetPasswordEnabled, - isUserVerifyEmailEnabled + isUserVerifyEmailEnabled, + getLoginPageTips } from '@/lib/server_settings.js'; import { setExpenseAndIncomeAmountColor } from '@/lib/ui.js'; @@ -224,6 +226,9 @@ export default { isUserForgetPasswordEnabled() { return isUserForgetPasswordEnabled(); }, + tips() { + return this.$locale.getServerTipContent(getLoginPageTips()); + }, inputIsEmpty() { return !this.username || !this.password; }, diff --git a/src/views/mobile/LoginPage.vue b/src/views/mobile/LoginPage.vue index 46157180..a3adab05 100644 --- a/src/views/mobile/LoginPage.vue +++ b/src/views/mobile/LoginPage.vue @@ -5,6 +5,10 @@ + + {{ tips }} + +