diff --git a/pkg/services/transaction_tags.go b/pkg/services/transaction_tags.go index b900dd00..f9ccc639 100644 --- a/pkg/services/transaction_tags.go +++ b/pkg/services/transaction_tags.go @@ -184,7 +184,7 @@ func (s *TransactionTagService) GetAllTagIdsOfTransactions(c *core.Context, uid } var tagIndexes []*models.TransactionTagIndex - err := s.UserDataDB(uid).NewSession(c).Where("uid=? AND deleted=?", uid, false).In("transaction_id", transactionIds).Find(&tagIndexes) + err := s.UserDataDB(uid).NewSession(c).Where("uid=? AND deleted=?", uid, false).In("transaction_id", transactionIds).OrderBy("transaction_id asc, tag_index_id asc").Find(&tagIndexes) allTransactionTagIds := s.GetGroupedTransactionTagIds(tagIndexes) diff --git a/src/lib/settings.js b/src/lib/settings.js index febb0ac8..f45fdae8 100644 --- a/src/lib/settings.js +++ b/src/lib/settings.js @@ -16,6 +16,7 @@ const defaultSettings = { timezoneUsedForStatisticsInHomePage: timezoneConstants.defaultTimezoneTypesUsedForStatistics, itemsCountInTransactionListPage: 15, showTotalAmountInTransactionListPage: true, + showTagInTransactionListPage: false, showAccountBalance: true, statistics: { defaultChartDataType: statisticsConstants.defaultChartDataType, @@ -196,6 +197,14 @@ export function setShowTotalAmountInTransactionListPage(value) { setOption('showTotalAmountInTransactionListPage', value); } +export function isShowTagInTransactionListPage() { + return getOption('showTagInTransactionListPage'); +} + +export function setShowTagInTransactionListPage(value) { + setOption('showTagInTransactionListPage', value); +} + export function isShowAccountBalance() { return getOption('showAccountBalance'); } diff --git a/src/locales/en.js b/src/locales/en.js index 51e85098..7d00f245 100644 --- a/src/locales/en.js +++ b/src/locales/en.js @@ -1113,6 +1113,7 @@ export default { 'Transaction List Page': 'Transaction List Page', 'Transactions Per Page': 'Transactions Per Page', 'Show Monthly Total Amount': 'Show Monthly Total Amount', + 'Show Transaction Tag': 'Show Transaction Tag', 'Transaction Edit Page': 'Transaction Edit Page', 'Automatically Add Geolocation': 'Automatically Add Geolocation', 'Enable Animation': 'Enable Animation', diff --git a/src/locales/zh_Hans.js b/src/locales/zh_Hans.js index 4e54f9cc..f507c3e8 100644 --- a/src/locales/zh_Hans.js +++ b/src/locales/zh_Hans.js @@ -1113,6 +1113,7 @@ export default { 'Transaction List Page': '交易列表页面', 'Transactions Per Page': '每页交易数', 'Show Monthly Total Amount': '显示月度总金额', + 'Show Transaction Tag': '显示交易标签', 'Transaction Edit Page': '交易编辑页面', 'Automatically Add Geolocation': '自动添加地理位置', 'Enable Animation': '启用动画', diff --git a/src/stores/setting.js b/src/stores/setting.js index 6dacc905..a1e8e560 100644 --- a/src/stores/setting.js +++ b/src/stores/setting.js @@ -18,6 +18,7 @@ export const useSettingsStore = defineStore('settings', { timezoneUsedForStatisticsInHomePage: settings.getTimezoneUsedForStatisticsInHomePage(), itemsCountInTransactionListPage: settings.getItemsCountInTransactionListPage(), showTotalAmountInTransactionListPage: settings.isShowTotalAmountInTransactionListPage(), + showTagInTransactionListPage: settings.isShowTagInTransactionListPage(), showAccountBalance: settings.isShowAccountBalance(), statistics: { defaultChartDataType: settings.getStatisticsDefaultChartDataType(), @@ -82,6 +83,10 @@ export const useSettingsStore = defineStore('settings', { settings.setShowTotalAmountInTransactionListPage(value); this.appSettings.showTotalAmountInTransactionListPage = value; }, + setShowTagInTransactionListPage(value) { + settings.setShowTagInTransactionListPage(value); + this.appSettings.showTagInTransactionListPage = value; + }, setShowAccountBalance(value) { settings.setShowAccountBalance(value); this.appSettings.showAccountBalance = value; diff --git a/src/styles/mobile/font-size-default.css b/src/styles/mobile/font-size-default.css index 3fb39089..a0812a5e 100644 --- a/src/styles/mobile/font-size-default.css +++ b/src/styles/mobile/font-size-default.css @@ -75,6 +75,9 @@ --ebk-transaction-day-of-week-font-size: 12px; --ebk-transaction-account-arrow-font-size: 12px; --ebk-transaction-account-arrow-margin-top: -1px; + --ebk-transaction-tag-chip-font-size: 13px; + --ebk-transaction-tag-chip-media-size: 19px; + --ebk-transaction-tag-chip-height: 19px; --ebk-login-page-title-font-size: 28px; --ebk-license-popup-title-font-size: 30px; --ebk-license-content-font-size: 14px; diff --git a/src/styles/mobile/font-size-large.css b/src/styles/mobile/font-size-large.css index 4d61a5c1..bcb7d279 100644 --- a/src/styles/mobile/font-size-large.css +++ b/src/styles/mobile/font-size-large.css @@ -75,6 +75,9 @@ --ebk-transaction-day-of-week-font-size: 13px; --ebk-transaction-account-arrow-font-size: 13px; --ebk-transaction-account-arrow-margin-top: -2px; + --ebk-transaction-tag-chip-font-size: 13px; + --ebk-transaction-tag-chip-media-size: 20px; + --ebk-transaction-tag-chip-height: 20px; --ebk-login-page-title-font-size: 28px; --ebk-license-popup-title-font-size: 31px; --ebk-license-content-font-size: 15px; diff --git a/src/styles/mobile/font-size-small.css b/src/styles/mobile/font-size-small.css index 532d011b..97741259 100644 --- a/src/styles/mobile/font-size-small.css +++ b/src/styles/mobile/font-size-small.css @@ -75,6 +75,9 @@ --ebk-transaction-day-of-week-font-size: 12px; --ebk-transaction-account-arrow-font-size: 12px; --ebk-transaction-account-arrow-margin-top: -1px; + --ebk-transaction-tag-chip-font-size: 13px; + --ebk-transaction-tag-chip-media-size: 18px; + --ebk-transaction-tag-chip-height: 18px; --ebk-login-page-title-font-size: 28px; --ebk-license-popup-title-font-size: 30px; --ebk-license-content-font-size: 13px; diff --git a/src/styles/mobile/font-size-x-large.css b/src/styles/mobile/font-size-x-large.css index 17cbc862..4741e65a 100644 --- a/src/styles/mobile/font-size-x-large.css +++ b/src/styles/mobile/font-size-x-large.css @@ -75,6 +75,9 @@ --ebk-transaction-day-of-week-font-size: 14px; --ebk-transaction-account-arrow-font-size: 14px; --ebk-transaction-account-arrow-margin-top: -2px; + --ebk-transaction-tag-chip-font-size: 14px; + --ebk-transaction-tag-chip-media-size: 22px; + --ebk-transaction-tag-chip-height: 22px; --ebk-login-page-title-font-size: 28px; --ebk-license-popup-title-font-size: 32px; --ebk-license-content-font-size: 16px; diff --git a/src/styles/mobile/font-size-xx-large.css b/src/styles/mobile/font-size-xx-large.css index 1a8e9e6a..17fcc593 100644 --- a/src/styles/mobile/font-size-xx-large.css +++ b/src/styles/mobile/font-size-xx-large.css @@ -75,6 +75,9 @@ --ebk-transaction-day-of-week-font-size: 15px; --ebk-transaction-account-arrow-font-size: 15px; --ebk-transaction-account-arrow-margin-top: -3px; + --ebk-transaction-tag-chip-font-size: 15px; + --ebk-transaction-tag-chip-media-size: 22px; + --ebk-transaction-tag-chip-height: 22px; --ebk-login-page-title-font-size: 28px; --ebk-license-popup-title-font-size: 36px; --ebk-license-content-font-size: 17px; diff --git a/src/styles/mobile/font-size-xxx-large.css b/src/styles/mobile/font-size-xxx-large.css index 3e0e2c30..79f5d75c 100644 --- a/src/styles/mobile/font-size-xxx-large.css +++ b/src/styles/mobile/font-size-xxx-large.css @@ -75,6 +75,9 @@ --ebk-transaction-day-of-week-font-size: 17px; --ebk-transaction-account-arrow-font-size: 17px; --ebk-transaction-account-arrow-margin-top: -4px; + --ebk-transaction-tag-chip-font-size: 16px; + --ebk-transaction-tag-chip-media-size: 24px; + --ebk-transaction-tag-chip-height: 24px; --ebk-login-page-title-font-size: 28px; --ebk-license-popup-title-font-size: 38px; --ebk-license-content-font-size: 19px; diff --git a/src/styles/mobile/font-size-xxxx-large.css b/src/styles/mobile/font-size-xxxx-large.css index 5a6497f9..c6bda399 100644 --- a/src/styles/mobile/font-size-xxxx-large.css +++ b/src/styles/mobile/font-size-xxxx-large.css @@ -75,6 +75,9 @@ --ebk-transaction-day-of-week-font-size: 19px; --ebk-transaction-account-arrow-font-size: 19px; --ebk-transaction-account-arrow-margin-top: -4px; + --ebk-transaction-tag-chip-font-size: 18px; + --ebk-transaction-tag-chip-media-size: 26px; + --ebk-transaction-tag-chip-height: 26px; --ebk-login-page-title-font-size: 28px; --ebk-license-popup-title-font-size: 40px; --ebk-license-content-font-size: 21px; diff --git a/src/styles/mobile/global.css b/src/styles/mobile/global.css index f599c518..f66fc5d3 100644 --- a/src/styles/mobile/global.css +++ b/src/styles/mobile/global.css @@ -98,10 +98,12 @@ i.icon.la, i.icon.las, i.icon.lab { /** custom class **/ :root { --default-icon-color: #000; + --ebk-transaction-tag-chip-bg-color: rgba(0, 0, 0, 0.04); } :root.dark { --default-icon-color: #fff; + --ebk-transaction-tag-chip-bg-color: rgba(255, 255, 255, 0.04); } .pin-codes-input { diff --git a/src/views/desktop/app/settings/tabs/AppBasicSettingTab.vue b/src/views/desktop/app/settings/tabs/AppBasicSettingTab.vue index 413f3b70..090d9b41 100644 --- a/src/views/desktop/app/settings/tabs/AppBasicSettingTab.vue +++ b/src/views/desktop/app/settings/tabs/AppBasicSettingTab.vue @@ -123,6 +123,17 @@ v-model="showTotalAmountInTransactionListPage" /> + + + @@ -248,6 +259,14 @@ export default { this.settingsStore.setShowTotalAmountInTransactionListPage(value); } }, + showTagInTransactionListPage: { + get: function () { + return this.settingsStore.appSettings.showTagInTransactionListPage; + }, + set: function (value) { + this.settingsStore.setShowTagInTransactionListPage(value); + } + }, itemsCountInTransactionListPage: { get: function () { return this.settingsStore.appSettings.itemsCountInTransactionListPage; diff --git a/src/views/desktop/transactions/ListPage.vue b/src/views/desktop/transactions/ListPage.vue index 349d21ee..ef32a902 100644 --- a/src/views/desktop/transactions/ListPage.vue +++ b/src/views/desktop/transactions/ListPage.vue @@ -308,13 +308,14 @@ + {{ $t('Tags') }} {{ $t('Description') }} - + @@ -322,7 +323,7 @@ - {{ $t('No transaction data') }} + {{ $t('No transaction data') }} @@ -331,7 +332,7 @@ v-for="(transaction, idx) in transactions"> - +
{{ getLongDate(transaction) }} @@ -380,6 +381,15 @@ {{ transaction.destinationAccount.name }}
+ + + + {{ transaction.comment }} @@ -433,6 +443,7 @@ import { useSettingsStore } from '@/stores/setting.js'; import { useUserStore } from '@/stores/user.js'; import { useAccountsStore } from '@/stores/account.js'; import { useTransactionCategoriesStore } from '@/stores/transactionCategory.js'; +import { useTransactionTagsStore } from '@/stores/transactionTag.js'; import { useTransactionsStore } from '@/stores/transaction.js'; import numeralConstants from '@/consts/numeral.js'; @@ -478,6 +489,7 @@ import { mdiPencilBoxOutline, mdiArrowLeft, mdiArrowRight, + mdiPound, mdiDotsVertical } from '@mdi/js'; @@ -532,12 +544,13 @@ export default { modifyBalance: mdiPencilBoxOutline, arrowLeft: mdiArrowLeft, arrowRight: mdiArrowRight, + tag: mdiPound, more: mdiDotsVertical } }; }, computed: { - ...mapStores(useSettingsStore, useUserStore, useAccountsStore, useTransactionCategoriesStore, useTransactionsStore), + ...mapStores(useSettingsStore, useUserStore, useAccountsStore, useTransactionCategoriesStore, useTransactionTagsStore, useTransactionsStore), defaultCurrency() { return getUnifiedSelectedAccountsCurrencyOrDefaultCurrency(this.allAccounts, this.queryAllFilterAccountIds, this.userStore.currentUserDefaultCurrency); }, @@ -786,11 +799,17 @@ export default { return primaryCategories; }, + allTransactionTags() { + return this.transactionTagsStore.allTransactionTagsMap; + }, recentMonthDateRanges() { return this.$locale.getAllRecentMonthDateRanges(this.userStore, true, true); }, showTotalAmountInTransactionListPage() { return this.settingsStore.appSettings.showTotalAmountInTransactionListPage; + }, + showTagInTransactionListPage() { + return this.settingsStore.appSettings.showTagInTransactionListPage; } }, created() { @@ -875,7 +894,8 @@ export default { Promise.all([ self.accountsStore.loadAllAccounts({ force: false }), - self.transactionCategoriesStore.loadAllCategories({ force: false }) + self.transactionCategoriesStore.loadAllCategories({ force: false }), + self.transactionTagsStore.loadAllTags({ force: false }) ]).then(() => { if (this.queryMonthlyData) { const currentMonthMinDate = parseDateFromUnixTime(this.query.minTime); @@ -1354,6 +1374,11 @@ export default { white-space: nowrap; } +.transaction-table .transaction-table-column-tags { + width: 80px; + max-width: 300px; +} + .transaction-table-column-description { max-width: 300px; } @@ -1368,6 +1393,19 @@ export default { margin-left: 0in; } +.transaction-table .transaction-table-column-tags .v-chip.transaction-tag { + margin-right: 4px; + margin-top: 2px; + margin-bottom: 2px; +} + +.transaction-table .transaction-table-column-tags .v-chip.transaction-tag > .v-chip__content { + display: block; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; +} + .transaction-category-menu .item-icon, .transaction-amount-menu .item-icon, .transaction-account-menu .item-icon, diff --git a/src/views/mobile/settings/PageSettingsPage.vue b/src/views/mobile/settings/PageSettingsPage.vue index dc77b2d7..d27320f1 100644 --- a/src/views/mobile/settings/PageSettingsPage.vue +++ b/src/views/mobile/settings/PageSettingsPage.vue @@ -26,6 +26,10 @@ {{ $t('Show Monthly Total Amount') }} + + {{ $t('Show Transaction Tag') }} + + {{ $t('Transaction Edit Page') }} @@ -74,6 +78,14 @@ export default { this.settingsStore.setShowTotalAmountInTransactionListPage(value); } }, + showTagInTransactionListPage: { + get: function () { + return this.settingsStore.appSettings.showTagInTransactionListPage; + }, + set: function (value) { + this.settingsStore.setShowTagInTransactionListPage(value); + } + }, isAutoGetCurrentGeoLocation: { get: function () { return this.settingsStore.appSettings.autoGetCurrentGeoLocation; diff --git a/src/views/mobile/settings/TextSizeSettingsPage.vue b/src/views/mobile/settings/TextSizeSettingsPage.vue index 96bab0be..1a222e5b 100644 --- a/src/views/mobile/settings/TextSizeSettingsPage.vue +++ b/src/views/mobile/settings/TextSizeSettingsPage.vue @@ -63,6 +63,13 @@