add time-based categories "Transaction Day of Week", "Transaction Day of Month", "Transaction Month of Year" and "Transaction Quarter of Year" in insights & explore

This commit is contained in:
MaysWind
2025-12-31 00:38:36 +08:00
parent f5e4d82efc
commit 8ea8a9fe2a
22 changed files with 193 additions and 75 deletions
+4
View File
@@ -205,6 +205,10 @@ export class TransactionExploreDataDimension implements NameValue {
public static readonly DateTimeByYearQuarter = new TransactionExploreDataDimension('Transaction Year-Quarter', TransactionExploreDataDimensionType.DateTimeByYearQuarter);
public static readonly DateTimeByYear = new TransactionExploreDataDimension('Transaction Year', TransactionExploreDataDimensionType.DateTimeByYear);
public static readonly DateTimeByFiscalYear = new TransactionExploreDataDimension('Transaction Fiscal Year', TransactionExploreDataDimensionType.DateTimeByFiscalYear);
public static readonly DateTimeByDayOfWeek = new TransactionExploreDataDimension('Transaction Day of Week', TransactionExploreDataDimensionType.DateTimeByDayOfWeek);
public static readonly DateTimeByDayOfMonth = new TransactionExploreDataDimension('Transaction Day of Month', TransactionExploreDataDimensionType.DateTimeByDayOfMonth);
public static readonly DateTimeByMonthOfYear = new TransactionExploreDataDimension('Transaction Month of Year', TransactionExploreDataDimensionType.DateTimeByMonthOfYear);
public static readonly DateTimeByQuarterOfYear = new TransactionExploreDataDimension('Transaction Quarter of Year', TransactionExploreDataDimensionType.DateTimeByQuarterOfYear);
public static readonly TransactionType = new TransactionExploreDataDimension('Transaction Type', TransactionExploreDataDimensionType.TransactionType);
public static readonly SourceAccount = new TransactionExploreDataDimension('Source Account', TransactionExploreDataDimensionType.SourceAccount);
public static readonly SourceAccountCategory = new TransactionExploreDataDimension('Source Account Category', TransactionExploreDataDimensionType.SourceAccountCategory);
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "Q1 {year}",
"q2": "Q2 {year}",
"q3": "Q3 {year}",
"q4": "Q4 {year}"
"content": "{quarter} {year}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "GJ {StartYYYY}-{EndYYYY}",
@@ -282,6 +279,12 @@
"29": "29.",
"30": "30.",
"31": "31."
},
"quarter": {
"q1": "Q1",
"q2": "Q2",
"q3": "Q3",
"q4": "Q4"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "Q1 {year}",
"q2": "Q2 {year}",
"q3": "Q3 {year}",
"q4": "Q4 {year}"
"content": "{quarter} {year}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "FY {StartYYYY}-{EndYYYY}",
@@ -282,6 +279,12 @@
"29": "29th",
"30": "30th",
"31": "31th"
},
"quarter": {
"q1": "Q1",
"q2": "Q2",
"q3": "Q3",
"q4": "Q4"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "h:mm A"
},
"yearQuarter": {
"q1": "T1 {year}",
"q2": "T2 {year}",
"q3": "T3 {year}",
"q4": "T4 {year}"
"content": "{quarter} {year}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "Ejercicio {StartYYYY}-{EndYYYY}",
@@ -282,6 +279,12 @@
"29": "29",
"30": "30",
"31": "31"
},
"quarter": {
"q1": "T1",
"q2": "T2",
"q3": "T3",
"q4": "T4"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "T1 {year}",
"q2": "T2 {year}",
"q3": "T3 {year}",
"q4": "T4 {year}"
"content": "{quarter} {year}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "Exercice {StartYYYY}-{EndYYYY}",
@@ -282,6 +279,12 @@
"29": "29e",
"30": "30e",
"31": "31e"
},
"quarter": {
"q1": "T1",
"q2": "T2",
"q3": "T3",
"q4": "T4"
}
},
"granularity": {
+14 -3
View File
@@ -785,10 +785,12 @@ export function useI18n() {
}
function formatYearQuarter(year: string, quarter: number): string {
if (1 <= quarter && quarter <= 4) {
return t('format.yearQuarter.q' + quarter, {
const quarterName = getQuarterName(quarter);
if (quarterName) {
return t('format.yearQuarter.content', {
year: year,
quarter: quarter
quarter: getQuarterName(quarter)
});
} else {
return '';
@@ -1590,6 +1592,14 @@ export function useI18n() {
return t(`datetime.${weekDay.name}.long`);
}
function getQuarterName(quarter: number): string {
if (1 <= quarter && quarter <= 4) {
return t('datetime.quarter.q' + quarter);
} else {
return '';
}
}
function getMultiMonthdayShortNames(monthDays: number[]): string {
if (!monthDays) {
return '';
@@ -2392,6 +2402,7 @@ export function useI18n() {
getMonthdayShortName,
getWeekdayShortName,
getWeekdayLongName,
getQuarterName,
getMultiMonthdayShortNames,
getMultiWeekdayLongNames,
getAllLocalizedDigits,
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "T1 {year}",
"q2": "T2 {year}",
"q3": "T3 {year}",
"q4": "T4 {year}"
"content": "{quarter} {year}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "AF {StartYYYY}-{EndYYYY}",
@@ -282,6 +279,12 @@
"29": "29",
"30": "30",
"31": "31"
},
"quarter": {
"q1": "T1",
"q2": "T2",
"q3": "T3",
"q4": "T4"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "{year}年第1四半期",
"q2": "{year}年第2四半期",
"q3": "{year}年第3四半期",
"q4": "{year}年第4四半期"
"content": "{year}年{quarter}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "{StartYYYY}-{EndYYYY}年度",
@@ -282,6 +279,12 @@
"29": "29",
"30": "30",
"31": "31"
},
"quarter": {
"q1": "第1四半期",
"q2": "第2四半期",
"q3": "第3四半期",
"q4": "第4四半期"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "Q1 {year}",
"q2": "Q2 {year}",
"q3": "Q3 {year}",
"q4": "Q4 {year}"
"content": "{quarter} {year}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "ವಿತ್ತೀಯ ವರ್ಷ {StartYYYY}-{EndYYYY}",
@@ -282,6 +279,12 @@
"29": "29ನೇ",
"30": "30ನೇ",
"31": "31ನೇ"
},
"quarter": {
"q1": "Q1",
"q2": "Q2",
"q3": "Q3",
"q4": "Q4"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "{year}년 1사분기",
"q2": "{year}년 2사분기",
"q3": "{year}년 3사분기",
"q4": "{year}년 4사분기"
"content": "{year}년 {quarter}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "{StartYYYY}-{EndYYYY}년도",
@@ -282,6 +279,12 @@
"29": "29",
"30": "30",
"31": "31"
},
"quarter": {
"q1": "1사분기",
"q2": "2사분기",
"q3": "3사분기",
"q4": "4사분기"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "Q1 {year}",
"q2": "Q2 {year}",
"q3": "Q3 {year}",
"q4": "Q4 {year}"
"content": "{quarter} {year}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "Boekjaar {StartYYYY}/{EndYYYY}",
@@ -282,6 +279,12 @@
"29": "29e",
"30": "30e",
"31": "31e"
},
"quarter": {
"q1": "Q1",
"q2": "Q2",
"q3": "Q3",
"q4": "Q4"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "T1 {year}",
"q2": "T2 {year}",
"q3": "T3 {year}",
"q4": "T4 {year}"
"content": "{quarter} {year}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "AF {StartYYYY}-{EndYYYY}",
@@ -282,6 +279,12 @@
"29": "29º",
"30": "30º",
"31": "31º"
},
"quarter": {
"q1": "T1",
"q2": "T2",
"q3": "T3",
"q4": "T4"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "h:mm A"
},
"yearQuarter": {
"q1": "1 квартал {year} г.",
"q2": "2 квартал {year} г.",
"q3": "3 квартал {year} г.",
"q4": "4 квартал {year} г."
"content": "{quarter} {year} г."
},
"fiscalYear": {
"StartYYYY_EndYYYY": "ФГ {StartYYYY}-{EndYYYY}",
@@ -282,6 +279,12 @@
"29": "29-й",
"30": "30-й",
"31": "31-й"
},
"quarter": {
"q1": "1 квартал",
"q2": "2 квартал",
"q3": "3 квартал",
"q4": "4 квартал"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "Q1 {year}",
"q2": "Q2 {year}",
"q3": "Q3 {year}",
"q4": "Q4 {year}"
"content": "{quarter} {year}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "PL {StartYYYY}-{EndYYYY}",
@@ -282,6 +279,12 @@
"29": "29.",
"30": "30.",
"31": "31."
},
"quarter": {
"q1": "Q1",
"q2": "Q2",
"q3": "Q3",
"q4": "Q4"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "h:mm A"
},
"yearQuarter": {
"q1": "ไตรมาสที่ 1 {year}",
"q2": "ไตรมาสที่ 2 {year}",
"q3": "ไตรมาสที่ 3 {year}",
"q4": "ไตรมาสที่ 4 {year}"
"content": "{quarter} {year}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "ปีงบประมาณ {StartYYYY}-{EndYYYY}",
@@ -282,6 +279,12 @@
"29": "วันที่ 29",
"30": "วันที่ 30",
"31": "วันที่ 31"
},
"quarter": {
"q1": "ไตรมาสที่ 1",
"q2": "ไตรมาสที่ 2",
"q3": "ไตรมาสที่ 3",
"q4": "ไตรมาสที่ 4"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "{year} 1. çeyrek",
"q2": "{year} 2. çeyrek",
"q3": "{year} 3. çeyrek",
"q4": "{year} 4. çeyrek"
"content": "{year} {quarter}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "{StartYYYY}-{EndYYYY} mali yılı",
@@ -282,6 +279,12 @@
"29": "29.",
"30": "30.",
"31": "31."
},
"quarter": {
"q1": "1. çeyrek",
"q2": "2. çeyrek",
"q3": "3. çeyrek",
"q4": "4. çeyrek"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "1 квартал {year} р.",
"q2": "2 квартал {year} р.",
"q3": "3 квартал {year} р.",
"q4": "4 квартал {year} р."
"content": "{quarter} {year} р."
},
"fiscalYear": {
"StartYYYY_EndYYYY": "{StartYYYY}-{EndYYYY} фінансовий рік",
@@ -282,6 +279,12 @@
"29": "29-й",
"30": "30-й",
"31": "31-й"
},
"quarter": {
"q1": "1 квартал",
"q2": "2 квартал",
"q3": "3 квартал",
"q4": "4 квартал"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "Quý 1 năm {year}",
"q2": "Quý 2 năm {year}",
"q3": "Quý 3 năm {year}",
"q4": "Quý 4 năm {year}"
"content": "{quarter} năm {year}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "FY {StartYYYY}-{EndYYYY}",
@@ -282,6 +279,12 @@
"29": "Ngày 29",
"30": "Ngày 30",
"31": "Ngày 31"
},
"quarter": {
"q1": "Quý 1",
"q2": "Quý 2",
"q3": "Quý 3",
"q4": "Quý 4"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "{year}Q1",
"q2": "{year}Q2",
"q3": "{year}Q3",
"q4": "{year}Q4"
"content": "{year}{quarter}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "{StartYYYY}-{EndYYYY}财年",
@@ -282,6 +279,12 @@
"29": "29",
"30": "30",
"31": "31"
},
"quarter": {
"q1": "Q1",
"q2": "Q2",
"q3": "Q3",
"q4": "Q4"
}
},
"granularity": {
+7 -4
View File
@@ -97,10 +97,7 @@
"hh_mm_a": "hh:mm A"
},
"yearQuarter": {
"q1": "{year}Q1",
"q2": "{year}Q2",
"q3": "{year}Q3",
"q4": "{year}Q4"
"content": "{year}{quarter}"
},
"fiscalYear": {
"StartYYYY_EndYYYY": "{StartYYYY}-{EndYYYY}財政年度",
@@ -282,6 +279,12 @@
"29": "29",
"30": "30",
"31": "31"
},
"quarter": {
"q1": "Q1",
"q2": "Q2",
"q3": "Q3",
"q4": "Q4"
}
},
"granularity": {
+34
View File
@@ -42,6 +42,8 @@ import {
isEquals,
} from '@/lib/common.ts';
import {
parseDateTimeFromUnixTime,
parseDateTimeFromUnixTimeWithTimezoneOffset,
getYearFirstUnixTimeBySpecifiedUnixTime,
getQuarterFirstUnixTimeBySpecifiedUnixTime,
getMonthFirstUnixTimeBySpecifiedUnixTime,
@@ -203,6 +205,38 @@ export const useExploresStore = defineStore('explores', () => {
categoryId: unixTime,
categoryIdType: TransactionExploreDimensionType.Other
};
} else if (dimension === TransactionExploreDataDimension.DateTimeByDayOfWeek) {
const dateTime = isDefined(transactionTimeUtfOffset) ? parseDateTimeFromUnixTimeWithTimezoneOffset(transaction.time, transactionTimeUtfOffset) : parseDateTimeFromUnixTime(transaction.time);
return {
categoryName: dateTime.getWeekDay().name,
categoryId: dateTime.getWeekDay().type.toString(10),
categoryIdType: TransactionExploreDimensionType.Other
};
} else if (dimension === TransactionExploreDataDimension.DateTimeByDayOfMonth) {
const dateTime = isDefined(transactionTimeUtfOffset) ? parseDateTimeFromUnixTimeWithTimezoneOffset(transaction.time, transactionTimeUtfOffset) : parseDateTimeFromUnixTime(transaction.time);
return {
categoryName: dateTime.getGregorianCalendarDay().toString(10),
categoryId: dateTime.getGregorianCalendarDay().toString(10),
categoryIdType: TransactionExploreDimensionType.Other
};
} else if (dimension === TransactionExploreDataDimension.DateTimeByMonthOfYear) {
const dateTime = isDefined(transactionTimeUtfOffset) ? parseDateTimeFromUnixTimeWithTimezoneOffset(transaction.time, transactionTimeUtfOffset) : parseDateTimeFromUnixTime(transaction.time);
return {
categoryName: dateTime.getGregorianCalendarMonth().toString(10),
categoryId: dateTime.getGregorianCalendarMonth().toString(10),
categoryIdType: TransactionExploreDimensionType.Other
};
} else if (dimension === TransactionExploreDataDimension.DateTimeByQuarterOfYear) {
const dateTime = isDefined(transactionTimeUtfOffset) ? parseDateTimeFromUnixTimeWithTimezoneOffset(transaction.time, transactionTimeUtfOffset) : parseDateTimeFromUnixTime(transaction.time);
return {
categoryName: dateTime.getGregorianCalendarQuarter().toString(10),
categoryId: dateTime.getGregorianCalendarQuarter().toString(10),
categoryIdType: TransactionExploreDimensionType.Other
};
} else if (dimension === TransactionExploreDataDimension.TransactionType) {
let transactionTypeName = 'Unknown';
@@ -137,6 +137,7 @@ import {
} from '@/stores/explore.ts';
import { type NameValue } from '@/core/base.ts';
import { Month, WeekDay } from '@/core/datetime.ts';
import {
TransactionExploreChartTypeValue,
TransactionExploreChartType,
@@ -174,6 +175,10 @@ const {
getAllTransactionExploreDataDimensions,
getAllTransactionExploreValueMetrics,
getAllTransactionExploreChartTypes,
getMonthLongName,
getMonthdayShortName,
getWeekdayLongName,
getQuarterName,
formatDateTimeToShortDateTime,
formatDateTimeToShortDate,
formatDateTimeToGregorianLikeShortYear,
@@ -269,6 +274,16 @@ function getCategoriedDataDisplayName(info: CategoriedInfo | SeriesedInfo): stri
displayName = formatDateTimeToGregorianLikeShortYear(parseDateTimeFromUnixTime(parseInt(name)));
} else if (dimessionType === TransactionExploreDataDimension.DateTimeByFiscalYear.value) {
displayName = formatDateTimeToGregorianLikeFiscalYear(parseDateTimeFromUnixTime(parseInt(name)));
} else if (dimessionType === TransactionExploreDataDimension.DateTimeByDayOfWeek.value) {
const weekDay = WeekDay.parse(name);
displayName = weekDay ? getWeekdayLongName(weekDay) : tt('Unknown');
} else if (dimessionType === TransactionExploreDataDimension.DateTimeByDayOfMonth.value) {
displayName = getMonthdayShortName(parseInt(name));
} else if (dimessionType === TransactionExploreDataDimension.DateTimeByMonthOfYear.value) {
const month = Month.valueOf(parseInt(name));
displayName = month ? getMonthLongName(month.name) : tt('Unknown');
} else if (dimessionType === TransactionExploreDataDimension.DateTimeByQuarterOfYear.value) {
displayName = getQuarterName(parseInt(name));
}
if (dimessionType === TransactionExploreDataDimension.SourceAmount.value