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

Remove browser based CSV export, default to async server-side export #9986

Open
wants to merge 13 commits into
base: develop
Choose a base branch
from

Conversation

jessy-p
Copy link
Contributor

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

Fixes #9969
Fixes #9303 by removing JS-based CSV export

Changes proposed in this Pull Request

When the number of rows are less than 25, browser based CSV export was used. This is removed.
Export defaults to async server-side export for transactions, disputes and payouts.

Testing instructions

  • Test on Disputes, Payouts and Transactions page.
  • Ensure less than 25 rows in the page
  • Click on the Download button.
  • For less than 25 rows, earlier it used to default to client side export with the CSV downloaded immediately. With this branch update/9764-remove-browser-export, it will use the server side async export. The export will be generated async and sent by email.

  • 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

@jessy-p jessy-p marked this pull request as draft December 18, 2024 01:48
@botwoo
Copy link
Collaborator

botwoo commented Dec 18, 2024

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 9986 or branch name update/9764-remove-browser-export 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: 87ad001
  • Build time: 2024-12-24 11:37:42 UTC

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

Copy link
Contributor

github-actions bot commented Dec 18, 2024

Size Change: -557 B (0%)

Total Size: 1.39 MB

Filename Size Change
release/woocommerce-payments/dist/index.js 302 kB -557 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.63 kB
release/woocommerce-payments/dist/blocks-checkout.css 2.63 kB
release/woocommerce-payments/dist/blocks-checkout.js 55.4 kB
release/woocommerce-payments/dist/cart-block.js 17 kB
release/woocommerce-payments/dist/cart.js 5.73 kB
release/woocommerce-payments/dist/checkout-rtl.css 932 B
release/woocommerce-payments/dist/checkout.css 931 B
release/woocommerce-payments/dist/checkout.js 33.4 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.5 kB
release/woocommerce-payments/dist/frontend-tracks.js 854 B
release/woocommerce-payments/dist/index-rtl.css 52.7 kB
release/woocommerce-payments/dist/index.css 52.6 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-switcher-block.js 60.9 kB
release/woocommerce-payments/dist/multi-currency.css 4.47 kB
release/woocommerce-payments/dist/multi-currency.js 57.6 kB
release/woocommerce-payments/dist/order-rtl.css 730 B
release/woocommerce-payments/dist/order.css 730 B
release/woocommerce-payments/dist/order.js 42.4 kB
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/payment-gateways.js 38.7 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.3 kB
release/woocommerce-payments/dist/settings-rtl.css 11.7 kB
release/woocommerce-payments/dist/settings.css 11.6 kB
release/woocommerce-payments/dist/settings.js 224 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.4 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 24.8 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 767 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 marked this pull request as ready for review December 18, 2024 07:47
@jessy-p jessy-p requested a review from a team December 18, 2024 07:51
@jessy-p jessy-p self-assigned this Dec 18, 2024
@nagpai
Copy link
Contributor

nagpai commented Dec 18, 2024

The linter was showing some unused vars and imports. I have removed them via - 3b0a867

Manual tests

I tested by reducing the list to less than 25 to make sure it does not go via browser dowload.

  • Transactions, Disputes and Payouts - Export was successfully routed to server.
  • The exported file showed correct information for Transactions and Payouts.
  • For disputes, it did not show me filtered view of only Needs Response status disputes. There is a known open issue with PR ready to make the filtering work correctly for endpoint ( server) exports .

Copy link
Contributor

@nagpai nagpai left a comment

Choose a reason for hiding this comment

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

Did a round of review.

Just a question about whether to reuse existing track events or create new ones. If we decide to use existing track events then we will need to add back the recordEvents

Sorry about the repetitive text. I wish I could select all three occurences and ask the question at one place :D

Comment on lines -352 to -350
recordEvent( 'wcpay_deposits_download', {
exported_deposits: rows.length,
total_deposits: depositsSummary.count,
download_type: 'browser',
} );
Copy link
Contributor

Choose a reason for hiding this comment

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

Should we deprecate this track event and create a new one, or should we continue using this with download_type set as endpoint ? The second option will allow continuity with the older data. Good to have some more opinions.

Copy link
Member

Choose a reason for hiding this comment

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

I think we should keep the existing tracks events, but update the tracks event information noting that the browser download type is deprecated, no longer in use.

Copy link
Contributor

Choose a reason for hiding this comment

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

I agree, the user intention is not changing, so we should ideally keep the existing events.

We should have events for the key user actions, and ideally all events will be triggered in front-end code, close to the action happening.

Copy link
Contributor

Choose a reason for hiding this comment

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

I'll comment on the specifics of all the tracks events in my review comment.

Comment on lines -507 to -515
recordEvent( 'wcpay_disputes_download', {
exported_disputes: csvRows.length,
total_disputes: disputesSummary.count,
download_type: 'browser',
} );
Copy link
Contributor

Choose a reason for hiding this comment

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

Should we deprecate this track event and create a new one, or should we continue using this with download_type set as endpoint ? The second option will allow continuity with the older data. Good to have some more opinions.

Comment on lines -719 to -722
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
Contributor

Choose a reason for hiding this comment

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

Should we deprecate this track event and create a new one, or should we continue using this with download_type set as endpoint ? The second option will allow continuity with the older data. Good to have some more opinions.

@Jinksi
Copy link
Member

Jinksi commented Dec 18, 2024

I've marked this PR as a fix for #9303, which will be resolve when we remove JS-based CSV exporting.

Significance: minor
Type: update

Remove browser based CSV export, use async CSV export for Disputes, DPayouts and Transactions.
Copy link
Contributor

@haszari haszari Dec 19, 2024

Choose a reason for hiding this comment

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

Might be clearer to word this positively, the negative wording assumes/requires context to understand.

Something like this:

Generate all CSV exports asynchronously via service (includes transactions, disputes, and payouts tables). Previously smaller CSVs were generated immediately via JavaScript code.

Copy link
Contributor

@haszari haszari left a comment

Choose a reason for hiding this comment

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

Super excited to see this move ahead, and all the code we get to delete 👩🏻‍🍳 💋 !

Tracks

The tracks events are a little interesting, but TLDR I think we should keep all the same events and ensure they fire as before to accurately represent the user action.

If the existing events don't accurately capture the user action … then we could consider tweaking them a little while we're here.

If needed, IMO renaming or changing tracks is ok as long as we communicate that it's happening, and we don't upset any current experiments. Good to clarify and refine when we can!

  • wcpay_deposits_download wcpay_disputes_download
    • The naming of the events is not ideal. User action is clicking a button to initiate/request a CSV. So a new event name might be better fit.
    • deposits is goneburgers 💣 🍔 ⇒ payouts
  • wcpay_transactions_download_csv_click
    • This name is more accurate IMO! Also super good to mention csv in the name – clear.
  • downloadType could be deprecated, it's not needed anymore. If we keep it, could consider clearer name – endpoint is technical.
  • exported_transactions exported_disputes exported_deposits
    • If we use a common property then we can analyse across CSV type. Suggest row_count, or maybe exported_row_count (depending on total_ below).
    • total_deposits total_disputes total_transactions
      • When is this different from row count? Do we need it?
      • If we need/keep this, would also be good to use consistent name, e.g. total_row_count.

Summary of my suggestions for tracks events:

  • Keep/add CSV export click events. Rename to focus on user action:
    • wcpay_transactions_export_csv_click
    • wcpay_payouts_export_csv_click
    • wcpay_disputes_export_csv_click
  • Use consistent names for common properties.
    • exported_row_count
    • total_row_count if needed
  • Consider removing downloadType prop – no longer relevant.

Tracks events could be a separate issue. If we do separate issue, ideally we ship in same release to avoid a gap in the data (though maybe not a big deal!).

Flow / testing

Screenshot 2024-12-19 at 2 06 15 PM
  • The button label is Download … but the function is export, and the download is async. We should consider changing button label to Export
Screenshot 2024-12-19 at 2 08 38 PM
  • The email and the export filename give no clue what the data is. I always like it when web services name the files for me so my downloads folder isn't a confusing jungle. Potential quick wins:
    • Add the download type & maybe row count or date of request to the email (and subject?). So each email notification is a reminder of what & when, is identifiable.
    • Include the download type in the filename.
    • We are now WooPayments …
    • Example: WooPayments-transactions-acct_1234abcd-2024_12_19_01_04_59-nr7mpt2jy2.csv

Keen for @rogermattic thoughts on the above. (and FYI @mjdeacon ). We could log as follow up issues to make CSV experience slightly nicer.

I tested on my pressable site, using Jetpack beta tester to run this branch. I exported a big list (transactions) and a small list (all disputes) and both worked fine, usual async email flow.

🚢

@@ -312,48 +305,11 @@ export const DepositsList = (): JSX.Element => {

const onDownload = async () => {
setIsDownloading( true );
const downloadType = totalRows > rows.length ? 'endpoint' : 'browser';
Copy link
Contributor

Choose a reason for hiding this comment

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

I like this – the name endpoint was a little weird/arcane IMO!

Comment on lines -352 to -350
recordEvent( 'wcpay_deposits_download', {
exported_deposits: rows.length,
total_deposits: depositsSummary.count,
download_type: 'browser',
} );
Copy link
Contributor

Choose a reason for hiding this comment

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

I agree, the user intention is not changing, so we should ideally keep the existing events.

We should have events for the key user actions, and ideally all events will be triggered in front-end code, close to the action happening.

Comment on lines -352 to -350
recordEvent( 'wcpay_deposits_download', {
exported_deposits: rows.length,
total_deposits: depositsSummary.count,
download_type: 'browser',
} );
Copy link
Contributor

Choose a reason for hiding this comment

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

I'll comment on the specifics of all the tracks events in my review comment.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
5 participants