Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Transactions: Use server based export for both sync download on browser and async email export #10049

Closed
wants to merge 13 commits into from

Conversation

jessy-p
Copy link
Contributor

@jessy-p jessy-p commented Dec 31, 2024

Alternative approach for #9969

Changes proposed in this Pull Request

In this PR, the UX for browser download remains the same, but the backend implementation is changed so that the server export is used for generating the CSV which is made available immediately. This approach does NOT change the UX for merchant (i.e. download is available immediately for single page export), but it solves the overhead and issues of maintaining multiple implementations that do not match.

Single page downloads are available immediately, multiple page downloads (i.e. number of rows to be exported > Page size ) the download is emailed.

The corresponding server changes are on https://github.com/Automattic/transact-platform-server/pull/7077.

NOTE:

  • We may need to make data on screen consistent with the export data, or message appropriately. e.g. custom order number is available on screen but not from server.

Testing instructions

  • If the number of transactions to be downloaded are less than page size, file is available for download immediately.
  • If there are multiple pages, the download is emailed to the admin email as before.
  • NOTE: UX is unchanged.

Test 1:

  • There are < 25 rows of transactions listed and page size is 25
  • Download should be immediate

Test 2:

  • The number of transactions filtered and displayed on listing page is between 25 and 100
  • When page size is 25 (default), the download is emailed.
  • Change the page size to 100, so that there is only one page of transactions, the download is available immediately, but NOT emailed

Test 3:

  • There are > 100 transactions listed
  • The download is emailed.

  • Run npm run changelog to add a changelog file, choose patch to leave it empty if the change is not significant. You can add multiple changelog files in one PR by running this command a few times.
  • Covered with tests (or have a good reason not to test in description ☝️)
  • Tested on mobile (or does not apply)

Post merge

server export instead of using CSV export.
@jessy-p jessy-p marked this pull request as draft December 31, 2024 06:23
@botwoo
Copy link
Collaborator

botwoo commented Dec 31, 2024

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 10049 or branch name refactor/server-export-sync-download in your-test.site/wp-admin/admin.php?page=jetpack-beta&plugin=woocommerce-payments

Option 2. Jurassic Ninja - available for logged-in A12s

🚀 Launch a JN site with this branch 🚀

ℹ️ Install this Tampermonkey script to get more options.


Build info:

  • Latest commit: 406bfa6
  • Build time: 2025-01-15 06:20:50 UTC

Note: the build is updated when a new commit is pushed to this PR.

Copy link
Contributor

github-actions bot commented Dec 31, 2024

Size Change: +95 B (0%)

Total Size: 1.36 MB

Filename Size Change
release/woocommerce-payments/dist/index.js 301 kB +27 B (0%)
release/woocommerce-payments/dist/multi-currency-switcher-block.js 60.9 kB +14 B (0%)
release/woocommerce-payments/dist/multi-currency.js 57.6 kB +13 B (0%)
release/woocommerce-payments/dist/order.js 42.4 kB +15 B (0%)
release/woocommerce-payments/dist/payment-gateways.js 38.7 kB +12 B (0%)
release/woocommerce-payments/dist/settings.js 224 kB +14 B (0%)
ℹ️ View Unchanged
Filename Size
release/woocommerce-payments/assets/css/admin.css 1.37 kB
release/woocommerce-payments/assets/css/admin.rtl.css 1.37 kB
release/woocommerce-payments/assets/css/success.css 182 B
release/woocommerce-payments/assets/css/success.rtl.css 184 B
release/woocommerce-payments/dist/blocks-checkout-rtl.css 2.64 kB
release/woocommerce-payments/dist/blocks-checkout.css 2.64 kB
release/woocommerce-payments/dist/blocks-checkout.js 55.6 kB
release/woocommerce-payments/dist/cart-block.js 17.2 kB
release/woocommerce-payments/dist/cart.js 5.73 kB
release/woocommerce-payments/dist/checkout-rtl.css 1.13 kB
release/woocommerce-payments/dist/checkout.css 1.13 kB
release/woocommerce-payments/dist/checkout.js 33.6 kB
release/woocommerce-payments/dist/express-checkout-rtl.css 229 B
release/woocommerce-payments/dist/express-checkout.css 229 B
release/woocommerce-payments/dist/express-checkout.js 15.7 kB
release/woocommerce-payments/dist/frontend-tracks.js 854 B
release/woocommerce-payments/dist/index-rtl.css 39.3 kB
release/woocommerce-payments/dist/index.css 39.3 kB
release/woocommerce-payments/dist/multi-currency-analytics.js 1.08 kB
release/woocommerce-payments/dist/multi-currency-rtl.css 4.47 kB
release/woocommerce-payments/dist/multi-currency.css 4.47 kB
release/woocommerce-payments/dist/order-rtl.css 730 B
release/woocommerce-payments/dist/order.css 730 B
release/woocommerce-payments/dist/payment-gateways-rtl.css 1.33 kB
release/woocommerce-payments/dist/payment-gateways.css 1.33 kB
release/woocommerce-payments/dist/plugins-page-rtl.css 386 B
release/woocommerce-payments/dist/plugins-page.css 386 B
release/woocommerce-payments/dist/plugins-page.js 20.1 kB
release/woocommerce-payments/dist/product-details-rtl.css 433 B
release/woocommerce-payments/dist/product-details.css 436 B
release/woocommerce-payments/dist/product-details.js 12.5 kB
release/woocommerce-payments/dist/settings-rtl.css 11.6 kB
release/woocommerce-payments/dist/settings.css 11.5 kB
release/woocommerce-payments/dist/subscription-edit-page.js 703 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal-rtl.css 524 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.css 524 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.js 20.2 kB
release/woocommerce-payments/dist/subscription-product-onboarding-toast.js 730 B
release/woocommerce-payments/dist/subscriptions-empty-state-rtl.css 120 B
release/woocommerce-payments/dist/subscriptions-empty-state.css 120 B
release/woocommerce-payments/dist/subscriptions-empty-state.js 19.3 kB
release/woocommerce-payments/dist/tokenized-express-checkout-rtl.css 229 B
release/woocommerce-payments/dist/tokenized-express-checkout.css 229 B
release/woocommerce-payments/dist/tokenized-express-checkout.js 16.6 kB
release/woocommerce-payments/dist/tos-rtl.css 235 B
release/woocommerce-payments/dist/tos.css 235 B
release/woocommerce-payments/dist/tos.js 21.8 kB
release/woocommerce-payments/dist/woopay-direct-checkout.js 6.13 kB
release/woocommerce-payments/dist/woopay-express-button.js 25 kB
release/woocommerce-payments/dist/woopay-rtl.css 4.31 kB
release/woocommerce-payments/dist/woopay.css 4.28 kB
release/woocommerce-payments/dist/woopay.js 71 kB
release/woocommerce-payments/includes/subscriptions/assets/css/plugin-page.css 625 B
release/woocommerce-payments/includes/subscriptions/assets/js/plugin-page.js 814 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/i18n-loader.js 2.46 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/jetpack-script-data.js 772 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/i18n-loader.js 1.02 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/script-data.js 69 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/babel.config.js 163 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.css 2.47 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.js 14.2 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.rtl.css 2.47 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.css 10 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.js 28.4 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.rtl.css 10 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.css 198 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.js 280 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.rtl.css 198 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.css 625 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.js 333 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.rtl.css 626 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-users.js 424 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-ajax.js 521 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-callables.js 585 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.css 215 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.js 521 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.css 721 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.js 412 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-users.js 632 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/about.css 1.04 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-empty-state.css 294 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-order-statuses.css 408 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin.css 3.59 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/checkout.css 301 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/modal.css 746 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/view-subscription.css 574 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/wcs-upgrade.css 414 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin-pointers.js 543 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin.js 9.4 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.js 6.78 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.min.js 3.84 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-coupon.js 545 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-subscription.js 2.52 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.js 22.2 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.min.js 11.7 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/payment-method-restrictions.js 1.29 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/wcs-meta-boxes-order.js 507 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/payment-methods.js 358 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/single-product.js 428 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/view-subscription.js 1.38 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/wcs-cart.js 782 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/modal.js 1.09 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/wcs-upgrade.js 1.26 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.css 391 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.js 3.04 kB

compressed-size-action

@jessy-p jessy-p changed the title Draft PR: retain current UX but use server export for immediate CSV file export on browser Draft PR: retain current UX but use server based export for both download on browser and email export Dec 31, 2024
@nagpai
Copy link
Contributor

nagpai commented Jan 2, 2025

I did a manual test on the transactions page with less than 25 transactions filtered.

  1. I received the download on page, as well as by email
  2. There was no notification for the file sent by email. I think at the POC stage we have not changed that for now. Even at a later stage we may need to consider showing a cleaner modal with the download link and also a message about the email being sent too.

Copy link
Member

@Jinksi Jinksi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🌟 Very nice @jessy-p! I prefer this approach to removing client-side download completely.

We can implement server-side logic to significantly increase the client-side download row-count limit higher than 25-100 (10,000? 1,000,000?). We can test server performance to find where this limit should be → when async export is required.

I think this would offer a better UX for most flows, with the existing email-based flow remaining in place for very large and slow exports.

client/transactions/list/index.tsx Outdated Show resolved Hide resolved
@jessy-p
Copy link
Contributor Author

jessy-p commented Jan 3, 2025

We can implement server-side logic to significantly increase the client-side download row-count limit higher than 25-100

Definitely! But I think we can focus on matching it with pagesize (25-100) currently, so that it adheres to the existing and Core UX principles, which seems to be:

  • Download what you see on the page ( <= page size) => sync download
  • Download multiple pages => async download

@nagpai
Copy link
Contributor

nagpai commented Jan 7, 2025

The PR here achieves good parity with the existing UX flow and in my opinion, can be merged as it is. We can bump up the limit to 100 safely.

We can create a separate issue / spike to explore what is the safe highest number for the sync, and incrementally deliver it later. WDYT?

Jessy and others added 2 commits January 7, 2025 23:17
@jessy-p jessy-p changed the title Draft PR: retain current UX but use server based export for both download on browser and email export Transactions: Use server based export for both sync download on browser and async email export Jan 7, 2025
jessy-p and others added 2 commits January 8, 2025 11:37
@jessy-p jessy-p marked this pull request as ready for review January 8, 2025 08:11
@Jinksi Jinksi self-requested a review January 10, 2025 03:04
Copy link
Member

@Jinksi Jinksi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As an interim review, while we make sure https://github.com/Automattic/transact-platform-server/pull/7077 will work (see that PR discussion), this is working well when running against local server on trunk or sandbox on trunk.

I've left some minor code comments and updated some falling JS tests in 899f809.

Comment on lines +92 to +95
const path = addQueryArgs( `${ NAMESPACE }/transactions/download`, {
...formatQueryFilters( query ),
download_type: query.downloadType,
} );
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For consistency, download_type: query.downloadType can be placed within formatQueryFilters which is conducting the same type of operation on other filter params.

Comment on lines 738 to 742
recordEvent( 'wcpay_transactions_download_csv_click', {
location: props.depositId ? 'deposit_details' : 'transactions',
download_type: downloadType,
exported_transactions: rows.length,
total_transactions: transactionsSummary.count,
} );
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💭 Rather than remove, should we expand the event prop download_type with sync and async for tracking purposes?

@@ -432,12 +432,13 @@ public function get_fraud_outcome_transactions_export( $request ) {
* @param string $user_email The email to search for.
* @param string $deposit_id The deposit to filter on.
* @param string $locale Site locale.
* @param string $download_type The type of download to perform.
*
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💭 It may be worth listing the possible values to clarify what this param is for.

Suggested change
*
* @param string $download_type The type of download to perform: 'sync' or 'async'.

@Jinksi Jinksi requested a review from a team January 10, 2025 04:54
Jessy added 2 commits January 14, 2025 20:09
# Conflicts:
#	client/transactions/list/index.tsx
# Conflicts:
#	client/transactions/list/test/index.tsx
@Jinksi
Copy link
Member

Jinksi commented Jan 15, 2025

As part of testing this PR, let's check to see if the columns currently exported via client are also available via server export.

As reported in #8183, there are discrepancies between columns exported via server/client-based CSV export, (the Channel column specifically).

Update – this is being handled in a separate PR https://github.com/Automattic/transact-platform-server/pull/7142

@Jinksi Jinksi self-requested a review January 23, 2025 05:22
@jessy-p
Copy link
Contributor Author

jessy-p commented Jan 27, 2025

Closing this PR as we are going with #10211

@jessy-p jessy-p closed this Jan 27, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Reporting: Move all CSV exports to endpoint (server) exports
4 participants