Skip to content
This repository has been archived by the owner on Feb 23, 2024. It is now read-only.

Create the Add to Cart Form Block #8284

Merged
merged 27 commits into from
Feb 16, 2023
Merged

Create the Add to Cart Form Block #8284

merged 27 commits into from
Feb 16, 2023

Conversation

nefeline
Copy link
Contributor

@nefeline nefeline commented Jan 24, 2023

Introduce the new Add to Cart Button block, allowing merchants to display a button in single product templates. Options are also displayed depending on product type. e.g. quantity, variation.

In this initial implementation, the block wraps the PHP equivalent for the button form by invoking do_action( 'woocommerce_' . $product->get_type() . '_add_to_cart' ); and adding all the necessary support.

Fixes #8188

Editor Preview

The editor preview is just a placeholder in this initial moment: the style will change a bit later on as @vivialice and I had a convo today, and she is actively working on a design for it. Here's the current implementation:

Update: the following screenshot now refers to the final copy/design as discussed here.

Screenshot 2023-02-28 at 12 27 55

We discussed adding placeholders (gray boxes) for the additional content that may or may not be visible depending on the product type last week. As this approach was implemented, the end result was a bit polluted, so I defaulted to relying exclusively on the notice instead.

Editor Sidebar

Screenshot 2023-01-30 at 20 30 26

PS: The icon for this block also needs design review/approval cc: @vivialice .

Frontend

The content displayed on the frontend is dynamically changed depending on the product type:

Simple Product

Screenshot 2023-01-30 at 20 06 48

Grouped Product

Screenshot 2023-01-30 at 20 05 45

Variable Product

Screenshot 2023-01-30 at 20 03 51

Screenshot 2023-01-30 at 20 04 53

External Product

Screenshot 2023-01-30 at 20 07 33

Testing

Automated Tests

  • Changes in this PR are covered by Automated Tests.
    • Unit tests
    • E2E tests

User Facing Testing

  • Make sure you are using a block theme.
  • Make sure you have the following product types created in your store: Simple, Variable, Grouped and External.
  • Edit the Single Product template on the Site Editor ( e.g. path > wp-admin/site-editor.php?postType=wp_template&postId=woocommerce%2Fwoocommerce%2F%2Fsingle-product&canvas=edit&sidebar=%2Ftemplates).
  • Insert the new Add to Cart Form block and save.
  • Make sure in the editor you see a placeholder block and it matches the following:

Screenshot 2023-02-28 at 12 27 55

  • Access a single product page for a Simple product and ensure the content matches the one displayed on the screenshot shared here on this PR.
  • Access a single product page for a Variable product and ensure the content matches the one displayed on the screenshot shared here on this PR.
  • Access a single product page for a Grouped product and ensure the content matches the one displayed on the screenshot shared here on this PR.
  • Access a single product page for an External product and ensure the content matches the one displayed on the screenshot shared here on this PR.

WooCommerce Visibility

  • WooCommerce Core
  • Feature plugin
  • Experimental

Changelog

Enhancement: Add the Add to Cart Form block, allowing merchants to display a button so the customer can add a product to their cart. Options will also be displayed depending on product type. e.g. quantity, variation.

@github-actions
Copy link
Contributor

github-actions bot commented Jan 24, 2023

The release ZIP for this PR is accessible via:

https://wcblocks.wpcomstaging.com/wp-content/uploads/woocommerce-gutenberg-products-block-8284.zip

Script Dependencies Report

The compare-assets action has detected some changed script dependencies between this branch and trunk. Please review and confirm the following are correct before merging.

Script Handle Added Removed
reviews-frontend.js react, wc-settings, wp-a11y, wp-api-fetch, wp-compose, wp-element, wp-i18n, wp-is-shallow-equal, wp-polyfill ⚠️
active-filters-frontend.js lodash, react, wc-blocks-data-store, wc-price-format, wc-settings, wp-data, wp-element, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-polyfill, wp-primitives, wp-url ⚠️
all-products-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-blocks-registry, wc-blocks-shared-context, wc-blocks-shared-hocs, wc-price-format, wc-settings, wp-a11y, wp-api-fetch, wp-autop, wp-block-editor, wp-blocks, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-hooks, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-polyfill, wp-primitives, wp-url, wp-warning, wp-wordcount ⚠️
attribute-filter-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-settings, wp-a11y, wp-block-editor, wp-blocks, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-keycodes, wp-polyfill, wp-primitives, wp-url, wp-warning ⚠️
cart-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-blocks-registry, wc-blocks-shared-context, wc-blocks-shared-hocs, wc-price-format, wc-settings, wp-a11y, wp-api-fetch, wp-autop, wp-block-editor, wp-blocks, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-hooks, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-keycodes, wp-plugins, wp-polyfill, wp-primitives, wp-url, wp-warning, wp-wordcount ⚠️
checkout-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-blocks-registry, wc-blocks-shared-hocs, wc-price-format, wc-settings, wp-a11y, wp-api-fetch, wp-autop, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-hooks, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-keycodes, wp-plugins, wp-polyfill, wp-primitives, wp-url, wp-warning, wp-wordcount ⚠️
filter-wrapper-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-blocks-registry, wc-price-format, wc-settings, wp-a11y, wp-block-editor, wp-blocks, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-keycodes, wp-polyfill, wp-primitives, wp-url, wp-warning ⚠️
mini-cart-frontend.js wc-settings, wp-polyfill ⚠️
price-filter-frontend.js lodash, react, wc-blocks-data-store, wc-price-format, wc-settings, wp-data, wp-element, wp-i18n, wp-is-shallow-equal, wp-polyfill, wp-url ⚠️
rating-filter-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-settings, wp-a11y, wp-block-editor, wp-blocks, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-i18n, wp-is-shallow-equal, wp-keycodes, wp-polyfill, wp-primitives, wp-url, wp-warning ⚠️
single-product-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-blocks-registry, wc-blocks-shared-context, wc-blocks-shared-hocs, wc-price-format, wc-settings, wp-api-fetch, wp-autop, wp-block-editor, wp-blocks, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-hooks, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-polyfill, wp-primitives, wp-url, wp-warning, wp-wordcount ⚠️
stock-filter-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-settings, wp-a11y, wp-block-editor, wp-blocks, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-keycodes, wp-polyfill, wp-primitives, wp-url, wp-warning ⚠️
mini-cart-component-frontend.js lodash, react, wc-blocks-checkout, wc-blocks-data-store, wc-blocks-registry, wc-price-format, wc-settings, wp-a11y, wp-autop, wp-compose, wp-data, wp-deprecated, wp-dom, wp-element, wp-hooks, wp-html-entities, wp-i18n, wp-is-shallow-equal, wp-keycodes, wp-polyfill, wp-primitives, wp-url, wp-warning, wp-wordcount ⚠️

This comment was automatically generated by the ./github/compare-assets action.

TypeScript Errors Report

  • Files with errors: 497
  • Total errors: 2343

⚠️ ⚠️ This PR introduces new TS errors on 1 files:

assets/js/blocks/add-to-cart-form/index.tsx

comments-aggregator

@github-actions
Copy link
Contributor

github-actions bot commented Jan 24, 2023

Size Change: +1.74 kB (0%)

Total Size: 1.1 MB

Filename Size Change
build/active-filters.js 7.32 kB -4 B (0%)
build/all-reviews.js 7.66 kB -2 B (0%)
build/attribute-filter.js 12.3 kB -2 B (0%)
build/cart.js 47.2 kB +9 B (0%)
build/catalog-sorting.js 1.7 kB +1 B (0%)
build/checkout.js 43.7 kB -4 B (0%)
build/customer-account.js 3.12 kB -4 B (0%)
build/featured-category.js 13.1 kB -1 B (0%)
build/featured-product.js 13.4 kB +2 B (0%)
build/filter-wrapper.js 2.39 kB -3 B (0%)
build/handpicked-products.js 7.24 kB -2 B (0%)
build/legacy-template.js 2.85 kB +3 B (0%)
build/mini-cart-contents.js 17 kB -7 B (0%)
build/price-filter.js 8.39 kB +4 B (0%)
build/product-add-to-cart.js 8.63 kB +2 B (0%)
build/product-categories.js 2.36 kB -3 B (0%)
build/product-category-list.js 503 B -1 B (0%)
build/product-image.js 4.09 kB +2 B (0%)
build/product-new.js 7.58 kB +2 B (0%)
build/product-on-sale.js 7.91 kB -3 B (0%)
build/product-sale-badge.js 817 B -2 B (0%)
build/product-search.js 2.63 kB +2 B (0%)
build/product-stock-indicator.js 645 B -1 B (0%)
build/product-tag.js 8.06 kB -1 B (0%)
build/product-title.js 3.46 kB +1 B (0%)
build/product-top-rated.js 7.84 kB +2 B (0%)
build/products-by-attribute.js 8.53 kB +4 B (0%)
build/rating-filter.js 7.4 kB -1 B (0%)
build/reviews-by-category.js 11.2 kB +1 B (0%)
build/reviews-by-product.js 12.3 kB -1 B (0%)
build/single-product.js 9.98 kB -7 B (0%)
build/store-notices.js 1.65 kB +1 B (0%)
build/wc-blocks-editor-style-rtl.css 5.66 kB +106 B (+2%)
build/wc-blocks-editor-style.css 5.67 kB +108 B (+2%)
build/wc-blocks-style-rtl.css 26.7 kB +31 B (0%)
build/wc-blocks-style.css 26.7 kB +31 B (0%)
build/wc-blocks-vendors.js 64.4 kB -3 B (0%)
build/add-to-cart-form.js 1.48 kB +1.48 kB (new file) 🆕
ℹ️ View Unchanged
Filename Size
build/active-filters-frontend.js 7.98 kB
build/active-filters-wrapper-frontend.js 6 kB
build/all-products-frontend.js 11.7 kB
build/all-products.js 34.6 kB
build/attribute-filter-frontend.js 22.9 kB
build/attribute-filter-wrapper-frontend.js 7.67 kB
build/blocks-checkout.js 41.2 kB
build/breadcrumbs.js 2.04 kB
build/cart-blocks/cart-accepted-payment-methods-frontend.js 1.38 kB
build/cart-blocks/cart-cross-sells-frontend.js 253 B
build/cart-blocks/cart-cross-sells-products-frontend.js 9.7 kB
build/cart-blocks/cart-express-payment--checkout-blocks/express-payment-frontend.js 5.17 kB
build/cart-blocks/cart-express-payment-frontend.js 720 B
build/cart-blocks/cart-items-frontend.js 299 B
build/cart-blocks/cart-line-items--mini-cart-contents-block/products-table-frontend.js 5.36 kB
build/cart-blocks/cart-line-items-frontend.js 1.07 kB
build/cart-blocks/cart-order-summary-frontend.js 1.24 kB
build/cart-blocks/cart-totals-frontend.js 321 B
build/cart-blocks/empty-cart-frontend.js 345 B
build/cart-blocks/filled-cart-frontend.js 654 B
build/cart-blocks/order-summary-coupon-form-frontend.js 1.62 kB
build/cart-blocks/order-summary-discount-frontend.js 2.12 kB
build/cart-blocks/order-summary-fee-frontend.js 274 B
build/cart-blocks/order-summary-heading-frontend.js 455 B
build/cart-blocks/order-summary-shipping-frontend.js 14.8 kB
build/cart-blocks/order-summary-subtotal-frontend.js 274 B
build/cart-blocks/order-summary-taxes-frontend.js 435 B
build/cart-blocks/proceed-to-checkout-frontend.js 1.24 kB
build/cart-frontend.js 28.7 kB
build/checkout-blocks/actions-frontend.js 1.85 kB
build/checkout-blocks/billing-address--checkout-blocks/shipping-address-frontend.js 3.92 kB
build/checkout-blocks/billing-address-frontend.js 1.18 kB
build/checkout-blocks/contact-information-frontend.js 2.05 kB
build/checkout-blocks/express-payment-frontend.js 1.13 kB
build/checkout-blocks/fields-frontend.js 344 B
build/checkout-blocks/order-note-frontend.js 1.14 kB
build/checkout-blocks/order-summary-cart-items-frontend.js 3.67 kB
build/checkout-blocks/order-summary-coupon-form-frontend.js 1.78 kB
build/checkout-blocks/order-summary-discount-frontend.js 2.29 kB
build/checkout-blocks/order-summary-fee-frontend.js 277 B
build/checkout-blocks/order-summary-frontend.js 1.24 kB
build/checkout-blocks/order-summary-shipping-frontend.js 14.9 kB
build/checkout-blocks/order-summary-subtotal-frontend.js 275 B
build/checkout-blocks/order-summary-taxes-frontend.js 435 B
build/checkout-blocks/payment-frontend.js 8.43 kB
build/checkout-blocks/pickup-options-frontend.js 2.8 kB
build/checkout-blocks/shipping-address-frontend.js 1.14 kB
build/checkout-blocks/shipping-method-frontend.js 2.27 kB
build/checkout-blocks/shipping-methods-frontend.js 4.78 kB
build/checkout-blocks/terms-frontend.js 1.56 kB
build/checkout-blocks/totals-frontend.js 324 B
build/checkout-frontend.js 30.3 kB
build/filter-wrapper-frontend.js 14.1 kB
build/general-style-rtl.css 1.31 kB
build/general-style.css 1.31 kB
build/mini-cart-component-frontend.js 27.9 kB
build/mini-cart-contents-block/empty-cart-frontend.js 366 B
build/mini-cart-contents-block/filled-cart-frontend.js 268 B
build/mini-cart-contents-block/footer-frontend.js 2.79 kB
build/mini-cart-contents-block/items-frontend.js 237 B
build/mini-cart-contents-block/products-table-frontend.js 591 B
build/mini-cart-contents-block/shopping-button-frontend.js 313 B
build/mini-cart-contents-block/title-frontend.js 367 B
build/mini-cart-frontend.js 2 kB
build/mini-cart.js 4.3 kB
build/price-filter-frontend.js 13.9 kB
build/price-filter-wrapper-frontend.js 6.99 kB
build/price-format.js 1.19 kB
build/product-add-to-cart--product-button--product-category-list--product-image--product-price--product-r--a0326d00.js 253 B
build/product-add-to-cart--product-button--product-image--product-rating--product-title.js 151 B
build/product-add-to-cart-frontend.js 6.73 kB
build/product-best-sellers.js 7.6 kB
build/product-button--product-category-list--product-image--product-price--product-rating--product-sale-b--e17c7c01.js 496 B
build/product-button--product-image--product-price--product-rating--product-sale-badge--product-title.js 258 B
build/product-button-frontend.js 2.19 kB
build/product-button.js 3.99 kB
build/product-category-list-frontend.js 1.19 kB
build/product-category.js 8.58 kB
build/product-image-frontend.js 2.2 kB
build/product-price-frontend.js 2.29 kB
build/product-price.js 1.58 kB
build/product-query.js 6.08 kB
build/product-rating-frontend.js 1.62 kB
build/product-rating.js 919 B
build/product-results-count.js 1.65 kB
build/product-sale-badge-frontend.js 1.43 kB
build/product-sku-frontend.js 629 B
build/product-sku.js 378 B
build/product-stock-indicator-frontend.js 1.32 kB
build/product-summary-frontend.js 1.58 kB
build/product-summary.js 920 B
build/product-tag-list-frontend.js 1.18 kB
build/product-tag-list.js 497 B
build/product-title-frontend.js 1.62 kB
build/rating-filter-frontend.js 21.4 kB
build/rating-filter-wrapper-frontend.js 6.19 kB
build/reviews-frontend.js 7.14 kB
build/single-product-frontend.js 17.8 kB
build/stock-filter-frontend.js 21.1 kB
build/stock-filter-wrapper-frontend.js 5.85 kB
build/stock-filter.js 8.13 kB
build/vendors--attribute-filter-wrapper--cart-blocks/cart-cross-sells-products--cart-blocks/order-summary--82e4ed06-frontend.js 6.86 kB
build/vendors--attribute-filter-wrapper--rating-filter-wrapper--stock-filter-wrapper-frontend.js 7.7 kB
build/vendors--cart-blocks/cart-cross-sells-products--cart-blocks/cart-line-items--cart-blocks/cart-order--3c5fe802-frontend.js 5.26 kB
build/vendors--cart-blocks/cart-cross-sells-products--cart-blocks/order-summary-shipping--checkout-blocks--18f9376a-frontend.js 19.4 kB
build/vendors--cart-blocks/cart-cross-sells-products--product-add-to-cart-frontend.js 7.53 kB
build/vendors--cart-blocks/cart-line-items--checkout-blocks/order-summary-cart-items--mini-cart-contents---233ab542-frontend.js 3.14 kB
build/vendors--cart-blocks/order-summary-shipping--checkout-blocks/billing-address--checkout-blocks/order--5b8feb0b-frontend.js 4.83 kB
build/vendors--checkout-blocks/shipping-method-frontend.js 12 kB
build/vendors--checkout-blocks/shipping-methods-frontend.js 9.48 kB
build/wc-blocks-data.js 21.4 kB
build/wc-blocks-google-analytics.js 1.56 kB
build/wc-blocks-middleware.js 933 B
build/wc-blocks-registry.js 3.15 kB
build/wc-blocks-shared-context.js 1.52 kB
build/wc-blocks-shared-hocs.js 1.73 kB
build/wc-blocks-vendors-style-rtl.css 1.96 kB
build/wc-blocks-vendors-style.css 1.96 kB
build/wc-blocks.js 2.65 kB
build/wc-payment-method-bacs.js 816 B
build/wc-payment-method-cheque.js 811 B
build/wc-payment-method-cod.js 909 B
build/wc-payment-method-paypal.js 837 B
build/wc-settings.js 2.6 kB
build/wc-shipping-method-pickup-location.js 29.7 kB
build/wp-directives-runtime.js 2.4 kB
build/wp-directives-vendors.js 7.89 kB

compressed-size-action

@nefeline nefeline self-assigned this Jan 27, 2023
@nefeline nefeline added the type: new block Applied to work that introduces a new block (typically used on an epic issue). label Jan 27, 2023
@nefeline nefeline marked this pull request as ready for review January 30, 2023 19:53
@woocommercebot woocommercebot requested review from a team and albarin and removed request for a team January 30, 2023 19:54
@albarin
Copy link
Contributor

albarin commented Jan 31, 2023

@nefeline This is looking great! 🙌

Preapproving and just adding this small comment: I've been recently using the Notice component as well and Albert found this issue with it on dark themes. Was solved by this PR: #8278, I suggest doing something like this, otherwise the Notice is not legible on dark themes:
Screenshot 2023-01-31 at 09 40 15

Copy link
Contributor

@thealexandrelara thealexandrelara left a comment

Choose a reason for hiding this comment

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

Great job! Thank you for working on this, I'm approving this PR since everything is working as expected and the only thing we still need to discuss is about the block name

@github-actions github-actions bot added this to the 9.6.0 milestone Feb 1, 2023
@nefeline nefeline changed the title Create the Add to Cart Button Block Create the Add to Cart Form Block Feb 2, 2023
@vivialice
Copy link

👋 LGTM! Thanks @nefeline

I was thinking about the icon and the above discussion on the naming... to me, this is a CTA and it makes the most sense to use an icon that indicates that - like the core Button icon.

However, I see that using the term 'button' in the description doesn't capture the full capabilities of the block. I am curious, if when we fully blockify this block we will separate it from a CTA that works for bookings, subscriptions etc.? I could see us creating variations of an Add to cart block for those types of products. In that case, I think Add to Cart Button suits fine for the time being. Thoughts?

@github-actions
Copy link
Contributor

This PR has been marked as stale because it has not seen any activity within the past 7 days. Our team uses this tool to help surface pull requests that have slipped through review.

If deemed still relevant, the pr can be kept active by ensuring it's up to date with the main branch and removing the stale label.

@github-actions github-actions bot added the status: stale Stale issues and PRs have had no updates for 60 days. label Feb 13, 2023
@tarhi-saad tarhi-saad modified the milestones: 9.6.0, 9.7.0 Feb 13, 2023
@nefeline
Copy link
Contributor Author

nefeline commented Feb 13, 2023

👋 LGTM! Thanks @nefeline

Thanks!

I was thinking about the icon and the above discussion on the naming... to me, this is a CTA and it makes the most sense to use an icon that indicates that - like the core Button icon.

Makes sense. Updated to match the core Button icon:

Screenshot 2023-02-13 at 19 00 38

I see that using the term 'button' in the description doesn't capture the full capabilities of the block. I am curious, if when we fully blockify this block we will separate it from a CTA that works for bookings, subscriptions etc.? I could see us creating variations of an Add to cart block for those types of products. In that case, I think Add to Cart Button suits fine for the time being. Thoughts?

It might be too soon to define this, but I believe it makes sense to keep this block as a CTA dynamically changed depending on the product type even after "fully blockifying" it, as the action triggered by the button is directly dependent on the product type and what the user selected for the related options available.

@nefeline nefeline removed the status: stale Stale issues and PRs have had no updates for 60 days. label Feb 13, 2023
@nefeline nefeline mentioned this pull request Feb 14, 2023
7 tasks
@nefeline
Copy link
Contributor Author

I'm going ahead and merging this one: there's some follow up work to do based on the most recent restructure done on #8225 (review) , opening a separate PR to handle these.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
type: enhancement The issue is a request for an enhancement. type: new block Applied to work that introduces a new block (typically used on an epic issue).
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Create the Add to Cart block
8 participants