From fb05e86db72740933292f105da3fce43b8fafb1f Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 3 Jan 2023 14:08:52 +0900 Subject: [PATCH] :art: --- packages/frontend/src/components/MkChart.vue | 13 ++-- .../frontend/src/components/MkChartLegend.vue | 75 +++++++++++++++++++ .../frontend/src/pages/user/activity.pv.vue | 15 ++-- packages/frontend/src/scripts/chart-legend.ts | 12 +++ packages/frontend/src/scripts/chart-vline.ts | 4 +- 5 files changed, 103 insertions(+), 16 deletions(-) create mode 100644 packages/frontend/src/components/MkChartLegend.vue create mode 100644 packages/frontend/src/scripts/chart-legend.ts diff --git a/packages/frontend/src/components/MkChart.vue b/packages/frontend/src/components/MkChart.vue index c0562f02e3..ea28cfa794 100644 --- a/packages/frontend/src/components/MkChart.vue +++ b/packages/frontend/src/components/MkChart.vue @@ -1,6 +1,7 @@ @@ -20,6 +21,8 @@ import { useChartTooltip } from '@/scripts/use-chart-tooltip'; import { chartVLine } from '@/scripts/chart-vline'; import { alpha } from '@/scripts/color'; import { initChart } from '@/scripts/init-chart'; +import { chartLegend } from '@/scripts/chart-legend'; +import MkChartLegend from '@/components/MkChartLegend.vue'; initChart(); @@ -28,6 +31,7 @@ const props = defineProps<{ }>(); const chartEl = $shallowRef(null); +let legendEl = $shallowRef>(); const now = new Date(); let chartInstance: Chart = null; const chartLimit = 30; @@ -153,14 +157,7 @@ async function renderChart() { }, }, legend: { - display: true, - position: 'bottom', - padding: { - left: 0, - right: 0, - top: 8, - bottom: 0, - }, + display: false, }, tooltip: { enabled: false, @@ -173,7 +170,7 @@ async function renderChart() { gradient, }, }, - plugins: [chartVLine(vLineColor)], + plugins: [chartVLine(vLineColor), chartLegend(legendEl)], }); fetching = false; diff --git a/packages/frontend/src/scripts/chart-legend.ts b/packages/frontend/src/scripts/chart-legend.ts new file mode 100644 index 0000000000..6a5370cc87 --- /dev/null +++ b/packages/frontend/src/scripts/chart-legend.ts @@ -0,0 +1,12 @@ +import { Plugin } from 'chart.js'; +import MkChartLegend from '@/components/MkChartLegend.vue'; + +export const chartLegend = (legend: InstanceType) => ({ + id: 'htmlLegend', + afterUpdate(chart, args, options) { + // Reuse the built-in legendItems generator + const items = chart.options.plugins.legend.labels.generateLabels(chart); + + legend.update(chart, items); + }, +}) as Plugin; diff --git a/packages/frontend/src/scripts/chart-vline.ts b/packages/frontend/src/scripts/chart-vline.ts index 10021583e0..f321443834 100644 --- a/packages/frontend/src/scripts/chart-vline.ts +++ b/packages/frontend/src/scripts/chart-vline.ts @@ -1,3 +1,5 @@ +import { Plugin } from 'chart.js'; + export const chartVLine = (vLineColor: string) => ({ id: 'vLine', beforeDraw(chart, args, options) { @@ -18,4 +20,4 @@ export const chartVLine = (vLineColor: string) => ({ ctx.restore(); } }, -}); +}) as Plugin;