diff --git a/app/components/PackageDownloadAnalytics.vue b/app/components/PackageDownloadAnalytics.vue index 1db59f1c64..bbaa96ac34 100644 --- a/app/components/PackageDownloadAnalytics.vue +++ b/app/components/PackageDownloadAnalytics.vue @@ -191,6 +191,16 @@ function safeMax(a: string, b: string): string { return a.localeCompare(b) >= 0 ? a : b } +function extractDates(dateLabel: string) { + if (typeof dateLabel !== 'string') return [] + + const parts = dateLabel.trim().split(/\s+/).filter(Boolean) + + if (parts.length < 2) return [] + + return [parts[0], parts[parts.length - 1]] +} + /** * Two-phase state: * - selectedGranularity: immediate UI @@ -448,17 +458,26 @@ const config = computed(() => ({ }, callbacks: { img: ({ imageUri }: { imageUri: string }) => { - loadFile(imageUri, `${packageName}-${selectedGranularity.value}.png`) + loadFile( + imageUri, + `${packageName}-${selectedGranularity.value}_${startDate.value}_${endDate.value}.png`, + ) }, csv: (csvStr: string) => { const blob = new Blob([csvStr.replace('data:text/csv;charset=utf-8,', '')]) const url = URL.createObjectURL(blob) - loadFile(url, `${packageName}-${selectedGranularity.value}.csv`) + loadFile( + url, + `${packageName}-${selectedGranularity.value}_${startDate.value}_${endDate.value}.csv`, + ) URL.revokeObjectURL(url) }, svg: ({ blob }: { blob: Blob }) => { const url = URL.createObjectURL(blob) - loadFile(url, `${packageName}-${selectedGranularity.value}.svg`) + loadFile( + url, + `${packageName}-${selectedGranularity.value}_${startDate.value}_${endDate.value}.svg`, + ) URL.revokeObjectURL(url) }, }, @@ -512,6 +531,13 @@ const config = computed(() => ({ }, zoom: { maxWidth: 500, + customFormat: + displayedGranularity.value !== 'weekly' + ? undefined + : ({ absoluteIndex, side }: { absoluteIndex: number; side: 'left' | 'right' }) => { + const parts = extractDates(chartData.value.dates[absoluteIndex] ?? '') + return side === 'left' ? parts[0] : parts.at(-1) + }, highlightColor: isDarkMode.value ? '#2A2A2A' : '#E1E5E8', minimap: { show: true, diff --git a/package.json b/package.json index d95d4d6622..765f129e04 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "validate-npm-package-name": "^7.0.2", "virtua": "^0.48.3", "vue": "3.5.27", - "vue-data-ui": "^3.13.4" + "vue-data-ui": "^3.13.5" }, "devDependencies": { "@iconify-json/carbon": "1.2.18", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b6bf8b6f88..a38ff2c388 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -99,8 +99,8 @@ importers: specifier: 3.5.27 version: 3.5.27(typescript@5.9.3) vue-data-ui: - specifier: ^3.13.4 - version: 3.13.4(vue@3.5.27(typescript@5.9.3)) + specifier: ^3.13.5 + version: 3.13.5(vue@3.5.27(typescript@5.9.3)) devDependencies: '@iconify-json/carbon': specifier: 1.2.18 @@ -8658,8 +8658,8 @@ packages: vue-component-type-helpers@3.2.4: resolution: {integrity: sha512-05lR16HeZDcDpB23ku5b5f1fBOoHqFnMiKRr2CiEvbG5Ux4Yi0McmQBOET0dR0nxDXosxyVqv67q6CzS3AK8rw==} - vue-data-ui@3.13.4: - resolution: {integrity: sha512-EM9Uq2FbRZNyOzTJ7Tkcn5bBifEmoggXYBAzgKNAiXhWT/5XCph34Dab3jgYHLkH4JQG/+43mWax/BxgWN8D9w==} + vue-data-ui@3.13.5: + resolution: {integrity: sha512-RBdhoKAlraMoTU3ls7tRy9UCusNwBCvN9w0wF2R0Jwy/AX7cAejlfDDMKE4SN/Th/4ox2eFIZSCZ/CRco3nOxw==} peerDependencies: jspdf: '>=3.0.1' vue: '>=3.3.0' @@ -19010,7 +19010,7 @@ snapshots: vue-component-type-helpers@3.2.4: {} - vue-data-ui@3.13.4(vue@3.5.27(typescript@5.9.3)): + vue-data-ui@3.13.5(vue@3.5.27(typescript@5.9.3)): dependencies: vue: 3.5.27(typescript@5.9.3)