From 37b9f6197024db333f263ce931143a6dbb903894 Mon Sep 17 00:00:00 2001 From: MatteoGabriele Date: Mon, 9 Feb 2026 21:48:28 +0100 Subject: [PATCH 1/7] feat: add permalink to downloads modal --- app/components/Package/DownloadAnalytics.vue | 30 +++++++++---------- .../Package/WeeklyDownloadStats.vue | 26 ++++++++++++---- app/composables/useCharts.ts | 18 ++++------- app/types/chart.ts | 24 +++++++++++++++ 4 files changed, 66 insertions(+), 32 deletions(-) create mode 100644 app/types/chart.ts diff --git a/app/components/Package/DownloadAnalytics.vue b/app/components/Package/DownloadAnalytics.vue index eee26a2b6..a296d3415 100644 --- a/app/components/Package/DownloadAnalytics.vue +++ b/app/components/Package/DownloadAnalytics.vue @@ -5,6 +5,15 @@ import { useDebounceFn, useElementSize } from '@vueuse/core' import { useCssVariables } from '~/composables/useColors' import { OKLCH_NEUTRAL_FALLBACK, transparentizeOklch } from '~/utils/colors' import { getFrameworkColor, isListedFramework } from '~/utils/frameworks' +import type { + ChartTimeGranularity, + DailyDownloadPoint, + DateRangeFields, + EvolutionData, + MonthlyDownloadPoint, + WeeklyDownloadPoint, + YearlyDownloadPoint, +} from '~/types/chart' const props = defineProps<{ // For single package downloads history @@ -100,18 +109,6 @@ const accent = computed(() => { const mobileBreakpointWidth = 640 const isMobile = computed(() => width.value > 0 && width.value < mobileBreakpointWidth) -type ChartTimeGranularity = 'daily' | 'weekly' | 'monthly' | 'yearly' -type EvolutionData = - | DailyDownloadPoint[] - | WeeklyDownloadPoint[] - | MonthlyDownloadPoint[] - | YearlyDownloadPoint[] - -type DateRangeFields = { - startDate?: string - endDate?: string -} - function isRecord(value: unknown): value is Record { return typeof value === 'object' && value !== null } @@ -314,7 +311,10 @@ const effectivePackageNames = computed(() => { return single ? [single] : [] }) -const selectedGranularity = shallowRef('weekly') +const selectedGranularity = defineModel('granularity', { + default: 'weekly', +}) + const displayedGranularity = shallowRef('weekly') const isEndDateOnPeriodEnd = computed(() => { @@ -344,8 +344,8 @@ const shouldRenderEstimationOverlay = computed( () => !pending.value && isEstimationGranularity.value, ) -const startDate = shallowRef('') // YYYY-MM-DD -const endDate = shallowRef('') // YYYY-MM-DD +const startDate = defineModel('startDate', { default: '' }) +const endDate = defineModel('endDate', { default: '' }) const hasUserEditedDates = shallowRef(false) /** diff --git a/app/components/Package/WeeklyDownloadStats.vue b/app/components/Package/WeeklyDownloadStats.vue index a7627afc2..e7a17ad6e 100644 --- a/app/components/Package/WeeklyDownloadStats.vue +++ b/app/components/Package/WeeklyDownloadStats.vue @@ -1,6 +1,7 @@