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

Migrate to custom containers and better elements scoping #9782

Merged
merged 47 commits into from
Dec 5, 2024

Conversation

timur27
Copy link
Contributor

@timur27 timur27 commented Nov 21, 2024

Fixes #7674

Changes proposed in this Pull Request

This PR creates a new div wrapper with a unique class name for WooPayments payment elements and uses it to search for elements within them. In addition, the direct targeting of WooCommerce elements has been replaced with targeting our element first and then traversing by looking at an element from that point.

This PR also fixes compatibility issue Vendrify theme had with WooPayments.

Testing instructions

Shortcode checkout

  • smoke tests
  • paying with new & saved cards
  • displaying multiple payment methods correctly
  • toggling payment method depending on billing country (e.g. Bancontact available for Belgium falls back to card once we change the country)
  • Stripe Link works as expected
  • No payment method creation request when billing data is missing
  • No errors in the console when enabling other gateway (e.g. Stripe) and pay with its payment method while still having WooPayments gateways enabled and presented on the checkout page

Add payment method & Pay for order

  • smoke tests

Themes

  • confirm checkout works with Vendrify theme
  • check with a couple of other themes

  • 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

@botwoo
Copy link
Collaborator

botwoo commented Nov 21, 2024

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 9782 or branch name scope/payment-elements-selectors 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: 8a67751
  • Build time: 2024-12-05 09:08:19 UTC

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

Copy link
Contributor

github-actions bot commented Nov 21, 2024

Size Change: +103 B (0%)

Total Size: 1.34 MB

Filename Size Change
release/woocommerce-payments/dist/blocks-checkout.js 54.7 kB +26 B (0%)
release/woocommerce-payments/dist/checkout.js 33.3 kB +77 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/cart-block.js 16.9 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/express-checkout-rtl.css 229 B
release/woocommerce-payments/dist/express-checkout.css 229 B
release/woocommerce-payments/dist/express-checkout.js 15 kB
release/woocommerce-payments/dist/frontend-tracks.js 854 B
release/woocommerce-payments/dist/index-rtl.css 52.6 kB
release/woocommerce-payments/dist/index.css 52.6 kB
release/woocommerce-payments/dist/index.js 303 kB
release/woocommerce-payments/dist/multi-currency-analytics.js 1.08 kB
release/woocommerce-payments/dist/multi-currency-rtl.css 4.46 kB
release/woocommerce-payments/dist/multi-currency-switcher-block.js 60.6 kB
release/woocommerce-payments/dist/multi-currency.css 4.46 kB
release/woocommerce-payments/dist/multi-currency.js 57.3 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 kB
release/woocommerce-payments/dist/payment-gateways-rtl.css 1.32 kB
release/woocommerce-payments/dist/payment-gateways.css 1.32 kB
release/woocommerce-payments/dist/payment-gateways.js 38.4 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.2 kB
release/woocommerce-payments/dist/settings-rtl.css 11.6 kB
release/woocommerce-payments/dist/settings.css 11.5 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.3 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.7 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/build/react-jsx-runtime.js 553 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.45 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.45 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 417 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 584 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 621 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

Comment on lines 191 to 192
? 'wc-woocommerce_payments-payment-token-new'
: `wc-woocommerce_payments_${ paymentMethodType }-payment-token-new`;
Copy link
Contributor Author

@timur27 timur27 Nov 21, 2024

Choose a reason for hiding this comment

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

This is a small refactor that I believe makes the code more readable by removing the prefix and suffix concepts

@timur27 timur27 changed the title scope payment method selectors within the payment container Migrate to custom containers and better elements scoping Nov 22, 2024
@@ -83,9 +58,11 @@ export const getHiddenBillingFields = ( enabledBillingFields ) => {
};
};

export const getUpeSettings = () => {
export const getUpeSettings = ( paymentMethodType ) => {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

I decided to add paymentMethodType here because the current idea behind getUpeSettings is that we run it for every gateway/payment method and it should theoretically check for every payment method type. So we let shouldIncludeTerms to scope by the wcpay-upe-form which has the payment method type equal to the one coming as a parameter here, and check from there

const upeContainer = document.querySelector(
'.payment_method_woocommerce_payments_' + paymentMethodType
);
const upeContainer = upeElement.closest( 'li.wc_payment_method' );
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Traversing up trying to find the first parent which will be ready to be used so that we can properly hide/show the gateway

if ( ! empty( $this->gateway->get_description() ) ) : ?>
<p><?php echo wp_kses_post( $this->gateway->get_description() ); ?></p>
?>
<div class="wcpay-upe-form"
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is the main wrapper, which should serve as the base for all DOM traversal moving forward. Ideally, we should aim to locate this container in the DOM and then traverse within it to find the relevant elements needed for our purposes

@timur27 timur27 force-pushed the scope/payment-elements-selectors branch from 14c21f6 to 6a2bc69 Compare November 25, 2024 12:49
@timur27 timur27 force-pushed the scope/payment-elements-selectors branch from 3defc99 to 7e7de87 Compare November 29, 2024 13:11
@timur27 timur27 requested a review from frosso November 29, 2024 14:34
@timur27 timur27 requested a review from frosso November 29, 2024 17:24
@timur27 timur27 requested a review from frosso November 29, 2024 17:42
client/checkout/utils/upe.js Outdated Show resolved Hide resolved
Copy link
Contributor

@frosso frosso left a comment

Choose a reason for hiding this comment

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

This looks good on my end, I don't see any blocking issues. Thank you for all the changes! :shipit:

client/checkout/classic/event-handlers.js Outdated Show resolved Hide resolved
client/checkout/utils/upe.js Outdated Show resolved Hide resolved
@timur27
Copy link
Contributor Author

timur27 commented Dec 4, 2024

After the reviews so far, I thought I would attach the most recent testing round results I performed with the Vendrify theme.

Screen.Recording.2024-12-04.at.10.26.47.mov

Copy link
Member

@mdmoore mdmoore left a comment

Choose a reason for hiding this comment

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

Everything is testing well with the changes and checkouts are processing as expected. Checkout is working on Vendrify, but a couple things (which I'm not sure if are meant to be fixed in this PR) stand out.

Vendrify theme only

  1. Dynamic payment method filtering isn't working during checkout. Only the payment methods supported by the country set at page load are displayed and changing the billing country has no effect on the payment methods.
  2. Pay for Order - I think is beyond our control but surfacing anyways.
    a. If WooPayments is active, it's always displayed as the top payment method, regardless of payment method ordering at WooCommerce > Payments
    b. All other payment methods are hidden except for bullets. This includes WooPayments LPMs.

image

With the above in mind, since checkout is working with the new scoping and containers and checkout in Vendrify is now working, I think we can approve this and look at the above isssues separately if needed.

@timur27
Copy link
Contributor Author

timur27 commented Dec 5, 2024

Thanks for the review and such a thorough testing, @mdmoore! 🚀 There are things with that theme that could work better, I agree. I think it would be OK to focus on fixing the critical flow, which is performing a purchase, and keep the rest part of the particular theme implementation (ideally) or as a separate issue (less preferred because I think there are limits to what we can do in terms of theme compatibility, as fixing one theme might break others). By the way, this theme is not being maintained anymore, from what I understand.

The dynamic payment method filtering issue might be related to #9851, which I opened last week. It occurs even with some default testing themes. Maybe fixing this issue will fix the issue you encountered, but I'd focus first on the primary behavior and then on any potential user reports about problems with the theme.

@timur27 timur27 added this pull request to the merge queue Dec 5, 2024
Merged via the queue into develop with commit 9a654de Dec 5, 2024
25 checks passed
@timur27 timur27 deleted the scope/payment-elements-selectors branch December 5, 2024 09:31
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.

Gateway compatibility with themes cloning elements with id attributes
4 participants