diff --git a/src/components/base/ItemIconBase.ts b/src/components/base/ItemIconBase.ts
index ae10b11e..e73b93af 100644
--- a/src/components/base/ItemIconBase.ts
+++ b/src/components/base/ItemIconBase.ts
@@ -1,8 +1,9 @@
import { computed } from 'vue';
-import type { ColorValue } from '@/core/color.ts';
+import type {ColorStyleValue, ColorValue} from '@/core/color.ts';
import { ALL_ACCOUNT_ICONS, DEFAULT_ACCOUNT_ICON, ALL_CATEGORY_ICONS, DEFAULT_CATEGORY_ICON } from '@/consts/icon.ts';
-import { DEFAULT_ICON_COLOR, DEFAULT_ACCOUNT_COLOR, DEFAULT_CATEGORY_COLOR } from '@/consts/color.ts';
+import { DEFAULT_ICON_COLOR, DEFAULT_ACCOUNT_COLOR, DEFAULT_CATEGORY_COLOR, DEFAULT_COLOR_STYLE_VARIABLE } from '@/consts/color.ts';
+
import { isNumber } from '@/lib/common.ts';
type IconItemStyleName = string;
@@ -14,14 +15,14 @@ export interface CommonIconProps {
iconType: CommonIconItemType | MobileIconItemType;
iconId: string | number;
color?: ColorValue;
- defaultColor?: ColorValue;
+ defaultColor?: ColorStyleValue;
additionalColorAttr?: string;
size?: string | number;
}
export function useItemIconBase(props: CommonIconProps) {
const style = computed>(() => {
- let defaultColor = 'var(--default-icon-color)';
+ let defaultColor: ColorStyleValue = DEFAULT_COLOR_STYLE_VARIABLE;
if (props.defaultColor) {
defaultColor = props.defaultColor;
@@ -60,15 +61,15 @@ export function useItemIconBase(props: CommonIconProps) {
return ALL_CATEGORY_ICONS[iconId].icon;
}
- function getAccountIconStyle(color?: ColorValue | string, defaultColor?: ColorValue | string, additionalColorAttr?: string): Record {
+ function getAccountIconStyle(color?: ColorValue, defaultColor?: ColorStyleValue, additionalColorAttr?: string): Record {
+ let displayColor: ColorStyleValue | undefined = defaultColor;
+
if (color && color !== DEFAULT_ACCOUNT_COLOR) {
- color = '#' + color;
- } else {
- color = defaultColor;
+ displayColor = `#${color}`;
}
const ret: Record = {
- color: color
+ color: displayColor
};
if (additionalColorAttr) {
@@ -82,15 +83,15 @@ export function useItemIconBase(props: CommonIconProps) {
return ret;
}
- function getCategoryIconStyle(color?: ColorValue | string, defaultColor?: ColorValue | string, additionalColorAttr?: string): Record {
+ function getCategoryIconStyle(color?: ColorValue, defaultColor?: ColorStyleValue, additionalColorAttr?: string): Record {
+ let displayColor: ColorStyleValue | undefined = defaultColor;
+
if (color && color !== DEFAULT_CATEGORY_COLOR) {
- color = '#' + color;
- } else {
- color = defaultColor;
+ displayColor = `#${color}`;
}
const ret: Record = {
- color: color
+ color: displayColor
};
if (additionalColorAttr) {
@@ -104,15 +105,15 @@ export function useItemIconBase(props: CommonIconProps) {
return ret;
}
- function getDefaultIconStyle(color?: ColorValue | string, defaultColor?: ColorValue | string, additionalColorAttr?: string): Record {
+ function getDefaultIconStyle(color?: ColorValue, defaultColor?: ColorStyleValue, additionalColorAttr?: string): Record {
+ let displayColor: ColorStyleValue | undefined = defaultColor;
+
if (color && color !== DEFAULT_ICON_COLOR) {
- color = '#' + color;
- } else {
- color = defaultColor;
+ displayColor = `#${color}`;
}
const ret: Record = {
- color: color
+ color: displayColor
};
if (additionalColorAttr) {
diff --git a/src/components/base/MonthlyTrendsChartBase.ts b/src/components/base/MonthlyTrendsChartBase.ts
index cdb4bb9a..973ee620 100644
--- a/src/components/base/MonthlyTrendsChartBase.ts
+++ b/src/components/base/MonthlyTrendsChartBase.ts
@@ -11,8 +11,6 @@ import type {
YearMonthUnixTime
} from '@/core/datetime.ts';
import type { FiscalYearUnixTime } from '@/core/fiscalyear.ts';
-import type { ColorValue } from '@/core/color.ts';
-import { DEFAULT_ICON_COLOR } from '@/consts/color.ts';
import type { YearMonthItems } from '@/models/transaction.ts';
import { getAllDateRangesFromItems } from '@/lib/statistics.ts';
@@ -49,19 +47,10 @@ export function useMonthlyTrendsChartBase(props: Comm
return props.translateName ? tt(name) : name;
}
- function getColor(color: string): ColorValue {
- if (color && color !== DEFAULT_ICON_COLOR) {
- color = '#' + color;
- }
-
- return color;
- }
-
return {
// computed states
allDateRanges,
// functions
- getItemName,
- getColor
+ getItemName
}
}
diff --git a/src/components/base/PieChartBase.ts b/src/components/base/PieChartBase.ts
index dff9d38e..23b9abf8 100644
--- a/src/components/base/PieChartBase.ts
+++ b/src/components/base/PieChartBase.ts
@@ -2,9 +2,11 @@ import { ref, computed, watch } from 'vue';
import { useI18n } from '@/locales/helpers.ts';
+import type { ColorValue, ColorStyleValue } from '@/core/color.ts';
import { DEFAULT_CHART_COLORS } from '@/consts/color.ts';
import { isNumber } from '@/lib/common.ts';
+import { getDisplayColor } from '@/lib/color.ts';
export interface CommonPieChartDataItem {
id: string;
@@ -13,7 +15,7 @@ export interface CommonPieChartDataItem {
value: number;
percent: number;
actualPercent: number;
- color: string;
+ color: ColorStyleValue;
sourceItem: Record;
displayPercent?: string;
displayValue?: string;
@@ -68,7 +70,7 @@ export function usePieChartBase(props: CommonPieChartProps) {
value: value,
percent: (isNumber(percent) && percent >= 0) ? percent : (value / totalValidValue * 100),
actualPercent: value / totalValidValue,
- color: (props.colorField && item[props.colorField]) ? item[props.colorField] as string : DEFAULT_CHART_COLORS[validItems.length % DEFAULT_CHART_COLORS.length],
+ color: getDisplayColor((props.colorField && item[props.colorField]) ? item[props.colorField] as ColorValue : DEFAULT_CHART_COLORS[validItems.length % DEFAULT_CHART_COLORS.length]),
sourceItem: item
};
diff --git a/src/components/desktop/AccountBalanceTrendsChart.vue b/src/components/desktop/AccountBalanceTrendsChart.vue
index 50d2d09d..0b8113a5 100644
--- a/src/components/desktop/AccountBalanceTrendsChart.vue
+++ b/src/components/desktop/AccountBalanceTrendsChart.vue
@@ -14,7 +14,7 @@ import { useUserStore } from '@/stores/user.ts';
import type { NameValue } from '@/core/base.ts';
import { TextDirection } from '@/core/text.ts';
-import type { ColorValue } from '@/core/color.ts';
+import type { ColorStyleValue } from '@/core/color.ts';
import { ThemeType } from '@/core/theme.ts';
import { AccountBalanceTrendChartType } from '@/core/statistics.ts';
import { DEFAULT_CHART_COLORS } from '@/consts/color.ts';
@@ -32,10 +32,10 @@ interface AccountBalanceTrendsChartDataItem {
id: string;
name: string;
itemStyle: {
- color: ColorValue;
- color0?: string;
- borderColor?: string;
- borderColor0?: string;
+ color: ColorStyleValue;
+ color0?: ColorStyleValue;
+ borderColor?: ColorStyleValue;
+ borderColor0?: ColorStyleValue;
};
selected: boolean;
type: string;
diff --git a/src/components/desktop/ColorSelect.vue b/src/components/desktop/ColorSelect.vue
index 8588ba46..be2408ef 100644
--- a/src/components/desktop/ColorSelect.vue
+++ b/src/components/desktop/ColorSelect.vue
@@ -11,7 +11,7 @@
>
-
+
@@ -23,14 +23,14 @@
@@ -47,9 +47,9 @@ import { useI18n } from '@/locales/helpers.ts';
import { TextDirection } from '@/core/text.ts';
import type { ColorValue, ColorInfo } from '@/core/color.ts';
-import { DEFAULT_ICON_COLOR } from '@/consts/color.ts';
+
import { arrayContainsFieldValue } from '@/lib/common.ts';
-import { getColorsInRows } from '@/lib/color.ts';
+import { getColorsInRows, getDisplayColor } from '@/lib/color.ts';
import { scrollToSelectedItem } from '@/lib/ui/desktop.ts';
import {
@@ -86,14 +86,6 @@ function hasSelectedIcon(row: ColorInfo[]): boolean {
return arrayContainsFieldValue(row, 'id', props.modelValue);
}
-function getFinalColor(color: ColorValue): string {
- if (color && color !== DEFAULT_ICON_COLOR) {
- return '#' + color;
- } else {
- return 'var(--default-icon-color)';
- }
-}
-
function onMenuStateChanged(state: boolean): void {
if (state) {
nextTick(() => {
diff --git a/src/components/desktop/MonthlyTrendsChart.vue b/src/components/desktop/MonthlyTrendsChart.vue
index f2d36c4b..a80eff98 100644
--- a/src/components/desktop/MonthlyTrendsChart.vue
+++ b/src/components/desktop/MonthlyTrendsChart.vue
@@ -16,10 +16,12 @@ import { useUserStore } from '@/stores/user.ts';
import { TextDirection } from '@/core/text.ts';
import { type Year1BasedMonth, DateRangeScene } from '@/core/datetime.ts';
-import type { ColorValue } from '@/core/color.ts';
+import type { ColorStyleValue } from '@/core/color.ts';
import { ThemeType } from '@/core/theme.ts';
import { TrendChartType, ChartDateAggregationType } from '@/core/statistics.ts';
+
import { DEFAULT_CHART_COLORS } from '@/consts/color.ts';
+
import type { YearMonthDataItem, SortableTransactionStatisticDataItem } from '@/models/transaction.ts';
import {
@@ -32,6 +34,9 @@ import {
getDateTypeByDateRange,
getFiscalYearFromUnixTime
} from '@/lib/datetime.ts';
+import {
+ getDisplayColor
+} from '@/lib/color.ts';
import {
sortStatisticsItems
} from '@/lib/statistics.ts';
@@ -47,7 +52,7 @@ interface MonthlyTrendsChartDataItem {
id: string;
name: string;
itemStyle: {
- color: ColorValue;
+ color: ColorStyleValue;
};
selected: boolean;
type: string;
@@ -83,7 +88,7 @@ const {
formatAmountToLocalizedNumeralsWithCurrency
} = useI18n();
-const { allDateRanges, getItemName, getColor } = useMonthlyTrendsChartBase(props);
+const { allDateRanges, getItemName } = useMonthlyTrendsChartBase(props);
const userStore = useUserStore();
@@ -218,7 +223,7 @@ const allSeries = computed(() => {
id: (props.idField && item[props.idField]) ? item[props.idField] as string : getItemName(item[props.nameField] as string),
name: (props.idField && item[props.idField]) ? item[props.idField] as string : getItemName(item[props.nameField] as string),
itemStyle: {
- color: getColor(props.colorField && item[props.colorField] ? item[props.colorField] as string : DEFAULT_CHART_COLORS[i % DEFAULT_CHART_COLORS.length]),
+ color: getDisplayColor(props.colorField && item[props.colorField] ? item[props.colorField] as string : DEFAULT_CHART_COLORS[i % DEFAULT_CHART_COLORS.length]),
},
selected: true,
type: 'line',
diff --git a/src/components/desktop/PieChart.vue b/src/components/desktop/PieChart.vue
index b4044c83..f6bfd4b0 100644
--- a/src/components/desktop/PieChart.vue
+++ b/src/components/desktop/PieChart.vue
@@ -13,13 +13,12 @@ import type { CallbackDataParams } from 'echarts/types/dist/shared';
import { useI18n } from '@/locales/helpers.ts';
import { type CommonPieChartDataItem, type CommonPieChartProps, usePieChartBase } from '@/components/base/PieChartBase.ts'
-import type { ColorValue } from '@/core/color.ts';
+import type { ColorStyleValue } from '@/core/color.ts';
import { ThemeType } from '@/core/theme.ts';
-import { DEFAULT_ICON_COLOR } from '@/consts/color.ts';
interface DesktopPieChartDataItem extends CommonPieChartDataItem {
itemStyle: {
- color: ColorValue;
+ color: ColorStyleValue;
};
selected: boolean;
}
@@ -66,7 +65,7 @@ const seriesData = computed(() => {
ret.push({
...item,
itemStyle: {
- color: getColor(item.color),
+ color: item.color,
},
selected: true
});
@@ -214,14 +213,6 @@ const chartOptions = computed
@@ -60,7 +60,7 @@
Name
{{ selectedItem.displayName }}
Value
- {{ selectedItem.displayValue }}
+ {{ selectedItem.displayValue }}
@@ -82,13 +82,12 @@ import { computed } from 'vue';
import { useI18n } from '@/locales/helpers.ts';
import { type CommonPieChartDataItem, type CommonPieChartProps, usePieChartBase } from '@/components/base/PieChartBase.ts'
-import type { ColorValue } from '@/core/color.ts';
-import { DEFAULT_ICON_COLOR } from '@/consts/color.ts';
+import type { ColorStyleValue } from '@/core/color.ts';
interface MobilePieChartProps extends CommonPieChartProps {
showCenterText?: boolean;
showSelectedItemInfo?: boolean;
- centerTextBackground?: ColorValue;
+ centerTextBackground?: ColorStyleValue;
}
const props = defineProps();
@@ -135,25 +134,13 @@ const itemCommonDashOffset = computed(() => {
return offset;
});
-function getColor(color: ColorValue): ColorValue {
- if (color && color !== DEFAULT_ICON_COLOR) {
- color = '#' + color;
- } else {
- color = 'var(--default-icon-color)';
- }
-
- return color;
-}
-
-function getColorStyle(color: ColorValue, additionalFieldName?: string): Record {
- const finalColor = getColor(color);
-
+function getColorStyle(color: ColorStyleValue, additionalFieldName?: string): Record {
const ret: Record = {
- color: finalColor
+ color: color
};
if (additionalFieldName) {
- ret[additionalFieldName] = finalColor;
+ ret[additionalFieldName] = color;
}
return ret;
diff --git a/src/consts/color.ts b/src/consts/color.ts
index b198e65f..b207ead3 100644
--- a/src/consts/color.ts
+++ b/src/consts/color.ts
@@ -1,4 +1,4 @@
-import type { ColorValue } from '@/core/color.ts';
+import type { ColorValue, ColorStyleValue } from '@/core/color.ts';
const defaultColor: ColorValue = '000000';
@@ -6,6 +6,8 @@ export const DEFAULT_ICON_COLOR: ColorValue = defaultColor;
export const DEFAULT_ACCOUNT_COLOR: ColorValue = defaultColor;
export const DEFAULT_CATEGORY_COLOR: ColorValue = defaultColor;
+export const DEFAULT_COLOR_STYLE_VARIABLE: ColorStyleValue = 'var(--default-icon-color)';
+
const allAvailableColors: ColorValue[] = [
'000000', // black
'8e8e93', // gray
diff --git a/src/core/color.ts b/src/core/color.ts
index fae78d7f..4baf8f9e 100644
--- a/src/core/color.ts
+++ b/src/core/color.ts
@@ -2,13 +2,15 @@ import type { TypeAndName } from './base.ts';
export type ColorValue = string;
+export type ColorStyleValue = `#${ColorValue}` | 'var(--default-icon-color)';
+
export interface ColorInfo extends Record {
readonly color: ColorValue;
}
export interface AmountColor {
- readonly expenseAmountColor: ColorValue;
- readonly incomeAmountColor: ColorValue;
+ readonly expenseAmountColor: ColorStyleValue;
+ readonly incomeAmountColor: ColorStyleValue;
}
export class PresetAmountColor implements TypeAndName {
@@ -26,12 +28,12 @@ export class PresetAmountColor implements TypeAndName {
public readonly type: number;
public readonly name: string;
- public readonly lightThemeColor: string;
- public readonly darkThemeColor: string;
+ public readonly lightThemeColor: ColorStyleValue;
+ public readonly darkThemeColor: ColorStyleValue;
public readonly expenseClassName: string;
public readonly incomeClassName: string;
- private constructor(type: number, name: string, lightThemeColor: string, darkThemeColor: string, expenseClassName: string, incomeClassName: string) {
+ private constructor(type: number, name: string, lightThemeColor: ColorStyleValue, darkThemeColor: ColorStyleValue, expenseClassName: string, incomeClassName: string) {
this.type = type;
this.name = name;
this.lightThemeColor = lightThemeColor;
diff --git a/src/lib/color.ts b/src/lib/color.ts
index fbc17138..94c34ff1 100644
--- a/src/lib/color.ts
+++ b/src/lib/color.ts
@@ -1,4 +1,15 @@
-import type { ColorValue, ColorInfo } from '@/core/color.ts';
+import type {
+ ColorValue,
+ ColorStyleValue,
+ ColorInfo
+} from '@/core/color.ts';
+
+import {
+ DEFAULT_ICON_COLOR,
+ DEFAULT_ACCOUNT_COLOR,
+ DEFAULT_CATEGORY_COLOR,
+ DEFAULT_COLOR_STYLE_VARIABLE
+} from '@/consts/color.ts';
export function getColorsInRows(allColorValues: ColorValue[], itemPerRow: number): ColorInfo[][] {
const ret: ColorInfo[][] = [];
@@ -16,3 +27,26 @@ export function getColorsInRows(allColorValues: ColorValue[], itemPerRow: number
return ret;
}
+
+export function getDisplayColor(color?: ColorValue): ColorStyleValue {
+ if (color && color !== DEFAULT_ICON_COLOR) {
+ return `#${color}`;
+ } else {
+ return DEFAULT_COLOR_STYLE_VARIABLE;
+ }
+}
+
+export function getCategoryDisplayColor(color?: ColorValue): ColorStyleValue {
+ if (color && color !== DEFAULT_CATEGORY_COLOR) {
+ return `#${color}`;
+ } else {
+ return DEFAULT_COLOR_STYLE_VARIABLE;
+ }
+}
+export function getAccountDisplayColor(color?: ColorValue): ColorStyleValue {
+ if (color && color !== DEFAULT_ACCOUNT_COLOR) {
+ return `#${color}`;
+ } else {
+ return DEFAULT_COLOR_STYLE_VARIABLE;
+ }
+}
diff --git a/src/views/base/statistics/StatisticsTransactionPageBase.ts b/src/views/base/statistics/StatisticsTransactionPageBase.ts
index fe09f9f4..76ec6bc6 100644
--- a/src/views/base/statistics/StatisticsTransactionPageBase.ts
+++ b/src/views/base/statistics/StatisticsTransactionPageBase.ts
@@ -8,9 +8,11 @@ import { type TransactionStatisticsFilter, useStatisticsStore } from '@/stores/s
import type { TypeAndDisplayName } from '@/core/base.ts';
import { type LocalizedDateRange, type WeekDayValue, DateRangeScene, DateRange } from '@/core/datetime.ts';
+import type { ColorStyleValue } from '@/core/color.ts';
import { StatisticsAnalysisType, ChartDataType, ChartSortingType, ChartDateAggregationType } from '@/core/statistics.ts';
-import { DEFAULT_ACCOUNT_COLOR, DEFAULT_CATEGORY_COLOR } from '@/consts/color.ts';
+
import { DISPLAY_HIDDEN_AMOUNT } from '@/consts/numeral.ts';
+
import type {
TransactionCategoricalAnalysisData,
TransactionCategoricalAnalysisDataItem,
@@ -19,6 +21,7 @@ import type {
import { limitText, findNameByType, findDisplayNameByType } from '@/lib/common.ts';
import { getYearMonthFirstUnixTime, getYearMonthLastUnixTime } from '@/lib/datetime.ts';
+import { getDisplayColor, getCategoryDisplayColor, getAccountDisplayColor } from '@/lib/color.ts';
export function useStatisticsTransactionPageBase() {
const {
@@ -205,21 +208,13 @@ export function useStatisticsTransactionPageBase() {
}
}
- function getTransactionCategoricalAnalysisDataItemColor(item: TransactionCategoricalAnalysisDataItem): string {
+ function getTransactionCategoricalAnalysisDataItemDisplayColor(item: TransactionCategoricalAnalysisDataItem): ColorStyleValue {
if (item.type === 'category') {
- if (item.color === DEFAULT_CATEGORY_COLOR) {
- return 'var(--default-icon-color)';
- } else {
- return '#' + item.color;
- }
+ return getCategoryDisplayColor(item.color);
} else if (item.type === 'account') {
- if (item.color === DEFAULT_ACCOUNT_COLOR) {
- return 'var(--default-icon-color)';
- } else {
- return '#' + item.color;
- }
+ return getAccountDisplayColor(item.color);
} else {
- return item.color;
+ return getDisplayColor(item.color);
}
}
@@ -272,7 +267,7 @@ export function useStatisticsTransactionPageBase() {
trendsAnalysisData,
// functions
canShowCustomDateRange,
- getTransactionCategoricalAnalysisDataItemColor,
+ getTransactionCategoricalAnalysisDataItemDisplayColor,
getDisplayAmount
};
}
diff --git a/src/views/desktop/statistics/TransactionPage.vue b/src/views/desktop/statistics/TransactionPage.vue
index 50f8e688..c2652327 100644
--- a/src/views/desktop/statistics/TransactionPage.vue
+++ b/src/views/desktop/statistics/TransactionPage.vue
@@ -244,7 +244,7 @@
{{ getDisplayAmount(item.totalAmount, defaultCurrency) }}
-
@@ -458,7 +458,7 @@ const {
categoricalAnalysisData,
trendsAnalysisData,
canShowCustomDateRange,
- getTransactionCategoricalAnalysisDataItemColor,
+ getTransactionCategoricalAnalysisDataItemDisplayColor,
getDisplayAmount
} = useStatisticsTransactionPageBase();
diff --git a/src/views/mobile/statistics/TransactionPage.vue b/src/views/mobile/statistics/TransactionPage.vue
index 68d6b153..bf7445a5 100644
--- a/src/views/mobile/statistics/TransactionPage.vue
+++ b/src/views/mobile/statistics/TransactionPage.vue
@@ -182,7 +182,7 @@
@@ -404,7 +404,7 @@ const {
categoricalAnalysisData,
trendsAnalysisData,
canShowCustomDateRange,
- getTransactionCategoricalAnalysisDataItemColor,
+ getTransactionCategoricalAnalysisDataItemDisplayColor,
getDisplayAmount
} = useStatisticsTransactionPageBase();