diff --git a/src/components/base/PieChartBase.ts b/src/components/base/PieChartBase.ts index b0af86b9..5d9dd983 100644 --- a/src/components/base/PieChartBase.ts +++ b/src/components/base/PieChartBase.ts @@ -31,6 +31,7 @@ export interface CommonPieChartProps { colorField?: string; hiddenField?: string; minValidPercent?: number; + amountValue?: boolean; defaultCurrency?: string; showValue?: boolean; showPercent?: boolean; @@ -74,7 +75,7 @@ export function usePieChartBase(props: CommonPieChartProps) { }; finalItem.displayPercent = formatPercentToLocalizedNumerals(finalItem.percent, 2, '<0.01'); - finalItem.displayValue = formatAmountToLocalizedNumeralsWithCurrency(finalItem.value, props.defaultCurrency); + finalItem.displayValue = props.amountValue ? formatAmountToLocalizedNumeralsWithCurrency(finalItem.value, props.defaultCurrency) : finalItem.value.toString(); validItems.push(finalItem); } diff --git a/src/components/desktop/RadarChart.vue b/src/components/desktop/RadarChart.vue index 05322605..a8c4479a 100644 --- a/src/components/desktop/RadarChart.vue +++ b/src/components/desktop/RadarChart.vue @@ -38,6 +38,7 @@ const props = defineProps<{ colorField?: string; hiddenField?: string; minValidPercent?: number; + amountValue?: boolean; defaultCurrency?: string; showValue?: boolean; showPercent?: boolean; @@ -81,7 +82,7 @@ const radarData = computed(() => { const finalPercent = (isNumber(percent) && percent >= 0) ? percent : (value / totalValidValue * 100); const displayPercent = formatPercentToLocalizedNumerals(finalPercent, 2, '<0.01'); - const displayValue = formatAmountToLocalizedNumeralsWithCurrency(value, props.defaultCurrency); + const displayValue = props.amountValue ? formatAmountToLocalizedNumeralsWithCurrency(value, props.defaultCurrency) : value.toString(); indicators.push({ name: name, diff --git a/src/core/explore.ts b/src/core/explore.ts index 9dc77f14..51441cc4 100644 --- a/src/core/explore.ts +++ b/src/core/explore.ts @@ -53,8 +53,8 @@ export class TransactionExploreConditionField implements NameValue { return TransactionExploreConditionField.allInstances; } - public static valueOf(type: string): TransactionExploreConditionField | undefined { - return TransactionExploreConditionField.allInstancesByValue[type]; + public static valueOf(value: string): TransactionExploreConditionField | undefined { + return TransactionExploreConditionField.allInstancesByValue[value]; } } @@ -119,8 +119,164 @@ export class TransactionExploreConditionOperator implements NameValue { return TransactionExploreConditionOperator.allInstances; } - public static valueOf(type: string): TransactionExploreConditionOperator | undefined { - return TransactionExploreConditionOperator.allInstancesByValue[type]; + public static valueOf(value: string): TransactionExploreConditionOperator | undefined { + return TransactionExploreConditionOperator.allInstancesByValue[value]; + } +} + +export enum TransactionExploreChartTypeValue { + Pie = 'pie', + ColumnStacked = 'columnStacked', + Column100PercentStacked = 'column100%Stacked', + ColumnGrouped = 'columnGrouped', + LineGrouped = 'lineGrouped', + AreaStacked = 'areaStacked', + Area100PercentStacked = 'area100%Stacked', + BubbleGrouped = 'bubbleGrouped', + Radar = 'radar' +} + +export class TransactionExploreChartType implements NameValue { + private static readonly allInstances: TransactionExploreChartType[] = []; + private static readonly allInstancesByValue: Record = {}; + + public static readonly Pie = new TransactionExploreChartType('Pie Chart', TransactionExploreChartTypeValue.Pie, false); + public static readonly Radar = new TransactionExploreChartType('Radar Chart', TransactionExploreChartTypeValue.Radar, false); + + public static readonly Default = TransactionExploreChartType.Pie; + + public readonly name: string; + public readonly value: TransactionExploreChartTypeValue; + public readonly seriesDimensionRequired: boolean; + + private constructor(name: string, value: TransactionExploreChartTypeValue, seriesDimensionRequired: boolean) { + this.name = name; + this.value = value; + this.seriesDimensionRequired = seriesDimensionRequired; + + TransactionExploreChartType.allInstances.push(this); + TransactionExploreChartType.allInstancesByValue[value] = this; + } + + public static values(): TransactionExploreChartType[] { + return TransactionExploreChartType.allInstances; + } + + public static valueOf(value: string): TransactionExploreChartType | undefined { + return TransactionExploreChartType.allInstancesByValue[value]; + } +} + +export enum TransactionExploreDataDimensionType { + None = 'none', + Query = 'query', + DateTime = 'dateTime', + DateTimeByDay = 'dateTimeByDay', + DateTimeByMonth = 'dateTimeByMonth', + DateTimeByQuarter = 'dateTimeByQuarter', + DateTimeByYear = 'dateTimeByYear', + DateTimeByFiscalYear = 'dateTimeByFiscalYear', + TransactionType = 'transactionType', + SourceAccount = 'sourceAccount', + SourceAccountCategory = 'sourceAccountCategory', + SourceAccountCurrency = 'sourceAccountCurrency', + DestinationAccount = 'destinationAccount', + DestinationAccountCategory = 'destinationAccountCategory', + DestinationAccountCurrency = 'destinationAccountCurrency', + SourceAmount = 'sourceAmount', + DestinationAmount = 'destinationAmount', + PrimaryCategory = 'primaryCategory', + SecondaryCategory = 'secondaryCategory' +} + +export class TransactionExploreDataDimension implements NameValue { + private static readonly allInstances: TransactionExploreDataDimension[] = []; + private static readonly allInstancesByValue: Record = {}; + + public static readonly None = new TransactionExploreDataDimension('None', TransactionExploreDataDimensionType.None); + public static readonly Query = new TransactionExploreDataDimension('Query', TransactionExploreDataDimensionType.Query); + public static readonly DateTime = new TransactionExploreDataDimension('Transaction Time', TransactionExploreDataDimensionType.DateTime); + public static readonly DateTimeByDay = new TransactionExploreDataDimension('Transaction Date', TransactionExploreDataDimensionType.DateTimeByDay); + public static readonly DateTimeByMonth = new TransactionExploreDataDimension('Transaction Month', TransactionExploreDataDimensionType.DateTimeByMonth); + public static readonly DateTimeByQuarter = new TransactionExploreDataDimension('Transaction Quarter', TransactionExploreDataDimensionType.DateTimeByQuarter); + public static readonly DateTimeByYear = new TransactionExploreDataDimension('Transaction Year', TransactionExploreDataDimensionType.DateTimeByYear); + public static readonly DateTimeByFiscalYear = new TransactionExploreDataDimension('Transaction Fiscal Year', TransactionExploreDataDimensionType.DateTimeByFiscalYear); + 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); + public static readonly SourceAccountCurrency = new TransactionExploreDataDimension('Source Account Currency', TransactionExploreDataDimensionType.SourceAccountCurrency); + public static readonly DestinationAccount = new TransactionExploreDataDimension('Destination Account', TransactionExploreDataDimensionType.DestinationAccount); + public static readonly DestinationAccountCategory = new TransactionExploreDataDimension('Destination Account Category', TransactionExploreDataDimensionType.DestinationAccountCategory); + public static readonly DestinationAccountCurrency = new TransactionExploreDataDimension('Destination Account Currency', TransactionExploreDataDimensionType.DestinationAccountCurrency); + public static readonly PrimaryCategory = new TransactionExploreDataDimension('Primary Category', TransactionExploreDataDimensionType.PrimaryCategory); + public static readonly SecondaryCategory = new TransactionExploreDataDimension('Secondary Category', TransactionExploreDataDimensionType.SecondaryCategory); + public static readonly SourceAmount = new TransactionExploreDataDimension('Amount', TransactionExploreDataDimensionType.SourceAmount); + public static readonly DestinationAmount = new TransactionExploreDataDimension('Transfer In Amount', TransactionExploreDataDimensionType.DestinationAmount); + + public static readonly CategoryDimensionDefault = TransactionExploreDataDimension.Query; + public static readonly SeriesDimensionDefault = TransactionExploreDataDimension.None; + + public readonly name: string; + public readonly value: TransactionExploreDataDimensionType; + + private constructor(name: string, value: TransactionExploreDataDimensionType) { + this.name = name; + this.value = value; + + TransactionExploreDataDimension.allInstances.push(this); + TransactionExploreDataDimension.allInstancesByValue[value] = this; + } + + public static values(): TransactionExploreDataDimension[] { + return TransactionExploreDataDimension.allInstances; + } + + public static valueOf(value: string): TransactionExploreDataDimension | undefined { + return TransactionExploreDataDimension.allInstancesByValue[value]; + } +} + +export enum TransactionExploreValueMetricType { + TransactionCount = 'transactionCount', + SourceAmountSum = 'sourceAmountSum', + SourceAmountAverage = 'sourceAmountAverage', + SourceAmountMedian = 'sourceAmountMedian', + SourceAmountMinimum = 'sourceAmountMinimum', + SourceAmountMaximum = 'sourceAmountMaximum' +} + +export class TransactionExploreValueMetric implements NameValue { + private static readonly allInstances: TransactionExploreValueMetric[] = []; + private static readonly allInstancesByValue: Record = {}; + + public static readonly TransactionCount = new TransactionExploreValueMetric('Transaction Count', TransactionExploreValueMetricType.TransactionCount, false); + public static readonly SourceAmountSum = new TransactionExploreValueMetric('Total Amount', TransactionExploreValueMetricType.SourceAmountSum, true); + public static readonly SourceAmountAverage = new TransactionExploreValueMetric('Average Amount', TransactionExploreValueMetricType.SourceAmountAverage, true); + public static readonly SourceAmountMedian = new TransactionExploreValueMetric('Median Amount', TransactionExploreValueMetricType.SourceAmountMedian, true); + public static readonly SourceAmountMinimum = new TransactionExploreValueMetric('Minimum Amount', TransactionExploreValueMetricType.SourceAmountMinimum, true); + public static readonly SourceAmountMaximum = new TransactionExploreValueMetric('Maximum Amount', TransactionExploreValueMetricType.SourceAmountMaximum, true); + + public static readonly Default = TransactionExploreValueMetric.SourceAmountSum; + + public readonly name: string; + public readonly value: TransactionExploreValueMetricType; + public readonly isAmount: boolean; + + private constructor(name: string, value: TransactionExploreValueMetricType, isAmount: boolean) { + this.name = name; + this.value = value; + this.isAmount = isAmount; + + TransactionExploreValueMetric.allInstances.push(this); + TransactionExploreValueMetric.allInstancesByValue[value] = this; + } + + public static values(): TransactionExploreValueMetric[] { + return TransactionExploreValueMetric.allInstances; + } + + public static valueOf(value: string): TransactionExploreValueMetric | undefined { + return TransactionExploreValueMetric.allInstancesByValue[value]; } } diff --git a/src/locales/de.json b/src/locales/de.json index 0d620441..b8b89d4c 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "Klicken Sie, um die Importdatei auszuwählen ({extensions})", "previewCount": "Preview Count: {count}", "selectedCount": "{count} von {totalCount} ausgewählt", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "Sie haben {count} Transaktionen aktualisiert", "confirmImportTransactions": "Sind Sie sicher, dass Sie {count} Transaktionen importieren möchten?", "importingTransactions": "Importing ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "Bubble Chart", "Candlestick Chart": "Candlestick Chart", "Sankey Chart": "Sankey Chart", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "Sortieren nach", "Map": "Karte", "Provider": "Anbieter", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "Kontoliste", "This Week": "Diese Woche", "This Month": "Dieser Monat", diff --git a/src/locales/en.json b/src/locales/en.json index bf2aa230..b85bbc0a 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "Click to select import file ({extensions})", "previewCount": "Preview Count: {count}", "selectedCount": "Selected {count} of {totalCount}", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "You have updated {count} transactions", "confirmImportTransactions": "Are you sure you want to import {count} transactions?", "importingTransactions": "Importing ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "Bubble Chart", "Candlestick Chart": "Candlestick Chart", "Sankey Chart": "Sankey Chart", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "Sort by", "Map": "Map", "Provider": "Provider", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "Account List", "This Week": "This Week", "This Month": "This Month", diff --git a/src/locales/es.json b/src/locales/es.json index 0e7e50bf..3ee769ff 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "Haz clic para seleccionar el archivo de importación ({extensions})", "previewCount": "Preview Count: {count}", "selectedCount": "Seleccionado {count} de {totalCount}", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "Has actualizado {count} transacciones", "confirmImportTransactions": "¿Seguro que deseas importar {count} transacciones?", "importingTransactions": "Importando ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "Gráfico de Burbujas", "Candlestick Chart": "Gráfico de Velas", "Sankey Chart": "Diagrama de Sankey", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "Ordenar por", "Map": "Mapa", "Provider": "Proveedor", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "Lista de Cuentas", "This Week": "Esta Semana", "This Month": "Este Mes", diff --git a/src/locales/fr.json b/src/locales/fr.json index cb5f00ac..e9b54745 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "Cliquez pour sélectionner le fichier d'importation ({extensions})", "previewCount": "Nombre d'aperçu : {count}", "selectedCount": "Sélectionné {count} sur {totalCount}", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "Vous avez mis à jour {count} transactions", "confirmImportTransactions": "Êtes-vous sûr de vouloir importer {count} transactions ?", "importingTransactions": "Importation ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "Bubble Chart", "Candlestick Chart": "Graphique en chandelier", "Sankey Chart": "Sankey Chart", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "Trier par", "Map": "Carte", "Provider": "Fournisseur", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "Liste des comptes", "This Week": "Cette semaine", "This Month": "Ce mois", diff --git a/src/locales/helpers.ts b/src/locales/helpers.ts index 93eef23f..ed0b0f30 100644 --- a/src/locales/helpers.ts +++ b/src/locales/helpers.ts @@ -144,7 +144,10 @@ import { import { TransactionExploreConditionField, - TransactionExploreConditionOperator + TransactionExploreConditionOperator, + TransactionExploreDataDimension, + TransactionExploreValueMetric, + TransactionExploreChartType } from '@/core/explore.ts'; import { @@ -2378,6 +2381,9 @@ export function useI18n() { getAllSupportedImportFileCagtegoryAndTypes, getAllTransactionExploreConditionFields: () => getLocalizedNameValue(TransactionExploreConditionField.values()), getAllTransactionExploreConditionOperators: (operators?: TransactionExploreConditionOperator[]) => getLocalizedNameValue(operators ?? TransactionExploreConditionOperator.values()), + getAllTransactionExploreDataDimensions: (operators?: TransactionExploreDataDimension[]) => getLocalizedNameValue(operators ?? TransactionExploreDataDimension.values()), + getAllTransactionExploreValueMetrics: (operators?: TransactionExploreValueMetric[]) => getLocalizedNameValue(operators ?? TransactionExploreValueMetric.values()), + getAllTransactionExploreChartTypes: (operators?: TransactionExploreChartType[]) => getLocalizedNameValue(operators ?? TransactionExploreChartType.values()), // get localized info getLanguageInfo, getMonthShortName, diff --git a/src/locales/it.json b/src/locales/it.json index e080c320..18c30396 100644 --- a/src/locales/it.json +++ b/src/locales/it.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "Carica un file ({extensions})", "previewCount": "Preview Count: {count}", "selectedCount": "{count} selezionati su {totalCount}", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "Hai aggiornato {count} transazioni", "confirmImportTransactions": "Sei sicuro di voler importare {count} transazioni?", "importingTransactions": "Importing ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "Bubble Chart", "Candlestick Chart": "Candlestick Chart", "Sankey Chart": "Sankey Chart", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "Ordina per", "Map": "Mappa", "Provider": "Fornitore", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "Elenco account", "This Week": "Questa settimana", "This Month": "Questo mese", diff --git a/src/locales/ja.json b/src/locales/ja.json index 271083f5..e8b9dc55 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "クリックしてインポートファイルを選択します({extensions})", "previewCount": "Preview Count: {count}", "selectedCount": "{count} / {totalCount}を選択", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "{count}件の取引を更新しました", "confirmImportTransactions": "本当に{count}件の取引をインポートしますか?", "importingTransactions": "Importing ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "Bubble Chart", "Candlestick Chart": "Candlestick Chart", "Sankey Chart": "Sankey Chart", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "ソート順", "Map": "地図", "Provider": "プロバイダー", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "口座リスト", "This Week": "今週", "This Month": "今月", diff --git a/src/locales/kn.json b/src/locales/kn.json index 0ac86510..28c3e827 100644 --- a/src/locales/kn.json +++ b/src/locales/kn.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "ಆಮದು ಫೈಲ್ ಆಯ್ಕೆ ಮಾಡಲು ಕ್ಲಿಕ್ ಮಾಡಿ ({extensions})", "previewCount": "ಪೂರ್ವ ದೃಷ್ಠಿ ಸಂಖ್ಯೆ: {count}", "selectedCount": "{totalCount}ರಲ್ಲಿ {count} ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "ನೀವು {count} ವಹಿವಾಟುಗಳನ್ನು ನವೀಕರಿಸಿದ್ದೀರಿ", "confirmImportTransactions": "ನೀವು {count} ವಹಿವಾಟುಗಳನ್ನು ಆಮದು ಮಾಡಲು ಖಚಿತವಾಗಿದ್ದೀರಾ?", "importingTransactions": "ಆಮದು ಮಾಡಲಾಗುತ್ತಿದೆ ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "ಬಬಲ್ ಚಾರ್ಟ್", "Candlestick Chart": "ಕ್ಯಾಂಡಲ್‌ಸ್ಟಿಕ್ ಚಾರ್ಟ್", "Sankey Chart": "ಸ್ಯಾಂಕಿ ಚಾರ್ಟ್", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "ಇದರ ಪ್ರಕಾರ ವಿಂಗಡಿಸಿ", "Map": "ನಕ್ಷೆ", "Provider": "ಪ್ರದಾತ", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "ಖಾತೆಗಳ ಪಟ್ಟಿ", "This Week": "ಈ ವಾರ", "This Month": "ಈ ತಿಂಗಳು", diff --git a/src/locales/ko.json b/src/locales/ko.json index 62d575df..ab3ddbca 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "클릭해서 내보내기할 파일을 선택하세요 ({extensions})", "previewCount": "미리보기 수: {count}", "selectedCount": "{count}개 중 {totalCount}개 선택됨", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "{count}개의 거래가 업데이트되었습니다.", "confirmImportTransactions": "{count}개의 거래를 가져오시겠습니까?", "importingTransactions": "가져오는 중 ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "Bubble Chart", "Candlestick Chart": "캠들스틱 차트", "Sankey Chart": "Sankey Chart", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "정렬 기준", "Map": "지도", "Provider": "제공자", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "계좌 목록", "This Week": "이번 주", "This Month": "이번 달", diff --git a/src/locales/nl.json b/src/locales/nl.json index 31a03273..2a272af9 100644 --- a/src/locales/nl.json +++ b/src/locales/nl.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "Klik om importbestand te selecteren ({extensions})", "previewCount": "Preview Count: {count}", "selectedCount": "{count} van {totalCount} geselecteerd", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "Je hebt {count} transacties bijgewerkt", "confirmImportTransactions": "Weet je zeker dat je {count} transacties wilt importeren?", "importingTransactions": "Bezig met importeren ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "Bubble Chart", "Candlestick Chart": "Candlestickdiagram", "Sankey Chart": "Sankey Chart", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "Sorteren op", "Map": "Kaart", "Provider": "Provider", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "Rekeningenlijst", "This Week": "Deze week", "This Month": "Deze maand", diff --git a/src/locales/pt_BR.json b/src/locales/pt_BR.json index 5026e8ff..ceeffd6b 100644 --- a/src/locales/pt_BR.json +++ b/src/locales/pt_BR.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "Clique para selecionar arquivo de importação ({extensions})", "previewCount": "Preview Count: {count}", "selectedCount": "Selecionado {count} de {totalCount}", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "Você atualizou {count} transações", "confirmImportTransactions": "Tem certeza de que deseja importar {count} transações?", "importingTransactions": "Importando ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "Bubble Chart", "Candlestick Chart": "Candlestick Chart", "Sankey Chart": "Sankey Chart", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "Ordenar por", "Map": "Mapa", "Provider": "Provedor", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "Lista de Contas", "This Week": "Esta Semana", "This Month": "Este Mês", diff --git a/src/locales/ru.json b/src/locales/ru.json index ac209b65..b4dc602e 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "Нажмите, чтобы выбрать файл для импорта ({extensions})", "previewCount": "Preview Count: {count}", "selectedCount": "Выбрано {count} из {totalCount}", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "Вы обновили {count} транзакций", "confirmImportTransactions": "Вы уверены, что хотите импортировать {count} транзакций?", "importingTransactions": "Importing ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "Bubble Chart", "Candlestick Chart": "Candlestick Chart", "Sankey Chart": "Sankey Chart", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "Сортировать по", "Map": "Карта", "Provider": "Провайдер", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "Список счетов", "This Week": "На этой неделе", "This Month": "В этом месяце", diff --git a/src/locales/th.json b/src/locales/th.json index 812ee4ea..57e6e7e0 100644 --- a/src/locales/th.json +++ b/src/locales/th.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "คลิกเพื่อเลือกไฟล์นำเข้า ({extensions})", "previewCount": "จำนวนตัวอย่าง: {count}", "selectedCount": "เลือกแล้ว {count} จาก {totalCount}", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "คุณได้อัปเดตธุรกรรม {count} รายการ", "confirmImportTransactions": "คุณแน่ใจหรือไม่ว่าต้องการนำเข้าธุรกรรม {count} รายการ?", "importingTransactions": "กำลังนำเข้า ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "Bubble Chart", "Candlestick Chart": "กราฟแท่งเทียน", "Sankey Chart": "Sankey Chart", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "จัดเรียงตาม", "Map": "แผนที่", "Provider": "ผู้ให้บริการ", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "รายการบัญชี", "This Week": "สัปดาห์นี้", "This Month": "เดือนนี้", diff --git a/src/locales/tr.json b/src/locales/tr.json index 0a894d1f..dc933f75 100644 --- a/src/locales/tr.json +++ b/src/locales/tr.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "İçe aktarılacak dosyayı seçmek için tıklayın ({extensions})", "previewCount": "Önizleme Sayısı: {count}", "selectedCount": "{totalCount} öğeden {count} tanesi seçildi", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "{count} işlemi güncellediniz", "confirmImportTransactions": "{count} işlemi içe aktarmak istediğinize emin misiniz?", "importingTransactions": "İçe aktarılıyor (%{process})", @@ -1552,6 +1553,13 @@ "Bubble Chart": "Kabarcık Grafiği", "Candlestick Chart": "Mum Grafiği", "Sankey Chart": "Sankey Diyagramı", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "Sıralama ölçütü", "Map": "Harita", "Provider": "Sağlayıcı", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "Hesap Listesi", "This Week": "Bu Hafta", "This Month": "Bu Ay", diff --git a/src/locales/uk.json b/src/locales/uk.json index 5e1e73a0..0db65c9b 100644 --- a/src/locales/uk.json +++ b/src/locales/uk.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "Натисніть, щоб вибрати файл для імпорту ({extensions})", "previewCount": "Preview Count: {count}", "selectedCount": "Вибрано {count} з {totalCount}", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "Ви оновили {count} транзакцій", "confirmImportTransactions": "Ви впевнені, що хочете імпортувати {count} транзакцій?", "importingTransactions": "Importing ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "Bubble Chart", "Candlestick Chart": "Candlestick Chart", "Sankey Chart": "Sankey Chart", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "Сортувати за", "Map": "Карта", "Provider": "Провайдер", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "Список рахунків", "This Week": "Цього тижня", "This Month": "Цього місяця", diff --git a/src/locales/vi.json b/src/locales/vi.json index fc5dc745..ae64b9b5 100644 --- a/src/locales/vi.json +++ b/src/locales/vi.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "Nhấp để chọn tệp nhập khẩu ({extensions})", "previewCount": "Preview Count: {count}", "selectedCount": "Đã chọn {count} trên {totalCount}", + "queryIndex": "Query #{index}", "youHaveUpdatedTransactions": "Bạn đã cập nhật {count} giao dịch", "confirmImportTransactions": "Bạn có chắc chắn muốn nhập {count} giao dịch không?", "importingTransactions": "Importing ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "Bubble Chart", "Candlestick Chart": "Candlestick Chart", "Sankey Chart": "Sankey Chart", + "Column Chart (Stacked)": "Column Chart (Stacked)", + "Column Chart (100% Stacked)": "Column Chart (100% Stacked)", + "Column Chart (Grouped)": "Column Chart (Grouped)", + "Line Chart (Grouped)": "Line Chart (Grouped)", + "Area Chart (Stacked)": "Area Chart (Stacked)", + "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", + "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", "Sort by": "Sắp xếp theo", "Map": "Bản đồ", "Provider": "Nhà cung cấp", @@ -1706,6 +1714,21 @@ "Editor": "Editor", "Expression": "Expression", "Failed to generate expression": "Failed to generate expression", + "Axis / Category": "Axis / Category", + "Series": "Series", + "Transaction Date": "Transaction Date", + "Transaction Month": "Transaction Month", + "Transaction Quarter": "Transaction Quarter", + "Transaction Year": "Transaction Year", + "Transaction Fiscal Year": "Transaction Fiscal Year", + "Source Account Category": "Source Account Category", + "Source Account Currency": "Source Account Currency", + "Destination Account Category": "Destination Account Category", + "Destination Account Currency": "Destination Account Currency", + "Value Metric": "Value Metric", + "Transaction Count": "Transaction Count", + "Average Amount": "Average Amount", + "Median Amount": "Median Amount", "Account List": "Danh sách tài khoản", "This Week": "Tuần này", "This Month": "Tháng này", diff --git a/src/locales/zh_Hans.json b/src/locales/zh_Hans.json index 9773cd25..6a462ee0 100644 --- a/src/locales/zh_Hans.json +++ b/src/locales/zh_Hans.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "点击选择导入文件 ({extensions})", "previewCount": "预览数量: {count}", "selectedCount": "已选择 {count} / {totalCount}", + "queryIndex": "查询 #{index}", "youHaveUpdatedTransactions": "您已经更新 {count} 个交易", "confirmImportTransactions": "您确定要导入 {count} 个交易?", "importingTransactions": "正在导入 ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "气泡图", "Candlestick Chart": "K线图", "Sankey Chart": "桑基图", + "Column Chart (Stacked)": "柱状图(堆叠)", + "Column Chart (100% Stacked)": "柱状图(100%堆叠)", + "Column Chart (Grouped)": "柱状图(分组)", + "Line Chart (Grouped)": "折线图(分组)", + "Area Chart (Stacked)": "面积图(堆叠)", + "Area Chart (100% Stacked)": "面积图(100%堆叠)", + "Bubble Chart (Grouped)": "气泡图(分组)", "Sort by": "排序方式", "Map": "地图", "Provider": "提供者", @@ -1706,6 +1714,21 @@ "Editor": "编辑器", "Expression": "表达式", "Failed to generate expression": "生成表达式失败", + "Axis / Category": "轴 / 分类", + "Series": "系列", + "Transaction Date": "交易日期", + "Transaction Month": "交易月份", + "Transaction Quarter": "交易季度", + "Transaction Year": "交易年份", + "Transaction Fiscal Year": "交易财年", + "Source Account Category": "来源账户分类", + "Source Account Currency": "来源账户货币", + "Destination Account Category": "目标账户分类", + "Destination Account Currency": "目标账户货币", + "Value Metric": "值类型", + "Transaction Count": "交易数量", + "Average Amount": "平均金额", + "Median Amount": "中位数金额", "Account List": "账户列表", "This Week": "本周", "This Month": "本月", diff --git a/src/locales/zh_Hant.json b/src/locales/zh_Hant.json index 752b2d44..e906052b 100644 --- a/src/locales/zh_Hant.json +++ b/src/locales/zh_Hant.json @@ -129,6 +129,7 @@ "clickToSelectedFile": "點擊選擇匯入檔案 ({extensions})", "previewCount": "預覽數量: {count}", "selectedCount": "已選擇 {count} / {totalCount}", + "queryIndex": "查詢 #{index}", "youHaveUpdatedTransactions": "您已經更新 {count} 個交易", "confirmImportTransactions": "您確定要匯入 {count} 個交易?", "importingTransactions": "正在匯入 ({process}%)", @@ -1552,6 +1553,13 @@ "Bubble Chart": "氣泡圖", "Candlestick Chart": "K線圖", "Sankey Chart": "桑基圖", + "Column Chart (Stacked)": "柱狀圖(堆疊)", + "Column Chart (100% Stacked)": "柱狀圖(100%堆疊)", + "Column Chart (Grouped)": "柱狀圖(分組)", + "Line Chart (Grouped)": "折線圖(分組)", + "Area Chart (Stacked)": "面積圖(堆疊)", + "Area Chart (100% Stacked)": "面積圖(100%堆疊)", + "Bubble Chart (Grouped)": "氣泡圖(分組)", "Sort by": "排序方式", "Map": "地圖", "Provider": "提供者", @@ -1706,6 +1714,21 @@ "Editor": "編輯器", "Expression": "表達式", "Failed to generate expression": "產生表達式失敗", + "Axis / Category": "軸 / 類別", + "Series": "系列", + "Transaction Date": "交易日期", + "Transaction Month": "交易月份", + "Transaction Quarter": "交易季度", + "Transaction Year": "交易年份", + "Transaction Fiscal Year": "交易財政年度", + "Source Account Category": "來源帳戶分類", + "Source Account Currency": "來源帳戶貨幣", + "Destination Account Category": "目標帳戶分類", + "Destination Account Currency": "目標帳戶貨幣", + "Value Metric": "值類型", + "Transaction Count": "交易數量", + "Average Amount": "平均金額", + "Median Amount": "中位數金額", "Account List": "帳戶清單", "This Week": "本週", "This Month": "本月", diff --git a/src/stores/explore.ts b/src/stores/explore.ts index f73aa5ee..3b91c007 100644 --- a/src/stores/explore.ts +++ b/src/stores/explore.ts @@ -6,9 +6,22 @@ import { useUserStore } from './user.ts'; import { useAccountsStore } from './account.ts'; import { useTransactionCategoriesStore } from './transactionCategory.ts'; import { useTransactionTagsStore } from './transactionTag.ts'; +import { useExchangeRatesStore } from './exchangeRates.ts'; +import { itemAndIndex, values } from '@/core/base.ts'; +import { AmountFilterType } from '@/core/numeral.ts'; import { DateRangeScene, DateRange } from '@/core/datetime.ts'; -import { DEFAULT_TRANSACTION_EXPLORE_DATE_RANGE } from '@/core/explore.ts'; +import { AccountCategory } from '@/core/account.ts'; +import { TransactionType } from '@/core/transaction.ts'; +import { + TransactionExploreChartTypeValue, + TransactionExploreChartType, + TransactionExploreDataDimensionType, + TransactionExploreDataDimension, + TransactionExploreValueMetricType, + TransactionExploreValueMetric, + DEFAULT_TRANSACTION_EXPLORE_DATE_RANGE +} from '@/core/explore.ts'; import { type Account } from '@/models/account.ts'; import { type TransactionCategory } from '@/models/transaction_category.ts'; @@ -21,16 +34,40 @@ import { TransactionExploreQuery } from '@/models/explore.ts'; -import { isInteger, isEquals } from '@/lib/common.ts'; -import { getDateRangeByDateType } from '@/lib/datetime.ts'; +import { + isDefined, + isNumber, + isInteger, + isEquals, +} from '@/lib/common.ts'; +import { + getYearFirstUnixTimeBySpecifiedUnixTime, + getQuarterFirstUnixTimeBySpecifiedUnixTime, + getMonthFirstUnixTimeBySpecifiedUnixTime, + getDayFirstUnixTimeBySpecifiedUnixTime, + getDateRangeByDateType, + getFiscalYearStartUnixTime +} from '@/lib/datetime.ts'; import services from '@/lib/services.ts'; import logger from '@/lib/logger.ts'; +export enum TransactionExploreDimensionType { + TransactionType = 'transactionType', + Category = 'category', + Account = 'account', + Amount = 'amount', + Other = 'other' +} + export interface TransactionExplorePartialFilter { dateRangeType?: number; startTime?: number; endTime?: number; queryId?: string; + chartType?: TransactionExploreChartTypeValue; + categoryDimension?: TransactionExploreDataDimensionType; + seriesDimension?: TransactionExploreDataDimensionType; + valueMetric?: TransactionExploreValueMetricType; } export interface TransactionExploreFilter extends TransactionExplorePartialFilter { @@ -38,6 +75,42 @@ export interface TransactionExploreFilter extends TransactionExplorePartialFilte startTime: number; endTime: number; query: TransactionExploreQuery[]; + chartType: TransactionExploreChartTypeValue; + categoryDimension: TransactionExploreDataDimensionType; + seriesDimension: TransactionExploreDataDimensionType; + valueMetric: TransactionExploreValueMetricType; +} + +export interface CategoriedInfo { + categoryName: string; + categoryNameNeedI18n?: boolean; + categoryNameI18nParameters?: Record; + categoryId: string; + categoryIdType: TransactionExploreDimensionType; +} + +export interface CategoriedTransactions extends CategoriedInfo { + trasactions: Record; +} + +export interface CategoriedTransactionExploreData extends CategoriedInfo { + data: CategoriedTransactionExploreDataItem[]; +} + +export interface SeriesedInfo { + seriesName: string; + seriesNameNeedI18n?: boolean; + seriesNameI18nParameters?: Record; + seriesId: string; + seriesIdType: TransactionExploreDimensionType; +} + +export interface SeriesedTransactions extends SeriesedInfo { + trasactions: TransactionInsightDataItem[]; +} + +export interface CategoriedTransactionExploreDataItem extends SeriesedInfo { + value: number; } export const useExploresStore = defineStore('explores', () => { @@ -46,12 +119,225 @@ export const useExploresStore = defineStore('explores', () => { const accountsStore = useAccountsStore(); const transactionCategoriesStore = useTransactionCategoriesStore(); const transactionTagsStore = useTransactionTagsStore(); + const exchangeRatesStore = useExchangeRatesStore(); + + function getDataCategoryInfo(dimension: TransactionExploreDataDimension, queryName: string, queryIndex: number, transaction: TransactionInsightDataItem): CategoriedInfo { + if (dimension === TransactionExploreDataDimension.None) { + const valueMetric = TransactionExploreValueMetric.valueOf(transactionExploreFilter.value.valueMetric); + return { + categoryName: valueMetric?.name ?? 'Unknown', + categoryNameNeedI18n: true, + categoryId: 'none', + categoryIdType: TransactionExploreDimensionType.Other + }; + } else if (dimension === TransactionExploreDataDimension.Query) { + if (queryName) { + return { + categoryName: queryName, + categoryId: (queryIndex + 1).toString(10), + categoryIdType: TransactionExploreDimensionType.Other + }; + } else { + return { + categoryName: `format.misc.queryIndex`, + categoryNameNeedI18n: true, + categoryNameI18nParameters: { + index: (queryIndex + 1).toString(10) + }, + categoryId: (queryIndex + 1).toString(10), + categoryIdType: TransactionExploreDimensionType.Other + }; + } + } else if (dimension === TransactionExploreDataDimension.DateTime) { + const unixTime = transaction.time.toString(10); + + return { + categoryName: unixTime, + categoryId: unixTime, + categoryIdType: TransactionExploreDimensionType.Other + }; + } else if (dimension === TransactionExploreDataDimension.DateTimeByDay) { + const unixTime = getDayFirstUnixTimeBySpecifiedUnixTime(transaction.time).toString(10); + + return { + categoryName: unixTime, + categoryId: unixTime, + categoryIdType: TransactionExploreDimensionType.Other + }; + } else if (dimension === TransactionExploreDataDimension.DateTimeByMonth) { + const unixTime = getMonthFirstUnixTimeBySpecifiedUnixTime(transaction.time).toString(10); + + return { + categoryName: unixTime, + categoryId: unixTime, + categoryIdType: TransactionExploreDimensionType.Other + }; + } else if (dimension === TransactionExploreDataDimension.DateTimeByQuarter) { + const unixTime = getQuarterFirstUnixTimeBySpecifiedUnixTime(transaction.time).toString(10); + + return { + categoryName: unixTime, + categoryId: unixTime, + categoryIdType: TransactionExploreDimensionType.Other + }; + } else if (dimension === TransactionExploreDataDimension.DateTimeByYear) { + const unixTime = getYearFirstUnixTimeBySpecifiedUnixTime(transaction.time).toString(10); + + return { + categoryName: unixTime, + categoryId: unixTime, + categoryIdType: TransactionExploreDimensionType.Other + }; + } else if (dimension === TransactionExploreDataDimension.DateTimeByFiscalYear) { + const unixTime = getFiscalYearStartUnixTime(transaction.time, userStore.currentUserFiscalYearStart).toString(10); + + return { + categoryName: unixTime, + categoryId: unixTime, + categoryIdType: TransactionExploreDimensionType.Other + }; + } else if (dimension === TransactionExploreDataDimension.TransactionType) { + let transactionTypeName = 'Unknown'; + + if (transaction.type === TransactionType.ModifyBalance) { + transactionTypeName = 'Modify Balance'; + } else if (transaction.type === TransactionType.Income) { + transactionTypeName = 'Income'; + } else if (transaction.type === TransactionType.Expense) { + transactionTypeName = 'Expense'; + } else if (transaction.type === TransactionType.Transfer) { + transactionTypeName = 'Transfer'; + } + + return { + categoryName: transactionTypeName, + categoryNameNeedI18n: true, + categoryId: transaction.type.toString(10), + categoryIdType: TransactionExploreDimensionType.TransactionType + }; + } else if (dimension === TransactionExploreDataDimension.SourceAccount) { + return { + categoryName: transaction.sourceAccountName || 'Unknown', + categoryNameNeedI18n: !transaction.sourceAccountName, + categoryId: transaction.sourceAccountId || 'unknown', + categoryIdType: TransactionExploreDimensionType.Account + }; + } else if (dimension === TransactionExploreDataDimension.SourceAccountCategory) { + const accountCategory = AccountCategory.valueOf(transaction.sourceAccount.category); + + return { + categoryName: accountCategory?.name || 'Unknown', + categoryNameNeedI18n: true, + categoryId: accountCategory?.type.toString(10) || 'unknown', + categoryIdType: TransactionExploreDimensionType.Other + }; + } else if (dimension === TransactionExploreDataDimension.SourceAccountCurrency) { + return { + categoryName: transaction.sourceAccount.currency || 'Unknown', + categoryNameNeedI18n: !transaction.sourceAccount.currency, + categoryId: transaction.sourceAccount.currency || 'unknown', + categoryIdType: TransactionExploreDimensionType.Other + }; + } else if (dimension === TransactionExploreDataDimension.DestinationAccount) { + return { + categoryName: transaction.type === TransactionType.Transfer ? (transaction.destinationAccountName || 'Unknown') : 'None', + categoryNameNeedI18n: transaction.type !== TransactionType.Transfer || !transaction.destinationAccountName, + categoryId: transaction.type === TransactionType.Transfer ? (transaction.destinationAccountId || 'unknown') : 'none', + categoryIdType: TransactionExploreDimensionType.Account + }; + } else if (dimension === TransactionExploreDataDimension.DestinationAccountCategory) { + const accountCategory = transaction.type === TransactionType.Transfer && transaction.destinationAccount ? AccountCategory.valueOf(transaction.destinationAccount.category) : undefined; + + return { + categoryName: transaction.type === TransactionType.Transfer ? (accountCategory?.name || 'Unknown') : 'None', + categoryNameNeedI18n: true, + categoryId: transaction.type === TransactionType.Transfer ? (accountCategory?.name || 'unknown') : 'none', + categoryIdType: TransactionExploreDimensionType.Other + }; + } else if (dimension === TransactionExploreDataDimension.DestinationAccountCurrency) { + return { + categoryName: transaction.type === TransactionType.Transfer ? (transaction.destinationAccount?.currency || 'Unknown') : 'None', + categoryNameNeedI18n: transaction.type !== TransactionType.Transfer || !transaction.destinationAccount?.currency, + categoryId: transaction.type === TransactionType.Transfer ? (transaction.destinationAccount?.currency || 'unknown') : 'none', + categoryIdType: TransactionExploreDimensionType.Other + }; + } else if (dimension === TransactionExploreDataDimension.PrimaryCategory) { + return { + categoryName: transaction.primaryCategory.name, + categoryId: transaction.primaryCategory.id, + categoryIdType: TransactionExploreDimensionType.Category + }; + } else if (dimension === TransactionExploreDataDimension.SecondaryCategory) { + return { + categoryName: transaction.secondaryCategory.name, + categoryId: transaction.categoryId, + categoryIdType: TransactionExploreDimensionType.Category + }; + } else if (dimension === TransactionExploreDataDimension.SourceAmount) { + return { + categoryName: transaction.sourceAmount.toString(10), + categoryId: transaction.sourceAmount.toString(10), + categoryIdType: TransactionExploreDimensionType.Amount + }; + } else if (dimension === TransactionExploreDataDimension.DestinationAmount) { + return { + categoryName: transaction.type === TransactionType.Transfer ? transaction.destinationAmount.toString(10) : 'None', + categoryNameNeedI18n: transaction.type !== TransactionType.Transfer, + categoryId: transaction.type === TransactionType.Transfer ? transaction.destinationAmount.toString(10) : 'none', + categoryIdType: TransactionExploreDimensionType.Other + }; + } else { + return { + categoryName: '', + categoryId: '', + categoryIdType: TransactionExploreDimensionType.Other + }; + } + } + + function addTransactionToCategoriedDataMap(categoriedDataMap: Record, categoryDimension: TransactionExploreDataDimension, seriesDemension: TransactionExploreDataDimension, queryName: string, queryIndex: number, transaction: TransactionInsightDataItem): void { + const categoriedInfo = getDataCategoryInfo(categoryDimension, queryName, queryIndex, transaction); + let categoriedData = categoriedDataMap[categoriedInfo.categoryId]; + + if (!categoriedData) { + categoriedData = { + categoryName: categoriedInfo.categoryName, + categoryNameNeedI18n: categoriedInfo.categoryNameNeedI18n, + categoryNameI18nParameters: categoriedInfo.categoryNameI18nParameters, + categoryId: categoriedInfo.categoryId, + categoryIdType: categoriedInfo.categoryIdType, + trasactions: {} + }; + categoriedDataMap[categoriedInfo.categoryId] = categoriedData; + } + + const seriesedInfo = getDataCategoryInfo(seriesDemension, queryName, queryIndex, transaction); + let seriesedData = categoriedData.trasactions[seriesedInfo.categoryId]; + + if (!seriesedData) { + seriesedData = { + seriesName: seriesedInfo.categoryName, + seriesNameNeedI18n: seriesedInfo.categoryNameNeedI18n, + seriesNameI18nParameters: seriesedInfo.categoryNameI18nParameters, + seriesId: seriesedInfo.categoryId, + seriesIdType: seriesedInfo.categoryIdType, + trasactions: [] + }; + categoriedData.trasactions[seriesedInfo.categoryId] = seriesedData; + } + + seriesedData.trasactions.push(transaction); + } const transactionExploreFilter = ref({ dateRangeType: DEFAULT_TRANSACTION_EXPLORE_DATE_RANGE.type, startTime: 0, endTime: 0, - query: [] + query: [], + categoryDimension: TransactionExploreDataDimension.CategoryDimensionDefault.value, + seriesDimension: TransactionExploreDataDimension.SeriesDimensionDefault.value, + valueMetric: TransactionExploreValueMetric.Default.value, + chartType: TransactionExploreChartType.Default.value }); const transactionExploreAllData = ref([]); @@ -154,6 +440,156 @@ export const useExploresStore = defineStore('explores', () => { return result; }); + const categoriedTransactions = computed>(() => { + if (!allTransactions.value || allTransactions.value.length < 1) { + return {}; + } + + const chartType = TransactionExploreChartType.valueOf(transactionExploreFilter.value.chartType); + const categoryDimension = TransactionExploreDataDimension.valueOf(transactionExploreFilter.value.categoryDimension); + const seriesDimension = chartType?.seriesDimensionRequired ? TransactionExploreDataDimension.valueOf(transactionExploreFilter.value.seriesDimension) : TransactionExploreDataDimension.SeriesDimensionDefault; + + if (!chartType || !categoryDimension || !seriesDimension) { + return {}; + } + + const categoriedDataMap: Record = {}; + + for (const transaction of allTransactions.value) { + if (!transactionExploreFilter.value.query || transactionExploreFilter.value.query.length < 1) { + addTransactionToCategoriedDataMap(categoriedDataMap, categoryDimension, seriesDimension, '', 0, transaction); + continue; + } + + for (const [query, index] of itemAndIndex(transactionExploreFilter.value.query)) { + if (query.match(transaction)) { + addTransactionToCategoriedDataMap(categoriedDataMap, categoryDimension, seriesDimension, query.name, index, transaction); + + if (categoryDimension !== TransactionExploreDataDimension.Query) { + break; + } + } + } + } + + return categoriedDataMap; + }); + + const categoriedTransactionExploreData = computed(() => { + if (!allTransactions.value || allTransactions.value.length < 1) { + return []; + } + + const chartType = TransactionExploreChartType.valueOf(transactionExploreFilter.value.chartType); + const categoryDimension = TransactionExploreDataDimension.valueOf(transactionExploreFilter.value.categoryDimension); + const seriesDimension = chartType?.seriesDimensionRequired ? TransactionExploreDataDimension.valueOf(transactionExploreFilter.value.seriesDimension) : TransactionExploreDataDimension.SeriesDimensionDefault; + const valueMetric = TransactionExploreValueMetric.valueOf(transactionExploreFilter.value.valueMetric); + + if (!chartType || !categoryDimension || !seriesDimension || !valueMetric) { + return []; + } + + const defaultCurrency = userStore.currentUserDefaultCurrency; + const result: CategoriedTransactionExploreData[] = []; + const categoriedDataMap = categoriedTransactions.value; + + for (const categoriedTransactions of values(categoriedDataMap)) { + const dataItems: CategoriedTransactionExploreDataItem[] = []; + let allSeriesedTransactions: Record = categoriedTransactions.trasactions; + + // merge all series into one for pie/radar chart + if (chartType === TransactionExploreChartType.Pie || chartType === TransactionExploreChartType.Radar) { + const transactions: TransactionInsightDataItem[] = []; + + for (const seriesedTransactions of values(categoriedTransactions.trasactions)) { + transactions.push(...seriesedTransactions.trasactions); + } + + allSeriesedTransactions = {}; + allSeriesedTransactions['none'] = { + seriesName: valueMetric?.name ?? 'Unknown', + seriesNameNeedI18n: true, + seriesId: 'none', + seriesIdType: TransactionExploreDimensionType.Other, + trasactions: transactions + }; + } + + for (const seriesedTransactions of values(allSeriesedTransactions)) { + const allSourceAmountsInDefaultCurrency: number[] = []; + let totalSourceAmountSumInDefaultCurrency: number = 0; + let minimumSourceAmountInDefaultCurrency: number = Number.MAX_SAFE_INTEGER; + let maximumSourceAmountInDefaultCurrency: number = Number.MIN_SAFE_INTEGER; + + for (const transaction of seriesedTransactions.trasactions) { + let amountInDefaultCurrency: number = transaction.sourceAmount; + + if (transaction.sourceAccount.currency !== defaultCurrency) { + const amount = exchangeRatesStore.getExchangedAmount(transaction.sourceAmount, transaction.sourceAccount.currency, defaultCurrency); + + if (isNumber(amount)) { + amountInDefaultCurrency = Math.trunc(amount); + } else { + continue; + } + } + + allSourceAmountsInDefaultCurrency.push(amountInDefaultCurrency); + totalSourceAmountSumInDefaultCurrency += amountInDefaultCurrency; + + if (amountInDefaultCurrency >= 0 && amountInDefaultCurrency < minimumSourceAmountInDefaultCurrency) { + minimumSourceAmountInDefaultCurrency = amountInDefaultCurrency; + } + + if (amountInDefaultCurrency > maximumSourceAmountInDefaultCurrency) { + maximumSourceAmountInDefaultCurrency = amountInDefaultCurrency; + } + } + + let value: number = 0; + + if (valueMetric === TransactionExploreValueMetric.TransactionCount) { + value = allSourceAmountsInDefaultCurrency.length; + } else if (valueMetric === TransactionExploreValueMetric.SourceAmountSum) { + value = totalSourceAmountSumInDefaultCurrency; + } else if (valueMetric === TransactionExploreValueMetric.SourceAmountAverage) { + value = allSourceAmountsInDefaultCurrency.length > 0 ? Math.trunc(totalSourceAmountSumInDefaultCurrency / allSourceAmountsInDefaultCurrency.length) : 0; + } else if (valueMetric === TransactionExploreValueMetric.SourceAmountMedian) { + if (allSourceAmountsInDefaultCurrency.length > 0) { + allSourceAmountsInDefaultCurrency.sort((a, b) => a - b); + value = allSourceAmountsInDefaultCurrency[Math.floor(allSourceAmountsInDefaultCurrency.length / 2)] as number; + } else { + value = 0; + } + } else if (valueMetric === TransactionExploreValueMetric.SourceAmountMinimum) { + value = minimumSourceAmountInDefaultCurrency === Number.MAX_SAFE_INTEGER ? 0 : minimumSourceAmountInDefaultCurrency; + } else if (valueMetric === TransactionExploreValueMetric.SourceAmountMaximum) { + value = maximumSourceAmountInDefaultCurrency === Number.MIN_SAFE_INTEGER ? 0 : maximumSourceAmountInDefaultCurrency; + } + + dataItems.push({ + seriesName: seriesedTransactions.seriesName, + seriesNameNeedI18n: seriesedTransactions.seriesNameNeedI18n, + seriesNameI18nParameters: seriesedTransactions.seriesNameI18nParameters, + seriesId: seriesedTransactions.seriesId, + seriesIdType: seriesedTransactions.seriesIdType, + value: value + }); + } + + result.push({ + categoryName: categoriedTransactions.categoryName, + categoryNameNeedI18n: categoriedTransactions.categoryNameNeedI18n, + categoryNameI18nParameters: categoriedTransactions.categoryNameI18nParameters, + categoryId: categoriedTransactions.categoryId, + categoryIdType: categoriedTransactions.categoryIdType, + data: dataItems + }); + } + + return result; + }); + function updateTransactionExploreInvalidState(invalidState: boolean): void { transactionExploreStateInvalid.value = invalidState; } @@ -163,6 +599,10 @@ export const useExploresStore = defineStore('explores', () => { transactionExploreFilter.value.startTime = 0; transactionExploreFilter.value.endTime = 0; transactionExploreFilter.value.query = []; + transactionExploreFilter.value.chartType = TransactionExploreChartType.Default.value; + transactionExploreFilter.value.categoryDimension = TransactionExploreDataDimension.CategoryDimensionDefault.value; + transactionExploreFilter.value.seriesDimension = TransactionExploreDataDimension.SeriesDimensionDefault.value; + transactionExploreFilter.value.valueMetric = TransactionExploreValueMetric.Default.value; transactionExploreAllData.value = []; transactionExploreStateInvalid.value = true; } @@ -205,6 +645,10 @@ export const useExploresStore = defineStore('explores', () => { if (resetQuery) { transactionExploreFilter.value.query = []; + transactionExploreFilter.value.chartType = TransactionExploreChartType.Default.value; + transactionExploreFilter.value.categoryDimension = TransactionExploreDataDimension.CategoryDimensionDefault.value; + transactionExploreFilter.value.seriesDimension = TransactionExploreDataDimension.SeriesDimensionDefault.value; + transactionExploreFilter.value.valueMetric = TransactionExploreValueMetric.Default.value; } } @@ -226,6 +670,31 @@ export const useExploresStore = defineStore('explores', () => { changed = true; } + if (filter && isDefined(filter.chartType) && transactionExploreFilter.value.chartType !== filter.chartType) { + transactionExploreFilter.value.chartType = filter.chartType; + changed = true; + } + + if (filter && isDefined(filter.categoryDimension) && transactionExploreFilter.value.categoryDimension !== filter.categoryDimension) { + transactionExploreFilter.value.categoryDimension = filter.categoryDimension; + changed = true; + } + + if (filter && isDefined(filter.seriesDimension) && transactionExploreFilter.value.seriesDimension !== filter.seriesDimension) { + transactionExploreFilter.value.seriesDimension = filter.seriesDimension; + changed = true; + } + + if (filter && isDefined(filter.valueMetric) && transactionExploreFilter.value.valueMetric !== filter.valueMetric) { + transactionExploreFilter.value.valueMetric = filter.valueMetric; + changed = true; + } + + if (transactionExploreFilter.value.seriesDimension === transactionExploreFilter.value.categoryDimension && transactionExploreFilter.value.seriesDimension !== TransactionExploreDataDimension.SeriesDimensionDefault.value) { + transactionExploreFilter.value.seriesDimension = TransactionExploreDataDimension.SeriesDimensionDefault.value; + changed = true; + } + return changed; } @@ -247,6 +716,28 @@ export const useExploresStore = defineStore('explores', () => { return querys.join('&'); } + function getTransactionListPageParams(dimensionType: TransactionExploreDimensionType, itemId: string): string { + const querys: string[] = []; + + if (dimensionType === TransactionExploreDimensionType.TransactionType) { + querys.push(`type=${itemId}`); + } else if (dimensionType === TransactionExploreDimensionType.Account) { + querys.push(`accountIds=${itemId}`); + } else if (dimensionType === TransactionExploreDimensionType.Category) { + querys.push(`categoryIds=${itemId}`); + } else if (dimensionType === TransactionExploreDimensionType.Amount) { + querys.push(`amountFilter=${encodeURIComponent(AmountFilterType.EqualTo.toTextualFilter(parseInt(itemId)))}`); + } else { + return ''; + } + + querys.push('dateType=' + transactionExploreFilter.value.dateRangeType); + querys.push('minTime=' + transactionExploreFilter.value.startTime); + querys.push('maxTime=' + transactionExploreFilter.value.endTime); + + return querys.join('&'); + } + function loadAllTransactions({ force }: { force: boolean }): Promise { return new Promise((resolve, reject) => { services.getAllTransactions({ @@ -292,12 +783,14 @@ export const useExploresStore = defineStore('explores', () => { transactionExploreStateInvalid, // computed filteredTransactions, + categoriedTransactionExploreData, // functions updateTransactionExploreInvalidState, resetTransactionExplores, initTransactionExploreFilter, updateTransactionExploreFilter, getTransactionExplorePageParams, + getTransactionListPageParams, loadAllTransactions }; }); diff --git a/src/views/desktop/insights/ExplorePage.vue b/src/views/desktop/insights/ExplorePage.vue index 3baa6190..42db3ea1 100644 --- a/src/views/desktop/insights/ExplorePage.vue +++ b/src/views/desktop/insights/ExplorePage.vue @@ -78,7 +78,7 @@ + v-if="activeTab === 'table' || activeTab === 'chart'"> @@ -102,7 +102,8 @@ v-model:count-per-page="countPerPage" /> - + @@ -127,6 +128,7 @@ diff --git a/src/views/desktop/insights/tabs/ExploreQueryTab.vue b/src/views/desktop/insights/tabs/ExploreQueryTab.vue index 6617c6b1..71bd1b5c 100644 --- a/src/views/desktop/insights/tabs/ExploreQueryTab.vue +++ b/src/views/desktop/insights/tabs/ExploreQueryTab.vue @@ -15,11 +15,11 @@ - {{ query.name || `${tt('Query')} #${queryIndex + 1}` }} + {{ query.name || tt('format.misc.queryIndex', { index: queryIndex + 1 }) }}