mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-17 08:14:25 +08:00
tag filter supports selecting both included and excluded tags simultaneously
This commit is contained in:
+16
-42
@@ -12,8 +12,7 @@ import { type DateTime, type TextualYearMonth, type TimeRangeAndDateType, DateRa
|
||||
import { TimezoneTypeForStatistics } from '@/core/timezone.ts';
|
||||
import { CategoryType } from '@/core/category.ts';
|
||||
import {
|
||||
TransactionRelatedAccountType,
|
||||
TransactionTagFilterType
|
||||
TransactionRelatedAccountType
|
||||
} from '@/core/transaction.ts';
|
||||
import {
|
||||
StatisticsAnalysisType,
|
||||
@@ -135,8 +134,7 @@ export interface TransactionStatisticsPartialFilter {
|
||||
assetTrendsChartEndTime?: number;
|
||||
filterAccountIds?: Record<string, boolean>;
|
||||
filterCategoryIds?: Record<string, boolean>;
|
||||
tagIds?: string;
|
||||
tagFilterType?: number;
|
||||
tagFilter?: string;
|
||||
keyword?: string;
|
||||
sortingType?: number;
|
||||
}
|
||||
@@ -157,8 +155,7 @@ export interface TransactionStatisticsFilter extends TransactionStatisticsPartia
|
||||
assetTrendsChartEndTime: number;
|
||||
filterAccountIds: Record<string, boolean>;
|
||||
filterCategoryIds: Record<string, boolean>;
|
||||
tagIds: string;
|
||||
tagFilterType: number;
|
||||
tagFilter: string;
|
||||
keyword: string;
|
||||
sortingType: number;
|
||||
}
|
||||
@@ -186,8 +183,7 @@ export const useStatisticsStore = defineStore('statistics', () => {
|
||||
assetTrendsChartEndTime: 0,
|
||||
filterAccountIds: {},
|
||||
filterCategoryIds: {},
|
||||
tagIds: '',
|
||||
tagFilterType: TransactionTagFilterType.Default.type,
|
||||
tagFilter: '',
|
||||
keyword: '',
|
||||
sortingType: ChartSortingType.Default.type
|
||||
});
|
||||
@@ -1326,8 +1322,7 @@ export const useStatisticsStore = defineStore('statistics', () => {
|
||||
transactionStatisticsFilter.value.assetTrendsChartEndTime = 0;
|
||||
transactionStatisticsFilter.value.filterAccountIds = {};
|
||||
transactionStatisticsFilter.value.filterCategoryIds = {};
|
||||
transactionStatisticsFilter.value.tagIds = '';
|
||||
transactionStatisticsFilter.value.tagFilterType = TransactionTagFilterType.Default.type;
|
||||
transactionStatisticsFilter.value.tagFilter = '';
|
||||
transactionStatisticsFilter.value.keyword = '';
|
||||
transactionCategoryStatisticsData.value = null;
|
||||
transactionCategoryTrendsData.value = [];
|
||||
@@ -1502,16 +1497,10 @@ export const useStatisticsStore = defineStore('statistics', () => {
|
||||
transactionStatisticsFilter.value.filterCategoryIds = settingsStore.appSettings.statistics.defaultTransactionCategoryFilter || {};
|
||||
}
|
||||
|
||||
if (filter && isString(filter.tagIds)) {
|
||||
transactionStatisticsFilter.value.tagIds = filter.tagIds;
|
||||
if (filter && isString(filter.tagFilter)) {
|
||||
transactionStatisticsFilter.value.tagFilter = filter.tagFilter;
|
||||
} else {
|
||||
transactionStatisticsFilter.value.tagIds = '';
|
||||
}
|
||||
|
||||
if (filter && isInteger(filter.tagFilterType)) {
|
||||
transactionStatisticsFilter.value.tagFilterType = filter.tagFilterType;
|
||||
} else {
|
||||
transactionStatisticsFilter.value.tagFilterType = TransactionTagFilterType.Default.type;
|
||||
transactionStatisticsFilter.value.tagFilter = '';
|
||||
}
|
||||
|
||||
if (filter && isString(filter.keyword)) {
|
||||
@@ -1613,13 +1602,8 @@ export const useStatisticsStore = defineStore('statistics', () => {
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (filter && isString(filter.tagIds) && transactionStatisticsFilter.value.tagIds !== filter.tagIds) {
|
||||
transactionStatisticsFilter.value.tagIds = filter.tagIds;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (filter && isInteger(filter.tagFilterType) && transactionStatisticsFilter.value.tagFilterType !== filter.tagFilterType) {
|
||||
transactionStatisticsFilter.value.tagFilterType = filter.tagFilterType;
|
||||
if (filter && isString(filter.tagFilter) && transactionStatisticsFilter.value.tagFilter !== filter.tagFilter) {
|
||||
transactionStatisticsFilter.value.tagFilter = filter.tagFilter;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
@@ -1692,12 +1676,8 @@ export const useStatisticsStore = defineStore('statistics', () => {
|
||||
}
|
||||
}
|
||||
|
||||
if (transactionStatisticsFilter.value.tagIds) {
|
||||
querys.push('tagIds=' + transactionStatisticsFilter.value.tagIds);
|
||||
}
|
||||
|
||||
if (transactionStatisticsFilter.value.tagFilterType) {
|
||||
querys.push('tagFilterType=' + transactionStatisticsFilter.value.tagFilterType);
|
||||
if (transactionStatisticsFilter.value.tagFilter) {
|
||||
querys.push('tagFilter=' + transactionStatisticsFilter.value.tagFilter);
|
||||
}
|
||||
|
||||
if (transactionStatisticsFilter.value.keyword) {
|
||||
@@ -1798,12 +1778,8 @@ export const useStatisticsStore = defineStore('statistics', () => {
|
||||
}
|
||||
|
||||
if (analysisType === StatisticsAnalysisType.CategoricalAnalysis || analysisType === StatisticsAnalysisType.TrendAnalysis) {
|
||||
if (transactionStatisticsFilter.value.tagIds) {
|
||||
querys.push('tagIds=' + transactionStatisticsFilter.value.tagIds);
|
||||
}
|
||||
|
||||
if (transactionStatisticsFilter.value.tagFilterType) {
|
||||
querys.push('tagFilterType=' + transactionStatisticsFilter.value.tagFilterType);
|
||||
if (transactionStatisticsFilter.value.tagFilter) {
|
||||
querys.push('tagFilter=' + transactionStatisticsFilter.value.tagFilter);
|
||||
}
|
||||
|
||||
if (transactionStatisticsFilter.value.keyword) {
|
||||
@@ -1834,8 +1810,7 @@ export const useStatisticsStore = defineStore('statistics', () => {
|
||||
services.getTransactionStatistics({
|
||||
startTime: transactionStatisticsFilter.value.categoricalChartStartTime,
|
||||
endTime: transactionStatisticsFilter.value.categoricalChartEndTime,
|
||||
tagIds: transactionStatisticsFilter.value.tagIds,
|
||||
tagFilterType: transactionStatisticsFilter.value.tagFilterType,
|
||||
tagFilter: transactionStatisticsFilter.value.tagFilter,
|
||||
keyword: transactionStatisticsFilter.value.keyword,
|
||||
useTransactionTimezone: settingsStore.appSettings.statistics.defaultTimezoneType === TimezoneTypeForStatistics.TransactionTimezone.type
|
||||
}).then(response => {
|
||||
@@ -1877,8 +1852,7 @@ export const useStatisticsStore = defineStore('statistics', () => {
|
||||
services.getTransactionStatisticsTrends({
|
||||
startYearMonth: transactionStatisticsFilter.value.trendChartStartYearMonth,
|
||||
endYearMonth: transactionStatisticsFilter.value.trendChartEndYearMonth,
|
||||
tagIds: transactionStatisticsFilter.value.tagIds,
|
||||
tagFilterType: transactionStatisticsFilter.value.tagFilterType,
|
||||
tagFilter: transactionStatisticsFilter.value.tagFilter,
|
||||
keyword: transactionStatisticsFilter.value.keyword,
|
||||
useTransactionTimezone: settingsStore.appSettings.statistics.defaultTimezoneType === TimezoneTypeForStatistics.TransactionTimezone.type
|
||||
}).then(response => {
|
||||
|
||||
+39
-38
@@ -21,6 +21,7 @@ import {
|
||||
type TransactionPageWrapper,
|
||||
type TransactionReconciliationStatementResponse,
|
||||
Transaction,
|
||||
TransactionTagFilter,
|
||||
EMPTY_TRANSACTION_RESULT
|
||||
} from '@/models/transaction.ts';
|
||||
import type {
|
||||
@@ -47,6 +48,7 @@ import {
|
||||
isNumber,
|
||||
isString,
|
||||
isArray1SubsetOfArray2,
|
||||
getObjectOwnFieldCount,
|
||||
splitItemsToMap,
|
||||
countSplitItems
|
||||
} from '@/lib/common.ts';
|
||||
@@ -69,8 +71,7 @@ export interface TransactionListPartialFilter {
|
||||
type?: number;
|
||||
categoryIds?: string;
|
||||
accountIds?: string;
|
||||
tagIds?: string;
|
||||
tagFilterType?: number;
|
||||
tagFilter?: string;
|
||||
amountFilter?: string;
|
||||
keyword?: string;
|
||||
}
|
||||
@@ -82,8 +83,7 @@ export interface TransactionListFilter extends TransactionListPartialFilter {
|
||||
type: number;
|
||||
categoryIds: string;
|
||||
accountIds: string;
|
||||
tagIds: string;
|
||||
tagFilterType: number;
|
||||
tagFilter: string;
|
||||
amountFilter: string;
|
||||
keyword: string;
|
||||
}
|
||||
@@ -123,8 +123,7 @@ export const useTransactionsStore = defineStore('transactions', () => {
|
||||
type: 0,
|
||||
categoryIds: '',
|
||||
accountIds: '',
|
||||
tagIds: '',
|
||||
tagFilterType: TransactionTagFilterType.Default.type,
|
||||
tagFilter: '',
|
||||
amountFilter: '',
|
||||
keyword: ''
|
||||
});
|
||||
@@ -136,11 +135,32 @@ export const useTransactionsStore = defineStore('transactions', () => {
|
||||
|
||||
const allFilterCategoryIds = computed<Record<string, boolean>>(() => splitItemsToMap(transactionsFilter.value.categoryIds, ','));
|
||||
const allFilterAccountIds = computed<Record<string, boolean>>(() => splitItemsToMap(transactionsFilter.value.accountIds, ','));
|
||||
const allFilterTagIds = computed<Record<string, boolean>>(() => splitItemsToMap(transactionsFilter.value.tagIds, ','));
|
||||
const allFilterTagIds = computed<Record<string, boolean>>(() => {
|
||||
const tagFilters: TransactionTagFilter[] = TransactionTagFilter.parse(transactionsFilter.value.tagFilter);
|
||||
const allTagIdsMap: Record<string, boolean> = {};
|
||||
|
||||
for (const tagFilter of tagFilters) {
|
||||
let state: boolean = true;
|
||||
|
||||
if (tagFilter.type === TransactionTagFilterType.HasAny || tagFilter.type === TransactionTagFilterType.HasAll) {
|
||||
state = true;
|
||||
} else if (tagFilter.type === TransactionTagFilterType.NotHasAny || tagFilter.type === TransactionTagFilterType.NotHasAll) {
|
||||
state = false;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (const tagId of tagFilter.tagIds) {
|
||||
allTagIdsMap[tagId] = state;
|
||||
}
|
||||
}
|
||||
|
||||
return allTagIdsMap;
|
||||
});
|
||||
|
||||
const allFilterCategoryIdsCount = computed<number>(() => countSplitItems(transactionsFilter.value.categoryIds, ','));
|
||||
const allFilterAccountIdsCount = computed<number>(() => countSplitItems(transactionsFilter.value.accountIds, ','));
|
||||
const allFilterTagIdsCount = computed<number>(() => countSplitItems(transactionsFilter.value.tagIds, ','));
|
||||
const allFilterTagIdsCount = computed<number>(() => getObjectOwnFieldCount(allFilterTagIds.value));
|
||||
|
||||
const noTransaction = computed<boolean>(() => {
|
||||
for (const transactionMonthList of transactions.value) {
|
||||
@@ -587,8 +607,7 @@ export const useTransactionsStore = defineStore('transactions', () => {
|
||||
transactionsFilter.value.type = 0;
|
||||
transactionsFilter.value.categoryIds = '';
|
||||
transactionsFilter.value.accountIds = '';
|
||||
transactionsFilter.value.tagIds = '';
|
||||
transactionsFilter.value.tagFilterType = TransactionTagFilterType.Default.type;
|
||||
transactionsFilter.value.tagFilter = '';
|
||||
transactionsFilter.value.amountFilter = '';
|
||||
transactionsFilter.value.keyword = '';
|
||||
transactions.value = [];
|
||||
@@ -640,16 +659,10 @@ export const useTransactionsStore = defineStore('transactions', () => {
|
||||
transactionsFilter.value.accountIds = '';
|
||||
}
|
||||
|
||||
if (filter && isString(filter.tagIds)) {
|
||||
transactionsFilter.value.tagIds = filter.tagIds;
|
||||
if (filter && isString(filter.tagFilter)) {
|
||||
transactionsFilter.value.tagFilter = filter.tagFilter;
|
||||
} else {
|
||||
transactionsFilter.value.tagIds = '';
|
||||
}
|
||||
|
||||
if (filter && isNumber(filter.tagFilterType)) {
|
||||
transactionsFilter.value.tagFilterType = filter.tagFilterType;
|
||||
} else {
|
||||
transactionsFilter.value.tagFilterType = TransactionTagFilterType.Default.type;
|
||||
transactionsFilter.value.tagFilter = '';
|
||||
}
|
||||
|
||||
if (filter && isString(filter.amountFilter)) {
|
||||
@@ -703,13 +716,8 @@ export const useTransactionsStore = defineStore('transactions', () => {
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (filter && isString(filter.tagIds) && transactionsFilter.value.tagIds !== filter.tagIds) {
|
||||
transactionsFilter.value.tagIds = filter.tagIds;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
if (filter && isNumber(filter.tagFilterType) && transactionsFilter.value.tagFilterType !== filter.tagFilterType) {
|
||||
transactionsFilter.value.tagFilterType = filter.tagFilterType;
|
||||
if (filter && isString(filter.tagFilter) && transactionsFilter.value.tagFilter !== filter.tagFilter) {
|
||||
transactionsFilter.value.tagFilter = filter.tagFilter;
|
||||
changed = true;
|
||||
}
|
||||
|
||||
@@ -743,12 +751,8 @@ export const useTransactionsStore = defineStore('transactions', () => {
|
||||
querys.push('categoryIds=' + transactionsFilter.value.categoryIds);
|
||||
}
|
||||
|
||||
if (transactionsFilter.value.tagIds) {
|
||||
querys.push('tagIds=' + transactionsFilter.value.tagIds);
|
||||
}
|
||||
|
||||
if (transactionsFilter.value.tagFilterType) {
|
||||
querys.push('tagFilterType=' + transactionsFilter.value.tagFilterType);
|
||||
if (transactionsFilter.value.tagFilter) {
|
||||
querys.push('tagFilter=' + transactionsFilter.value.tagFilter);
|
||||
}
|
||||
|
||||
querys.push('dateType=' + transactionsFilter.value.dateType);
|
||||
@@ -776,8 +780,7 @@ export const useTransactionsStore = defineStore('transactions', () => {
|
||||
type: transactionsFilter.value.type,
|
||||
categoryIds: transactionsFilter.value.categoryIds,
|
||||
accountIds: transactionsFilter.value.accountIds,
|
||||
tagIds: transactionsFilter.value.tagIds,
|
||||
tagFilterType: transactionsFilter.value.tagFilterType,
|
||||
tagFilter: transactionsFilter.value.tagFilter,
|
||||
amountFilter: transactionsFilter.value.amountFilter,
|
||||
keyword: transactionsFilter.value.keyword
|
||||
};
|
||||
@@ -802,8 +805,7 @@ export const useTransactionsStore = defineStore('transactions', () => {
|
||||
type: transactionsFilter.value.type,
|
||||
categoryIds: transactionsFilter.value.categoryIds,
|
||||
accountIds: transactionsFilter.value.accountIds,
|
||||
tagIds: transactionsFilter.value.tagIds,
|
||||
tagFilterType: transactionsFilter.value.tagFilterType,
|
||||
tagFilter: transactionsFilter.value.tagFilter,
|
||||
amountFilter: transactionsFilter.value.amountFilter,
|
||||
keyword: transactionsFilter.value.keyword
|
||||
}).then(response => {
|
||||
@@ -882,8 +884,7 @@ export const useTransactionsStore = defineStore('transactions', () => {
|
||||
type: transactionsFilter.value.type,
|
||||
categoryIds: transactionsFilter.value.categoryIds,
|
||||
accountIds: transactionsFilter.value.accountIds,
|
||||
tagIds: transactionsFilter.value.tagIds,
|
||||
tagFilterType: transactionsFilter.value.tagFilterType,
|
||||
tagFilter: transactionsFilter.value.tagFilter,
|
||||
amountFilter: transactionsFilter.value.amountFilter,
|
||||
keyword: transactionsFilter.value.keyword
|
||||
}).then(response => {
|
||||
|
||||
Reference in New Issue
Block a user