From b87a39464e3dfd47d652ab5dda6ab4c2979f914d Mon Sep 17 00:00:00 2001 From: MaysWind Date: Thu, 23 Apr 2026 01:25:23 +0800 Subject: [PATCH] add tree map chart in insights explorer --- src/components/desktop/TreeMapChart.vue | 242 ++++++++++++++++++ src/core/explorer.ts | 2 + src/desktop-main.ts | 4 + src/locales/de.json | 1 + src/locales/en.json | 1 + src/locales/es.json | 1 + src/locales/fr.json | 1 + src/locales/it.json | 1 + src/locales/ja.json | 1 + src/locales/kn.json | 1 + src/locales/ko.json | 1 + src/locales/nl.json | 1 + src/locales/pt_BR.json | 1 + src/locales/ru.json | 1 + src/locales/sl.json | 1 + src/locales/ta.json | 1 + src/locales/th.json | 1 + src/locales/tr.json | 1 + src/locales/uk.json | 1 + src/locales/vi.json | 1 + src/locales/zh_Hans.json | 1 + src/locales/zh_Hant.json | 1 + .../insights/tabs/ExplorerChartTab.vue | 39 +++ 23 files changed, 306 insertions(+) create mode 100644 src/components/desktop/TreeMapChart.vue diff --git a/src/components/desktop/TreeMapChart.vue b/src/components/desktop/TreeMapChart.vue new file mode 100644 index 00000000..114de62b --- /dev/null +++ b/src/components/desktop/TreeMapChart.vue @@ -0,0 +1,242 @@ + + + + + diff --git a/src/core/explorer.ts b/src/core/explorer.ts index 20748d07..c9a6bd99 100644 --- a/src/core/explorer.ts +++ b/src/core/explorer.ts @@ -382,6 +382,7 @@ export enum TransactionExplorerChartTypeValue { Area100PercentStacked = 'area100%Stacked', BubbleGrouped = 'bubbleGrouped', Radar = 'radar', + Treemap = 'treemap', Heatmap = 'heatmap', CalendarHeatmap = 'calendarHeatmap' } @@ -399,6 +400,7 @@ export class TransactionExplorerChartType implements NameValue { public static readonly AreaStacked = new TransactionExplorerChartType('Area Chart (Stacked)', TransactionExplorerChartTypeValue.AreaStacked, undefined, true, undefined); public static readonly Area100PercentStacked = new TransactionExplorerChartType('Area Chart (100% Stacked)', TransactionExplorerChartTypeValue.Area100PercentStacked, undefined, true, undefined); public static readonly BubbleGrouped = new TransactionExplorerChartType('Bubble Chart (Grouped)', TransactionExplorerChartTypeValue.BubbleGrouped, undefined, true, undefined); + public static readonly Treemap = new TransactionExplorerChartType('Treemap Chart', TransactionExplorerChartTypeValue.Treemap, undefined, true, undefined); public static readonly Heatmap = new TransactionExplorerChartType('Heatmap Chart', TransactionExplorerChartTypeValue.Heatmap, undefined, true, undefined); public static readonly CalendarHeatmap = new TransactionExplorerChartType('Calendar Heatmap Chart', TransactionExplorerChartTypeValue.CalendarHeatmap, TransactionExplorerDataDimensionType.DateTimeByYearMonthDay, false, ChartSortingType.DisplayOrder.type); diff --git a/src/desktop-main.ts b/src/desktop-main.ts index 77bac5a3..e133276e 100644 --- a/src/desktop-main.ts +++ b/src/desktop-main.ts @@ -60,6 +60,7 @@ import { BoxplotChart, CandlestickChart, RadarChart, + TreemapChart, HeatmapChart, SankeyChart } from 'echarts/charts'; @@ -115,6 +116,7 @@ import PieChartComponent from '@/components/desktop/PieChart.vue'; import RadarChartComponent from '@/components/desktop/RadarChart.vue'; import AxisChart from '@/components/desktop/AxisChart.vue'; import TrendsChart from '@/components/desktop/TrendsChart.vue'; +import TreeMapChart from '@/components/desktop/TreeMapChart.vue'; import HeatMapChart from '@/components/desktop/HeatMapChart.vue'; import CalendarHeatMapChart from '@/components/desktop/CalendarHeatMapChart.vue'; import RenameDialog from '@/components/desktop/RenameDialog.vue'; @@ -520,6 +522,7 @@ echarts.use([ BoxplotChart, CandlestickChart, RadarChart, + TreemapChart, HeatmapChart, SankeyChart, GridComponent, @@ -568,6 +571,7 @@ app.component('PieChart', PieChartComponent); app.component('RadarChart', RadarChartComponent); app.component('AxisChart', AxisChart); app.component('TrendsChart', TrendsChart); +app.component('TreeMapChart', TreeMapChart); app.component('HeatMapChart', HeatMapChart); app.component('CalendarHeatMapChart', CalendarHeatMapChart); app.component('RenameDialog', RenameDialog); diff --git a/src/locales/de.json b/src/locales/de.json index 6bb75a9a..ee2ad99f 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Flächendiagramm (Gestapelt)", "Area Chart (100% Stacked)": "Flächendiagramm (100% Gestapelt)", "Bubble Chart (Grouped)": "Blasendiagramm (Gruppiert)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "Sortieren nach", diff --git a/src/locales/en.json b/src/locales/en.json index 99163155..faddb388 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Area Chart (Stacked)", "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "Sort by", diff --git a/src/locales/es.json b/src/locales/es.json index 96a3194f..6a53f6ed 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Gráfico de área (apilado)", "Area Chart (100% Stacked)": "Gráfico de área (100 % apilado)", "Bubble Chart (Grouped)": "Gráfico de burbujas (agrupado)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "Ordenar por", diff --git a/src/locales/fr.json b/src/locales/fr.json index bcefd732..a1db59dd 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Area Chart (Stacked)", "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "Trier par", diff --git a/src/locales/it.json b/src/locales/it.json index 9013eb8a..61044507 100644 --- a/src/locales/it.json +++ b/src/locales/it.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Area Chart (Stacked)", "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "Ordina per", diff --git a/src/locales/ja.json b/src/locales/ja.json index 620537e3..475eb29f 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Area Chart (Stacked)", "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "ソート順", diff --git a/src/locales/kn.json b/src/locales/kn.json index 08656fdd..635d1553 100644 --- a/src/locales/kn.json +++ b/src/locales/kn.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Area Chart (Stacked)", "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "ಇದರ ಪ್ರಕಾರ ವಿಂಗಡಿಸಿ", diff --git a/src/locales/ko.json b/src/locales/ko.json index dc1a2205..1e8a0a5a 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "누적 영역 차트", "Area Chart (100% Stacked)": "100% 누적 영역 차트", "Bubble Chart (Grouped)": "그룹화된 버블 차트", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "정렬 기준", diff --git a/src/locales/nl.json b/src/locales/nl.json index c6f9eeed..1b12870c 100644 --- a/src/locales/nl.json +++ b/src/locales/nl.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Area Chart (Stacked)", "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "Sorteren op", diff --git a/src/locales/pt_BR.json b/src/locales/pt_BR.json index a9ce0d7f..b50ac6a6 100644 --- a/src/locales/pt_BR.json +++ b/src/locales/pt_BR.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Gráfico de Área (Empilhado)", "Area Chart (100% Stacked)": "Gráfico de Área (100% Empilhado)", "Bubble Chart (Grouped)": "Gráfico de Bolhas (Agrupado)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "Ordenar por", diff --git a/src/locales/ru.json b/src/locales/ru.json index a821da1d..6ec596fa 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Диаграмма с областями (с накоплением)", "Area Chart (100% Stacked)": "Диаграмма с областями (с 100% накоплением)", "Bubble Chart (Grouped)": "Пузырьковая диаграмма (сгрупированная)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "Сортировать по", diff --git a/src/locales/sl.json b/src/locales/sl.json index fcd9a979..c96bf38b 100644 --- a/src/locales/sl.json +++ b/src/locales/sl.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Naložen ploskovni grafikon", "Area Chart (100% Stacked)": "100-odstotno naložen ploskovni grafikon", "Bubble Chart (Grouped)": "Grupiran mehurčni grafikon", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "Razvrsti po", diff --git a/src/locales/ta.json b/src/locales/ta.json index 00ca8cd2..d5b36ad2 100644 --- a/src/locales/ta.json +++ b/src/locales/ta.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "பரப்பு வரைபடம் (அடுக்கப்பட்ட)", "Area Chart (100% Stacked)": "பரப்பு வரைபடம் (100% அடுக்கப்பட்ட)", "Bubble Chart (Grouped)": "குமிழி வரைபடம் (குழுவாக்கப்பட்ட)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "இதன் வகை வரிசைப்படுத்து", diff --git a/src/locales/th.json b/src/locales/th.json index f11963bd..5fcf1e2f 100644 --- a/src/locales/th.json +++ b/src/locales/th.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Area Chart (Stacked)", "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "จัดเรียงตาม", diff --git a/src/locales/tr.json b/src/locales/tr.json index ec5a7d24..d0c2b70d 100644 --- a/src/locales/tr.json +++ b/src/locales/tr.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Area Chart (Stacked)", "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "Sıralama ölçütü", diff --git a/src/locales/uk.json b/src/locales/uk.json index e35ad1ef..392c181f 100644 --- a/src/locales/uk.json +++ b/src/locales/uk.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Area Chart (Stacked)", "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "Сортувати за", diff --git a/src/locales/vi.json b/src/locales/vi.json index 5882b7e7..56f05f7a 100644 --- a/src/locales/vi.json +++ b/src/locales/vi.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "Area Chart (Stacked)", "Area Chart (100% Stacked)": "Area Chart (100% Stacked)", "Bubble Chart (Grouped)": "Bubble Chart (Grouped)", + "Treemap Chart": "Treemap Chart", "Heatmap Chart": "Heatmap Chart", "Calendar Heatmap Chart": "Calendar Heatmap Chart", "Sort by": "Sắp xếp theo", diff --git a/src/locales/zh_Hans.json b/src/locales/zh_Hans.json index e59bba5a..de8197d8 100644 --- a/src/locales/zh_Hans.json +++ b/src/locales/zh_Hans.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "面积图(堆叠)", "Area Chart (100% Stacked)": "面积图(100%堆叠)", "Bubble Chart (Grouped)": "气泡图(分组)", + "Treemap Chart": "矩形树图", "Heatmap Chart": "热力图", "Calendar Heatmap Chart": "日历热力图", "Sort by": "排序方式", diff --git a/src/locales/zh_Hant.json b/src/locales/zh_Hant.json index 6af48dee..8c1cfe94 100644 --- a/src/locales/zh_Hant.json +++ b/src/locales/zh_Hant.json @@ -1603,6 +1603,7 @@ "Area Chart (Stacked)": "面積圖(堆疊)", "Area Chart (100% Stacked)": "面積圖(100%堆疊)", "Bubble Chart (Grouped)": "氣泡圖(分組)", + "Treemap Chart": "矩形樹狀圖", "Heatmap Chart": "熱力圖", "Calendar Heatmap Chart": "日曆熱力圖", "Sort by": "排序方式", diff --git a/src/views/desktop/insights/tabs/ExplorerChartTab.vue b/src/views/desktop/insights/tabs/ExplorerChartTab.vue index 891ae8d6..8bd5a72a 100644 --- a/src/views/desktop/insights/tabs/ExplorerChartTab.vue +++ b/src/views/desktop/insights/tabs/ExplorerChartTab.vue @@ -181,6 +181,30 @@ v-else-if="!loading" /> + + + + import AxisChart, { type AxisChartDisplayType } from '@/components/desktop/AxisChart.vue'; +import TreeMapChart from '@/components/desktop/TreeMapChart.vue'; import HeatMapChart from '@/components/desktop/HeatMapChart.vue'; import { computed, useTemplateRef } from 'vue'; @@ -269,6 +294,7 @@ import { getCurrentDateTime, parseDateTimeFromString } from '@/lib/datetime.ts'; import { sortStatisticsItems } from '@/lib/statistics.ts'; type AxisChartType = InstanceType; +type TreeMapChartType = InstanceType; type HeatMapChartType = InstanceType; interface InsightsExplorerDataTableTabProps { @@ -332,6 +358,7 @@ const userStore = useUserStore(); const explorersStore = useExplorersStore(); const axisChart = useTemplateRef('axisChart'); +const treemapChart = useTemplateRef('treemapChart'); const heatmapChart = useTemplateRef('heatmapChart'); const defaultCurrency = computed(() => userStore.currentUserDefaultCurrency); @@ -933,6 +960,18 @@ function buildExportResults(): { headers: string[], data: string[][], supportedM data: results.data, supportedMermaidCharts: supportedMermaidCharts }; + } else if (TransactionExplorerChartType.valueOf(currentExplorer.value.chartType)?.seriesDimensionRequired && currentExplorer.value.chartType === TransactionExplorerChartType.Treemap.value) { + const results = treemapChart.value?.exportData(); + + if (!results) { + return undefined; + } + + return { + headers: results.headers, + data: results.data, + supportedMermaidCharts: undefined + }; } else if (TransactionExplorerChartType.valueOf(currentExplorer.value.chartType)?.seriesDimensionRequired && currentExplorer.value.chartType === TransactionExplorerChartType.Heatmap.value) { const results = heatmapChart.value?.exportData();