Premium Analytics: add CSV downloads to dashboard widgets#50456
Premium Analytics: add CSV downloads to dashboard widgets#50456layoutd wants to merge 2 commits into
Conversation
|
Thank you for your PR! When contributing to Jetpack, we have a few suggestions that can help us test and review your patch:
This comment will be updated as you work on your PR and make changes. If you think that some of those checks are not needed for your PR, please explain why you think so. Thanks for cooperation 🤖 Follow this PR Review Process:
If you have questions about anything, reach out in #jetpack-developers for guidance! |
There was a problem hiding this comment.
Pull request overview
Adds a synchronous “direct download” CSV export path to Premium Analytics so users can download a freshly generated CSV for a single report from the dashboard (without waiting for scheduled exports), supporting both WooCommerce Analytics reports and Jetpack Stats Top Posts.
Changes:
- Add a new REST route for direct CSV downloads, plus bootstrapping to register Analytics + Stats sources and enforce source-scoped capabilities.
- Extend the export pipeline to support source-specific proxy routing (prefix/version), per-report param mapping, optional comparison filtering behavior, and optional post-fetch data filtering.
- Add a reusable
DownloadReportButtonand wire it into the Orders Over Time and Top Posts widgets (Top Posts button appears in the content export area only when data is settled).
Reviewed changes
Copilot reviewed 30 out of 30 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| projects/packages/premium-analytics/widgets/top-posts/style.module.css | Adds layout styles for a content export action area. |
| projects/packages/premium-analytics/widgets/top-posts/render.tsx | Injects a settled-data-gated DownloadReportButton into the widget content export area. |
| projects/packages/premium-analytics/widgets/top-posts/tests/top-posts.test.tsx | Adds UI tests for download button placement and loading/refetch gating. |
| projects/packages/premium-analytics/widgets/orders-over-time/render.tsx | Adds DownloadReportButton to Orders Over Time widget. |
| projects/packages/premium-analytics/tests/php/Reports/Export/ReportDataFetcher_Test.php | Adds coverage for controller param mapping, ranked comparison matching, and endpoint selection logic. |
| projects/packages/premium-analytics/tests/php/Reports/Export/fixtures/class-recording-report-data-fetcher.php | Test double to record proxy endpoint/params for assertions. |
| projects/packages/premium-analytics/tests/php/Reports/Export/fixtures/class-fake-generator.php | Extends generator test double to simulate streamability checks. |
| projects/packages/premium-analytics/tests/php/Reports/Export/fixtures/class-fake-fetcher.php | Records passed params for controller tests. |
| projects/packages/premium-analytics/tests/php/Reports/Export/Exports/TopPostsExportController_Test.php | New unit tests for the Stats Top Posts export controller. |
| projects/packages/premium-analytics/tests/php/Reports/Export/DirectCSVExportController_Test.php | New unit tests for the direct-download REST controller. |
| projects/packages/premium-analytics/src/Reports/Export/Logging/class-error-log-logger.php | Adds a WooCommerce-free logger implementation for the export pipeline. |
| projects/packages/premium-analytics/src/Reports/Export/Exports/class-top-posts-export-controller.php | Adds a Stats Top Posts export controller (param mapping, matching, filtering, CSV formatting). |
| projects/packages/premium-analytics/src/Reports/Export/Exports/class-orders-over-time-controller.php | Adds direct-export option allowlist and conditional endpoint selection for product-related filters. |
| projects/packages/premium-analytics/src/Reports/Export/class-report-data-fetcher.php | Adds source-configurable proxy routing, optional controller hooks (param mapping/filtering), and Stats summary→data normalization. |
| projects/packages/premium-analytics/src/Reports/Export/class-report-csv-generator.php | Adds can_stream_file() preflight check for streaming responses. |
| projects/packages/premium-analytics/src/Reports/Export/class-export.php | Centralizes Analytics controller allowlist via get_report_controllers(). |
| projects/packages/premium-analytics/src/Reports/Export/class-direct-export.php | Bootstraps direct export for Analytics + Stats sources and registers controllers. |
| projects/packages/premium-analytics/src/Reports/Export/class-direct-csv-export-controller.php | Adds REST endpoint for synchronous CSV downloads, including validation and streaming response handling. |
| projects/packages/premium-analytics/src/class-analytics.php | Wires direct export bootstrap into package initialization. |
| projects/packages/premium-analytics/packages/widgets-toolkit/src/index.ts | Exports DownloadReportButton from the toolkit package. |
| projects/packages/premium-analytics/packages/widgets-toolkit/src/components/index.ts | Re-exports DownloadReportButton from the components barrel. |
| projects/packages/premium-analytics/packages/widgets-toolkit/src/components/download-report-button/index.ts | Adds component entrypoint export. |
| projects/packages/premium-analytics/packages/widgets-toolkit/src/components/download-report-button/download-report-button.tsx | Implements reusable Download CSV button that calls the direct export API and reports errors to WidgetRoot. |
| projects/packages/premium-analytics/packages/widgets-toolkit/src/components/download-report-button/download-report-button.module.scss | Styles default action-row wrapper and button sizing. |
| projects/packages/premium-analytics/packages/data/src/index.ts | Exposes new direct-download API helpers and types. |
| projects/packages/premium-analytics/packages/data/src/api/report-export-fetch/report-export-fetch.ts | Adds direct download fetch path, content-disposition filename parsing, and blob saving. |
| projects/packages/premium-analytics/packages/data/src/api/report-export-fetch/index.ts | Updates exports/types for the new direct-download functions. |
| projects/packages/premium-analytics/packages/data/src/api/index.ts | Re-exports the expanded report export API surface. |
| projects/packages/premium-analytics/packages/data/src/api/tests/report-export-fetch.test.ts | Adds unit tests for direct-download request bodies, filename parsing, and fallback filenames. |
| projects/packages/premium-analytics/changelog/add-pa-direct-report-download | Adds changelog entry for direct CSV download support. |
Code Coverage SummaryThis PR did not change code coverage! That could be good or bad, depending on the situation. Everything covered before, and still is? Great! Nothing was covered before? Not so great. 🤷 |
4ce891f to
be08017
Compare
|
Reworked this draft for simplicity. It now uses the existing CSV export endpoint for supported WooCommerce Analytics reports and the already-merged client-side generator otherwise, scoped to Orders Over Time and Top pages by views. |
| const utf8Match = header.match( /filename\*=UTF-8''([^;]+)/i ); | ||
| if ( utf8Match?.[ 1 ] ) { | ||
| return decodeURIComponent( utf8Match[ 1 ].replace( /(^"|"$)/g, '' ) ); | ||
| } |
|
|
||
| link.href = url; | ||
| link.download = filename; | ||
| link.style.display = 'none'; |
| } | ||
|
|
||
| /** | ||
| * Request a browser download from the existing WooCommerce Analytics CSV endpoint. |
| // Only expose the export once the query has settled on data for the current | ||
| // params. Stats queries keep the previous period's rows as placeholder data | ||
| // while a refetch is in flight, so exporting mid-fetch (or after an error) | ||
| // could hand the user stale rows under the new-period `csvFilename`. | ||
| const canExport = | ||
| areClientSideCsvExportsEnabled() && rows.length > 0 && ! isFetching && ! isError; | ||
| const canExport = rows.length > 0 && ! isFetching && ! isError; |
Related to WOOA7S-1671.
Proposed changes
DownloadCsvButtonwith two modes behind the current CSV export proof-of-concept flag.delivery_method: downloadthrough the existing CSV export endpoint. The proof of concept wires this mode into Orders Over Time.Related product discussion/links
Does this pull request change what data or activity we track or use?
No. It downloads existing report data for the authorized user and does not add tracking or collect new data.
Testing instructions
pnpm jetpack build packages/premium-analytics --deps.projects/packages/premium-analytics, runpnpm test --runInBandandpnpm typecheck.