diff --git a/src/Mobile.vue b/src/Mobile.vue index 5aedbb47..86933f9a 100644 --- a/src/Mobile.vue +++ b/src/Mobile.vue @@ -225,6 +225,15 @@ i.icon.la, i.icon.las, i.icon.lab { color: var(--f7-input-error-text-color) } +.skeleton-text .list-item-toggle .item-after { + height: var(--f7-toggle-height); +} + +.skeleton-text .list-item-toggle .item-after > span { + line-height: var(--f7-toggle-height); + font-size: var(--f7-toggle-height); +} + .no-sortable > .sortable-handler { display: none; } diff --git a/src/filters/format.js b/src/filters/format.js new file mode 100644 index 00000000..177ee20c --- /dev/null +++ b/src/filters/format.js @@ -0,0 +1,3 @@ +export default function (value, format) { + return format.replaceAll(/#{value}/g, value); +} diff --git a/src/filters/languageName.js b/src/filters/languageName.js new file mode 100644 index 00000000..287a1013 --- /dev/null +++ b/src/filters/languageName.js @@ -0,0 +1,11 @@ +import { allLanguages } from '../locales/index.js'; + +export default function (languageCode) { + const lang = allLanguages[languageCode]; + + if (!lang) { + return ''; + } + + return lang.displayName; +} diff --git a/src/filters/optionName.js b/src/filters/optionName.js new file mode 100644 index 00000000..0cc05adb --- /dev/null +++ b/src/filters/optionName.js @@ -0,0 +1,27 @@ +import utils from '../lib/utils.js'; + +export default function (value, options, keyName, valueName) { + if (utils.isArray(options)) { + for (let i = 0; i < options.length; i++) { + const option = options[i]; + + if (option[keyName] === value) { + return option[valueName]; + } + } + } else if (utils.isObject(options)) { + for (let key in options) { + if (!Object.prototype.hasOwnProperty.call(options, key)) { + continue; + } + + const option = options[key]; + + if (option[keyName] === value) { + return option[valueName]; + } + } + } + + return ''; +} diff --git a/src/locales/en.js b/src/locales/en.js index 1a9eaca2..69c65011 100644 --- a/src/locales/en.js +++ b/src/locales/en.js @@ -766,6 +766,7 @@ export default { 'Account Type': 'Account Type', 'Account Name': 'Account Name', 'Your account name': 'Your account name', + 'Sub Account': 'Sub Account', 'Sub Account Name': 'Sub Account Name', 'Your sub account name': 'Your sub account name', 'Account Icon': 'Account Icon', diff --git a/src/locales/zh_Hans.js b/src/locales/zh_Hans.js index b7fb3d41..89913654 100644 --- a/src/locales/zh_Hans.js +++ b/src/locales/zh_Hans.js @@ -766,6 +766,7 @@ export default { 'Account Type': '账户类型', 'Account Name': '账户名称', 'Your account name': '你的账户名称', + 'Sub Account': '子账户', 'Sub Account Name': '子账户名称', 'Your sub account name': '你的子账户名称', 'Account Icon': '账户图标', diff --git a/src/mobile-main.js b/src/mobile-main.js index ed5eeff7..1274789f 100644 --- a/src/mobile-main.js +++ b/src/mobile-main.js @@ -72,7 +72,10 @@ import stores from './store/index.js'; import localizedFilter from './filters/localized.js'; import momentFilter from './filters/moment.js'; import percentFilter from './filters/percent.js'; +import formatFilter from './filters/format.js'; +import optionNameFilter from './filters/optionName.js'; import itemFieldContentFilter from './filters/itemFieldContent.js'; +import languageNameFilter from './filters/languageName.js'; import currencyFilter from './filters/currency.js'; import utcOffsetFilter from './filters/utcOffset.js'; import textLimitFilter from './filters/textLimit.js'; @@ -157,7 +160,10 @@ Vue.component('TransactionTagSelectionSheet', TransactionTagSelectionSheet); Vue.filter('localized', (value, options) => localizedFilter({ i18n }, value, options)); Vue.filter('moment', (value, format, options) => momentFilter(value, format, options)); Vue.filter('percent', (value, precision, lowPrecisionValue) => percentFilter(value, precision, lowPrecisionValue)); +Vue.filter('format', (value, format) => formatFilter(value, format)); +Vue.filter('optionName', (value, options, keyName, valueName) => optionNameFilter(value, options, keyName, valueName)); Vue.filter('itemFieldContent', (value, fieldName, defaultValue, translate) => itemFieldContentFilter({ i18n }, value, fieldName, defaultValue, translate)); +Vue.filter('languageName', (languageCode) => languageNameFilter(languageCode)); Vue.filter('currency', (value, currencyCode) => currencyFilter({ i18n }, value, currencyCode)); Vue.filter('utcOffset', (value) => utcOffsetFilter(value)); Vue.filter('textLimit', (value, maxLength) => textLimitFilter(value, maxLength)); diff --git a/src/views/mobile/Signup.vue b/src/views/mobile/Signup.vue index c04e8d9c..4cf6aff5 100644 --- a/src/views/mobile/Signup.vue +++ b/src/views/mobile/Signup.vue @@ -70,9 +70,11 @@ @@ -151,12 +169,39 @@ export default { allWeekDays() { return this.$constants.datetime.allWeekDays; }, + allTransactionEditScopeTypes() { + return [{ + value: 0, + name: 'None' + },{ + value: 1, + name: 'All' + },{ + value: 2, + name: 'Today or later' + },{ + value: 3, + name: 'Recent 24 hours or later' + },{ + value: 4, + name: 'This week or later' + },{ + value: 5, + name: 'This month or later' + },{ + value: 6, + name: 'This year or later' + }]; + }, inputIsNotChanged() { return !!this.inputIsNotChangedProblemMessage; }, inputIsInvalid() { return !!this.inputInvalidProblemMessage; }, + extendInputIsInvalid() { + return !!this.extendInputInvalidProblemMessage; + }, inputIsNotChangedProblemMessage() { if (!this.newProfile.password && !this.newProfile.confirmPassword && !this.newProfile.email && !this.newProfile.nickname) { return 'Nothing has been modified'; @@ -187,6 +232,13 @@ export default { } else { return null; } + }, + extendInputInvalidProblemMessage() { + if (!this.newProfile.defaultCurrency) { + return 'Default currency cannot be empty'; + } else { + return null; + } } }, created() { @@ -227,7 +279,7 @@ export default { self.showInputPasswordSheet = false; - let problemMessage = self.inputIsNotChangedProblemMessage || self.inputInvalidProblemMessage; + let problemMessage = self.inputIsNotChangedProblemMessage || self.inputInvalidProblemMessage || self.extendInputInvalidProblemMessage; if (problemMessage) { self.$alert(problemMessage);