From e7e55cd2d07bbda7291ff31137f51ecb11cdafb9 Mon Sep 17 00:00:00 2001 From: rygrit Date: Mon, 2 Mar 2026 22:28:54 +0800 Subject: [PATCH 1/3] fix: add date in chart tooltip --- app/components/Package/TrendsChart.vue | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/app/components/Package/TrendsChart.vue b/app/components/Package/TrendsChart.vue index cb3308ca7..72c18a7f6 100644 --- a/app/components/Package/TrendsChart.vue +++ b/app/components/Package/TrendsChart.vue @@ -1100,6 +1100,17 @@ const datetimeFormatterOptions = computed(() => { }[selectedGranularity.value] }) +// Cached date formatter for tooltip +const tooltipDateFormatter = computed(() => { + const granularity = displayedGranularity.value + return new Intl.DateTimeFormat(locale.value, { + year: 'numeric', + month: granularity === 'yearly' ? undefined : 'short', + day: granularity === 'daily' || granularity === 'weekly' ? 'numeric' : undefined, + timeZone: 'UTC', + }) +}) + const sanitise = (value: string) => value .replace(/^@/, '') @@ -1598,11 +1609,23 @@ const chartConfig = computed(() => { borderColor: 'transparent', backdropFilter: false, backgroundColor: 'transparent', - customFormat: ({ datapoint: items }) => { + customFormat: ({ datapoint: items, absoluteIndex }) => { if (!items || pending.value) return '' const hasMultipleItems = items.length > 1 + // Format date for compare page (multi-package mode, not in modal) + let formattedDate = '' + if (!props.inModal && hasMultipleItems && absoluteIndex !== undefined) { + const index = Number(absoluteIndex) + if (Number.isInteger(index) && index >= 0 && index < chartData.value.dates.length) { + const timestamp = chartData.value.dates[index] + if (timestamp) { + formattedDate = tooltipDateFormatter.value.format(new Date(timestamp)) + } + } + } + const rows = items .map((d: Record) => { const label = String(d?.name ?? '').trim() @@ -1635,6 +1658,7 @@ const chartConfig = computed(() => { .join('') return `
+ ${formattedDate ? `
${formattedDate}
` : ''}
${rows}
From 6f17a8b71387eba08b5b92f2fae889941d3ef4a3 Mon Sep 17 00:00:00 2001 From: rygrit Date: Mon, 2 Mar 2026 22:48:15 +0800 Subject: [PATCH 2/3] fix: 0 timestamp --- app/components/Package/TrendsChart.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/Package/TrendsChart.vue b/app/components/Package/TrendsChart.vue index 72c18a7f6..8a0b8854d 100644 --- a/app/components/Package/TrendsChart.vue +++ b/app/components/Package/TrendsChart.vue @@ -1620,7 +1620,7 @@ const chartConfig = computed(() => { const index = Number(absoluteIndex) if (Number.isInteger(index) && index >= 0 && index < chartData.value.dates.length) { const timestamp = chartData.value.dates[index] - if (timestamp) { + if (typeof timestamp === 'number') { formattedDate = tooltipDateFormatter.value.format(new Date(timestamp)) } } From 98aa4c5bcb670958fdcacb5c01771decca7cc1e1 Mon Sep 17 00:00:00 2001 From: Alec Lloyd Probert <55991794+graphieros@users.noreply.github.com> Date: Mon, 2 Mar 2026 17:30:29 +0100 Subject: [PATCH 3/3] fix: remove isModal check --- app/components/Package/TrendsChart.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/components/Package/TrendsChart.vue b/app/components/Package/TrendsChart.vue index 8a0b8854d..ea83d8469 100644 --- a/app/components/Package/TrendsChart.vue +++ b/app/components/Package/TrendsChart.vue @@ -1614,9 +1614,9 @@ const chartConfig = computed(() => { const hasMultipleItems = items.length > 1 - // Format date for compare page (multi-package mode, not in modal) + // Format date for multiple series datasets let formattedDate = '' - if (!props.inModal && hasMultipleItems && absoluteIndex !== undefined) { + if (hasMultipleItems && absoluteIndex !== undefined) { const index = Number(absoluteIndex) if (Number.isInteger(index) && index >= 0 && index < chartData.value.dates.length) { const timestamp = chartData.value.dates[index]