From 0620194c782ac6038d8006686267086cc569b5d6 Mon Sep 17 00:00:00 2001 From: MaysWind Date: Thu, 25 Jul 2024 00:43:21 +0800 Subject: [PATCH] support showing hidden categories in filtering page / dialog --- src/lib/category.js | 96 +++++++++++++------ .../cards/CategoryFilterSettingsCard.vue | 69 +++++++++---- .../settings/CategoryFilterSettingsPage.vue | 50 ++++++---- 3 files changed, 148 insertions(+), 67 deletions(-) diff --git a/src/lib/category.js b/src/lib/category.js index e8320672..099286b0 100644 --- a/src/lib/category.js +++ b/src/lib/category.js @@ -62,7 +62,7 @@ export function getTransactionSecondaryCategoryName(categoryId, allCategories) { return ''; } -export function allVisibleTransactionCategories(allTransactionCategories, allowCategoryTypes) { +export function allTransactionCategoriesWithVisibleCount(allTransactionCategories, allowCategoryTypes) { const ret = {}; const hasAllowCategoryTypes = allowCategoryTypes && (allowCategoryTypes[categoryConstants.allCategoryTypes.Income.toString()] @@ -85,57 +85,80 @@ export function allVisibleTransactionCategories(allTransactionCategories, allowC } const allCategories = allTransactionCategories[categoryType]; - const visibleCategories = []; - const allVisibleSubCategories = {}; + const allSubCategories = {}; + const allVisibleSubCategoryCounts = {}; + const allFirstVisibleSubCategoryIndexes = {}; + let allVisibleCategoryCount = 0; + let firstVisibleCategoryIndex = -1; for (let j = 0; j < allCategories.length; j++) { const category = allCategories[j]; - if (category.hidden) { - continue; + if (!category.hidden) { + allVisibleCategoryCount++; + + if (firstVisibleCategoryIndex === -1) { + firstVisibleCategoryIndex = j; + } } - visibleCategories.push(category); - if (category.subCategories) { - const visibleSubCategories = []; + let visibleSubCategoryCount = 0; + let firstVisibleSubCategoryIndex = -1; for (let k = 0; k < category.subCategories.length; k++) { const subCategory = category.subCategories[k]; if (!subCategory.hidden) { - visibleSubCategories.push(subCategory); + visibleSubCategoryCount++; + + if (firstVisibleSubCategoryIndex === -1) { + firstVisibleSubCategoryIndex = k; + } } } - if (visibleSubCategories.length > 0) { - allVisibleSubCategories[category.id] = visibleSubCategories; + if (category.subCategories.length > 0) { + allSubCategories[category.id] = category.subCategories; + allVisibleSubCategoryCounts[category.id] = visibleSubCategoryCount; + allFirstVisibleSubCategoryIndexes[category.id] = firstVisibleSubCategoryIndex; } } } ret[categoryType.toString()] = { type: categoryType.toString(), - visibleCategories: visibleCategories, - visibleSubCategories: allVisibleSubCategories + allCategories: allCategories, + allVisibleCategoryCount: allVisibleCategoryCount, + firstVisibleCategoryIndex: firstVisibleCategoryIndex, + allSubCategories: allSubCategories, + allVisibleSubCategoryCounts: allVisibleSubCategoryCounts, + allFirstVisibleSubCategoryIndexes: allFirstVisibleSubCategoryIndexes }; } return ret; } -export function allVisiblePrimaryTransactionCategoriesByType(allTransactionCategories, type) { - const allVisibleCategories = allVisibleTransactionCategories(allTransactionCategories); +export function allVisiblePrimaryTransactionCategoriesByType(allTransactionCategories, categoryType) { + const allCategories = allTransactionCategories[categoryType]; + const visibleCategories = []; - if (!allVisibleCategories) { - return []; + if (!allCategories) { + return visibleCategories; } - if (!allVisibleCategories[type.toString()]) { - return []; + for (let i = 0; i < allCategories.length; i++) { + const category = allCategories[i]; + + if (category.hidden) { + continue; + } + + visibleCategories.push(category); } - return allVisibleCategories[type.toString()].visibleCategories; + return visibleCategories; } export function getFinalCategoryIdsByFilteredCategoryIds(allTransactionCategoriesMap, filteredCategoryIds) { @@ -248,32 +271,43 @@ export function getFirstAvailableSubCategoryId(categories, categoryId) { return ''; } -export function hasAnyAvailableCategory(allVisibleTransactionCategories) { - for (let type in allVisibleTransactionCategories) { - if (!Object.prototype.hasOwnProperty.call(allVisibleTransactionCategories, type)) { +export function hasAnyAvailableCategory(allTransactionCategories, showHidden) { + for (let type in allTransactionCategories) { + if (!Object.prototype.hasOwnProperty.call(allTransactionCategories, type)) { continue; } - const categoryType = allVisibleTransactionCategories[type]; + const categoryType = allTransactionCategories[type]; - if (categoryType.visibleCategories && categoryType.visibleCategories.length > 0) { - return true; + if (showHidden) { + if (categoryType.allCategories && categoryType.allCategories.length > 0) { + return true; + } + } else { + if (categoryType.allVisibleCategoryCount > 0) { + return true; + } } } return false; } -export function hasAvailableCategory(allVisibleTransactionCategories) { +export function hasAvailableCategory(allTransactionCategories, showHidden) { const result = {}; - for (let type in allVisibleTransactionCategories) { - if (!Object.prototype.hasOwnProperty.call(allVisibleTransactionCategories, type)) { + for (let type in allTransactionCategories) { + if (!Object.prototype.hasOwnProperty.call(allTransactionCategories, type)) { continue; } - const categoryType = allVisibleTransactionCategories[type]; - result[type] = categoryType.visibleCategories && categoryType.visibleCategories.length > 0; + const categoryType = allTransactionCategories[type]; + + if (showHidden) { + result[type] = categoryType.allCategories && categoryType.allCategories.length > 0; + } else { + result[type] = categoryType.allVisibleCategoryCount > 0; + } } return result; diff --git a/src/views/desktop/common/cards/CategoryFilterSettingsCard.vue b/src/views/desktop/common/cards/CategoryFilterSettingsCard.vue index 7a1f53eb..99f977a2 100644 --- a/src/views/desktop/common/cards/CategoryFilterSettingsCard.vue +++ b/src/views/desktop/common/cards/CategoryFilterSettingsCard.vue @@ -12,13 +12,23 @@ + + + @@ -33,13 +43,23 @@ + + + @@ -56,7 +76,7 @@ + v-for="transactionType in allTransactionCategories"> {{ getCategoryTypeName(transactionType.type) }} @@ -65,44 +85,45 @@
{{ $t('No available category') }}
@@ -112,7 +133,7 @@
- {{ $t(applyText) }} + {{ $t(applyText) }} {{ $t('Cancel') }}
@@ -129,7 +150,7 @@ import { useStatisticsStore } from '@/stores/statistics.js'; import categoryConstants from '@/consts/category.js'; import { copyObjectTo, arrayItemToObjectField } from '@/lib/common.js'; import { - allVisibleTransactionCategories, + allTransactionCategoriesWithVisibleCount, hasAnyAvailableCategory, hasAvailableCategory, selectSubCategories, @@ -145,6 +166,8 @@ import { mdiSelectAll, mdiSelect, mdiSelectInverse, + mdiEyeOutline, + mdiEyeOffOutline, mdiDotsVertical } from '@mdi/js'; @@ -167,10 +190,13 @@ export default { categoryConstants.allCategoryTypes.Transfer.toString() ], filterCategoryIds: {}, + showHidden: false, icons: { selectAll: mdiSelectAll, selectNone: mdiSelect, selectInverse: mdiSelectInverse, + show: mdiEyeOutline, + hide: mdiEyeOffOutline, more: mdiDotsVertical } } @@ -194,14 +220,17 @@ export default { allowCategoryTypes() { return this.categoryTypes ? arrayItemToObjectField(this.categoryTypes.split(','), true) : null; }, - allVisibleTransactionCategories() { - return allVisibleTransactionCategories(this.transactionCategoriesStore.allTransactionCategories, this.allowCategoryTypes); + allTransactionCategories() { + return allTransactionCategoriesWithVisibleCount(this.transactionCategoriesStore.allTransactionCategories, this.allowCategoryTypes); }, hasAnyAvailableCategory() { - return hasAnyAvailableCategory(this.allVisibleTransactionCategories); + return hasAnyAvailableCategory(this.allTransactionCategories, true); + }, + hasAnyVisibleCategory() { + return hasAnyAvailableCategory(this.allTransactionCategories, this.showHidden); }, hasAvailableCategory() { - return hasAvailableCategory(this.allVisibleTransactionCategories); + return hasAvailableCategory(this.allTransactionCategories, this.showHidden); } }, created() { diff --git a/src/views/mobile/settings/CategoryFilterSettingsPage.vue b/src/views/mobile/settings/CategoryFilterSettingsPage.vue index 1362aa61..37aeb22e 100644 --- a/src/views/mobile/settings/CategoryFilterSettingsPage.vue +++ b/src/views/mobile/settings/CategoryFilterSettingsPage.vue @@ -5,7 +5,7 @@ - + @@ -50,7 +50,7 @@