woocommerce/plugins/woocommerce-blocks/assets/js
Manish Menaria 2433664aa8
Product Collection - Show product picker in Editor when collection requires a product but it doesn't exist (#50164)
* Show product picker control in the editor when a product context is required but not provided

Enhanced the Product Collection block by introducing the `selectedReference` attribute and implementing a product picker control. This control appears in the editor when a product context is required but not provided in the current template/page/post.

1. **block.json**: Added `selectedReference` attribute of type `object`.
2. **constants.ts**: Included `selectedReference` in the `queryContextIncludes` array.
3. **EditorProductPicker.tsx**: Created a new component for selecting products within the editor.
4. **editor.scss**: Added styles for the new Editor Product Picker component.
5. **index.tsx**: Updated logic to determine the component to render, incorporating the new Editor Product Picker.
6. **types.ts**: Defined types for `selectedReference` and updated `ProductCollectionAttributes` interface.

This enhancement allows merchants to manually select a product for collections that require a product context, ensuring the block displays correctly even when the product context is not available in the current template/page/post.

- **Product Picker Control**: Utilizes the existing `ProductControl` component for selecting products. This component is displayed in the editor when a collection requires a product context but it doesn't exist in the current template/page/post.

* Update label on ProductControl component

* Implement dynamic UI state management for product collection block

- Introduced `ProductCollectionUIStatesInEditor` enum to define various UI states for the product collection block.
- Added `getProductCollectionUIStateInEditor` utility function to determine the appropriate UI state based on context.
- Updated `Edit` component to use `getProductCollectionUIStateInEditor` for dynamic state management.
- Refactored `ProductCollectionContent` to utilize the new Editor UI state management.

* Fix: Product picker isn't showing

* Fix: Preview label state isn't showing

* Add changefile(s) from automation for the following project(s): woocommerce-blocks

* Refactor WooCommerceBlockLocation type

- Introduced specific interfaces for WooCommerceBlockLocation, including ProductLocation, ArchiveLocation, CartLocation, OrderLocation, and SiteLocation, to improve type safety and code clarity.
- Updated createLocationObject function to return a BaseLocation type.
- Refactored useSetPreviewState hook in product-collection utils:
  - Extracted termId from location.sourceData for cleaner and more readable code.
  - Replaced direct access of location.sourceData?.termId with termId variable.

* Remove fallback to 0 in case there may be a product with id 0

* Use optional chaining to avoid undefined errors

* Rename  to

* Change order of arguments in  function

* Pass boolean prop instead of making further recognition of the UI state in ProductCollectionContent

* Destructure  props in  component

* Rename  to

* Update names in  enum

* Rename  to  and change the structure to single number.

* Rename location to

* Add a method to choose a product in the product picker in Editor

* Add E2E tests

* Fix failing e2e tests by changing location to productCollectionLocation

* Add changefile(s) from automation for the following project(s): woocommerce-blocks

* Don't allow selecting product variations

* Minor code refactoring

* Fix: Product control isn't showing products

**Before**
```tsx
const getRenderItemFunc = () => {
		if ( renderItem ) {
			return renderItem;
		} else if ( showVariations ) {
			return renderItemWithVariations;
		}
    return () => null;
	};
```

As you can see above, `return () => null;` is returning a function which is causing the issue. This will render nothing in the list. I changed this to `return undefined;`. This way, we will use default render item function.

* Translate text in ProductPicker component

* Improve E2E test

* Use createInterpolateElement to safely render strong HTML tag

* Fix E2E tests

* Fix E2E tests

* Product Collection: Inspector control to change selected product (#50590)

* Add Linked Product Control to Product Collection Block Inspector Controls

- Introduced a new `LinkedProductControl` component in the Product Collection block's Inspector Controls.
- This control allows users to link a specific product to the product collection via a dropdown with a search capability.
- Added corresponding styles to `editor.scss`.
- Integrated a `useGetProduct` hook in the `utils.tsx` to fetch and manage the state of the linked product data, including handling loading states and errors.
- Updated the Inspector Controls to include the new Linked Product Control component, enhancing the block's customization options for users.

* Add E2E tests

* Hide product picker when product context is available

* Improve logic to hide Linked Product Control

* Add changefile(s) from automation for the following project(s): woocommerce-blocks

* Remove hasError state from useGetProduct hook

* Rename isShowLinkedProductControl to showLinkedProductControl

* Convert jsxProductButton to ProductButton component

* Refactor jsxPopoverContent to LinkedProductPopoverContent component

* Improve UI of Linked Product Control

* Address PR feedback

* Fix E2E tests

---------

Co-authored-by: github-actions <github-actions@github.com>

* Rename isUsesReferencePreviewMode to isUsingReferencePreviewMode

* Change order of conditions in getProductCollectionUIStateInEditor

---------

Co-authored-by: github-actions <github-actions@github.com>
2024-09-02 12:39:33 +05:30
..
atomic `Product SKU` improvements (#51033) 2024-08-30 10:23:28 +02:00
base Convert with-reviews to TS (#50890) 2024-08-27 16:29:44 -03:00
blocks Product Collection - Show product picker in Editor when collection requires a product but it doesn't exist (#50164) 2024-09-02 12:39:33 +05:30
blocks-registry Product Collection: Enable Context-Aware Previews by Adding `usesReference` to `registerProductCollection` (#49796) 2024-08-01 15:33:27 +05:30
data Fix typos. (#50047) 2024-08-23 18:26:09 +01:00
editor-components Product Collection - Show product picker in Editor when collection requires a product but it doesn't exist (#50164) 2024-09-02 12:39:33 +05:30
extensions Use `createRoot().render()` instead of `render()` (#48858) 2024-07-04 11:36:38 +02:00
filters Fixed Blocks Linting Errors (#42727) 2023-12-12 15:05:20 -08:00
hocs With Product Variations HOC > Convert to TypeScript (#44785) 2024-02-26 10:26:21 -03:00
icons [Experimental]: Update: new title and icon for the Overlay Navigation block (#50011) 2024-07-31 12:56:53 +07:00
interactivity [WIP][Accessibility] Fix inline documentation typos in woocommerce-blocks (#50737) 2024-08-19 13:57:38 +01:00
middleware Fixed Blocks Linting Errors (#42727) 2023-12-12 15:05:20 -08:00
previews Extensibility: Format currency config so it can be consumed more easily (#48727) 2024-07-12 14:24:22 +01:00
settings Add validation to select fields and add placeholder option to additional fields API (#49929) 2024-07-26 16:38:44 +00:00
shared Convert inner-block-layout-context to typescript (https://github.com/woocommerce/woocommerce-blocks/pull/9799) 2023-06-14 06:36:39 -07:00
templates/revert-button Update revert button text and description (#48717) 2024-07-03 19:31:50 +05:30
types Fix extensionCartUpdates not surfacing errors to cart and checkout (#49762) 2024-08-14 15:24:44 +01:00
utils Use the term attribute sort order for the "Filter by attribute" block (#47616) 2024-05-21 15:44:08 +02:00
global.d.ts WIP - Checkout i2 Feature Branch Tracking (https://github.com/woocommerce/woocommerce-blocks/pull/4268) 2021-07-22 12:03:00 +01:00
index.js Move registration of block categories on the server side (#47836) 2024-06-03 20:34:41 +02:00