Merge branch 'trunk' into update-38820-enhancement-api-search-customers-with-non-empty-email-or-name-or-address

# Conflicts:
#	plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api/reports-customers.php
This commit is contained in:
kidinov 2023-06-26 10:01:38 +02:00
commit 89d3a1ecee
265 changed files with 4080 additions and 3829 deletions

View File

@ -35,7 +35,8 @@ Please take a moment to review the [project readme](https://github.com/woocommer
- Ensure you stick to the [WordPress Coding Standards](https://make.wordpress.org/core/handbook/best-practices/coding-standards/php/).
- Run our build process described in the document on [how to set up WooCommerce development environment](https://github.com/woocommerce/woocommerce/wiki/How-to-set-up-WooCommerce-development-environment), it will install our pre-commit hook, code sniffs, dependencies, and more.
- Whenever possible please fix pre-existing code standards errors in the files that you change. It is ok to skip that for larger files or complex fixes.
- Before pushing commits to GitHub, check your code against our code standards. For PHP code in the WooCommerce Core project you can do this by running `pnpm --filter=woocommerce run lint:php:changes:branch`.
- Whenever possible, please fix pre-existing code standards errors in code that you change.
- Ensure you use LF line endings in your code editor. Use [EditorConfig](http://editorconfig.org/) if your editor supports it so that indentation, line endings and other settings are auto configured.
- When committing, reference your issue number (#1234) and include a note about the fix.
- Ensure that your code supports the minimum supported versions of PHP and WordPress; this is shown at the top of the `readme.txt` file.

View File

@ -43,7 +43,7 @@ runs:
with:
php-version: ${{ inputs.php-version }}
coverage: none
tools: phpcs, sirbrillig/phpcs-changed:2.10.2
tools: phpcs, sirbrillig/phpcs-changed:2.11.1
- name: Cache Composer Dependencies
uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8

View File

@ -61,6 +61,12 @@
'plugin: woocommerce':
- plugins/woocommerce/**/*
'plugin: woocommerce beta tester':
- plugins/woocommerce-beta-tester/**/*
'plugin: woo-ai':
- plugins/woo-ai/**/*
'focus: react admin [team:Ghidorah]':
- plugins/woocommerce/src/Admin/**/*
- plugins/woocommerce/src/Internal/Admin/**/*

View File

@ -1,287 +0,0 @@
name: Bump WP L-2 Support
on:
workflow_dispatch:
inputs:
releaseBranch:
description: Provide the release branch you want to bump the WP L-2 support. Example release/6.9. Note that trunk will also be bumped to match.
default: ''
required: true
permissions: {}
env:
GIT_COMMITTER_NAME: 'WooCommerce Bot'
GIT_COMMITTER_EMAIL: 'no-reply@woocommerce.com'
GIT_AUTHOR_NAME: 'WooCommerce Bot'
GIT_AUTHOR_EMAIL: 'no-reply@woocommerce.com'
jobs:
check-release-branch-exists:
name: Check for existence of release branch
runs-on: ubuntu-20.04
steps:
- name: Check for release branch
id: release-branch-check
uses: actions/github-script@v6
with:
script: |
// This will throw an error for non-200 responses, which prevents subsequent jobs from completing, as desired.
await github.request( 'GET /repos/{owner}/{repo}/branches/{branch}', {
owner: context.repo.owner,
repo: context.repo.repo,
branch: '${{ inputs.releaseBranch }}',
} );
validate-bump:
name: Validate and bump WP L-2 support version
runs-on: ubuntu-20.04
needs: check-release-branch-exists
if: success()
permissions:
actions: write
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v3
- name: Get latest WP version
id: latestWP
uses: actions/github-script@v6
with:
script: |
const https = require( 'https' );
https.get( 'https://api.wordpress.org/core/stable-check/1.0/', ( resp ) => {
let data = '';
// A chunk of data has been received.
resp.on( 'data', ( chunk ) => {
data += chunk;
} );
// The whole response has been received. Print out the result.
resp.on( 'end', () => {
JSON.parse(data, ( key, val ) => {
if ( val === 'latest' ) {
core.setOutput( 'version', key )
}
} );
} );
} ).on( 'error', ( err ) => {
console.log( 'Error: ' + err.message );
} );
- name: Get L-2 WP version
id: l2Version
if: steps.latestWP.outputs.version != '' && steps.latestWP.outputs.version != null
uses: actions/github-script@v6
with:
script: |
const version = "${{ steps.latestWP.outputs.version }}";
const latestWPVersionMajor = version.split( '.' )[0];
const latestWPVersionMinor = version.split( '.' )[1];
const l2 = (parseInt( ( latestWPVersionMajor + latestWPVersionMinor ), 10 ) - 2 ).toString();
const l2Major = l2.split( '' )[0];
const l2Minor = l2.split( '' )[1];
core.setOutput( 'version', l2Major + '.' + l2Minor );
- name: Git fetch the release branch
run: git fetch origin ${{ inputs.releaseBranch }}
- name: Checkout release branch
run: git checkout ${{ inputs.releaseBranch }}
- name: Create a PR branch based on release branch
run: git checkout -b WP-L-2-version-support-${{ steps.l2Version.outputs.version }}/${{ inputs.releaseBranch }}
- name: Check if WP L-2 support needs to be bumped the release branch
id: readmeWPVersion
if: steps.l2Version.outputs.version != '' && steps.l2Version.outputs.version != null
uses: actions/github-script@v6
with:
script: |
const fs = require( 'node:fs' );
const l2Version = "${{ steps.l2Version.outputs.version }}";
let readme = '';
fs.readFile( './plugins/woocommerce/readme.txt', 'utf-8', function( err, data ) {
if ( err ) {
console.error( err );
}
readme = data.split( "\n" );
const newReadme = [];
let needsChange = false;
for ( const line of readme ) {
if ( line.match( /Requires\sat\sleast:\s\d+\.\d/ ) ) {
const readmeVersion = line.match( /\d+\.\d/ );
// If the versions don't match, means we need to make a change.
if ( readmeVersion != l2Version ) {
needsChange = true;
newReadme.push( 'Requires at least: ' + l2Version );
continue;
}
}
newReadme.push( line );
}
if ( needsChange ) {
fs.writeFile( './plugins/woocommerce/readme.txt', newReadme.join( "\n" ), err => {
if ( err ) {
core.setFailed( `Unable to bump the WP L-2 support version. ${err}` );
}
core.setOutput( 'needsChange', needsChange );
// Copy the readme.txt file to the root of VM to be used later.
fs.writeFile( '../../readme.txt', newReadme.join( "\n" ), err => {
if ( err ) {
core.setFailed( `Unable to copy the readme.txt file to the root of VM. ${err}` );
}
} );
} );
} else {
core.setFailed( 'No changes needed. WP Version is L-2 compatible.' );
}
} );
- name: Commit changes
if: steps.readmeWPVersion.outputs.needsChange == 'true'
run: git commit --no-verify -am "Update readme.txt WP L-2 support version."
- name: Push changes
if: steps.readmeWPVersion.outputs.needsChange == 'true'
run: git push origin WP-L-2-version-support-${{ steps.l2Version.outputs.version }}/${{ inputs.releaseBranch }}
- name: Push the PR up to GitHub
id: release-branch-pr
if: steps.readmeWPVersion.outputs.needsChange == 'true'
uses: actions/github-script@v6
with:
script: |
const PRBody = "This PR bumps the WP version to L-2 compatible for the release branch ${{ inputs.releaseBranch }}.\n";
const pr = await github.rest.pulls.create( {
owner: context.repo.owner,
repo: context.repo.repo,
title: "Bump WP Version to L-2 compatible for ${{ inputs.releaseBranch }}",
head: "WP-L-2-version-support-${{ steps.l2Version.outputs.version }}/${{ inputs.releaseBranch }}",
base: "${{ inputs.releaseBranch }}",
body: PRBody
} );
if ( pr.status != 201 ) {
core.setFailed( "Unable to push WP-L-2-version-support-${{ steps.l2Version.outputs.version }}/${{ inputs.releaseBranch }} to GitHub." );
}
core.setOutput( 'pr', pr.data.number );
await github.rest.pulls.requestReviewers( {
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr.data.number,
reviewers: [ context.actor ]
} );
- name: Checkout trunk branch
if: steps.release-branch-pr.outputs.pr != '' && steps.release-branch-pr.outputs.pr != null
run: git checkout trunk
- name: Create a branch based on trunk branch
if: steps.release-branch-pr.outputs.pr != '' && steps.release-branch-pr.outputs.pr != null
run: git checkout -b WP-L-2-version-support-${{ steps.l2Version.outputs.version }}/trunk
- name: Check if WP L-2 support needs to be bumped for trunk
id: readmeWPVersionTrunk
if: steps.release-branch-pr.outputs.pr != '' && steps.release-branch-pr.outputs.pr != null
uses: actions/github-script@v6
with:
script: |
const fs = require( 'node:fs' );
const l2Version = "${{ steps.l2Version.outputs.version }}";
let readme = '';
fs.readFile( './plugins/woocommerce/readme.txt', 'utf-8', function( err, data ) {
if ( err ) {
console.error( err );
}
readme = data.split( "\n" );
const newReadme = [];
let needsChange = false;
for ( const line of readme ) {
if ( line.match( /Requires\sat\sleast:\s\d+\.\d/ ) ) {
const readmeVersion = line.match( /\d+\.\d/ );
// If the versions don't match, means we need to make a change.
if ( readmeVersion != l2Version ) {
needsChange = true;
newReadme.push( 'Requires at least: ' + l2Version );
continue;
}
}
newReadme.push( line );
}
if ( needsChange ) {
fs.writeFile( './plugins/woocommerce/readme.txt', newReadme.join( "\n" ), err => {
if ( err ) {
core.setFailed( `Unable to bump the WP L-2 support version. ${err}` );
}
core.setOutput( 'needsChange', needsChange );
// Copy the readme.txt file to the root of VM to be used later.
fs.writeFile( '../../readme.txt', newReadme.join( "\n" ), err => {
if ( err ) {
core.setFailed( `Unable to copy the readme.txt file to the root of VM. ${err}` );
}
} );
} );
} else {
core.setFailed( 'No changes needed. WP Version is L-2 compatible.' );
}
} );
- name: Commit changes
if: steps.readmeWPVersionTrunk.outputs.needsChange == 'true'
run: git commit --no-verify -am "Update readme.txt WP L-2 support version."
- name: Push changes
if: steps.readmeWPVersionTrunk.outputs.needsChange == 'true'
run: git push origin WP-L-2-version-support-${{ steps.l2Version.outputs.version }}/trunk
- name: Push the PR up to GitHub
if: steps.readmeWPVersionTrunk.outputs.needsChange == 'true'
uses: actions/github-script@v6
with:
script: |
const PRBody = "This PR bumps the WP version to L-2 compatible for trunk.\n";
const pr = await github.rest.pulls.create( {
owner: context.repo.owner,
repo: context.repo.repo,
title: "Bump WP Version to L-2 compatible for trunk",
head: "WP-L-2-version-support-${{ steps.l2Version.outputs.version }}/trunk",
base: "trunk",
body: PRBody
} );
if ( pr.status != 201 ) {
core.setFailed( "Unable to push WP-L-2-version-support-${{ steps.l2Version.outputs.version }}/trunk to GitHub." );
}
await github.rest.pulls.requestReviewers( {
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pr.data.number,
reviewers: [ context.actor ]
} );

View File

@ -1,5 +1,171 @@
== Changelog ==
= 7.8.0 2023-06-13 =
**WooCommerce**
* Fix - Fix a bug where text overlapped the image in the task list header. [#38585](https://github.com/woocommerce/woocommerce/pull/38585)
* Fix - Fix issue where undefined query params where not removed from links, causing unexpected behaviour in Analytics. [#38542](https://github.com/woocommerce/woocommerce/pull/38542)
* Fix - Above notification threshold when "Out of stock threshold" filed value is empty [[#37855]](https://github.com/woocommerce/woocommerce/pull/37855)
* Fix - Added numeric check for Regular price in bulk edits. [[#37812]](https://github.com/woocommerce/woocommerce/pull/37812)
* Fix - add missing aria-label attributes to help tips [[#37808]](https://github.com/woocommerce/woocommerce/pull/37808)
* Fix - add refunded_payment property in the create refund response [[#37816]](https://github.com/woocommerce/woocommerce/pull/37816)
* Fix - Add support to verify specific order types. [[#38318]](https://github.com/woocommerce/woocommerce/pull/38318)
* Fix - Add the product name to the "Remove from cart" button's aria-label in the cart and mini cart. [[#37830]](https://github.com/woocommerce/woocommerce/pull/37830)
* Fix - Clear floats in Twenty Twenty Three theme on Related products and Upsells. [[#37877]](https://github.com/woocommerce/woocommerce/pull/37877)
* Fix - Ensure the remove icon shows properly on smaller screens when using the Twenty Twenty One theme [[#37859]](https://github.com/woocommerce/woocommerce/pull/37859)
* Fix - Fix "Add store details" task fails to mark as completed for selecting Nigeria based address [[#38181]](https://github.com/woocommerce/woocommerce/pull/38181)
* Fix - Fix: when order is deleted child orders should be deleted too, not set to parent id 0, unless the post type for the order is hierarchical [[#38199]](https://github.com/woocommerce/woocommerce/pull/38199)
* Fix - Fix activity panel not showing unread when closed [[#38173]](https://github.com/woocommerce/woocommerce/pull/38173)
* Fix - Fix decimal points for SEK, HUF and CZK currencies [[#37834]](https://github.com/woocommerce/woocommerce/pull/37834)
* Fix - Fixed Cross-Sells display variable product [[#37616]](https://github.com/woocommerce/woocommerce/pull/37616)
* Fix - Fixes a race condition when adding the first attribute form to the product edit screen. [[#38354]](https://github.com/woocommerce/woocommerce/pull/38354)
* Fix - Fix get_options deprecation notice [[#38289]](https://github.com/woocommerce/woocommerce/pull/38289)
* Fix - Fix loading sample product's progress message is misaligned if Gutenberg plugin is enabled [[#38107]](https://github.com/woocommerce/woocommerce/pull/38107)
* Fix - fix logout vs log out typo [[#35232]](https://github.com/woocommerce/woocommerce/pull/35232)
* Fix - Fix product task import for cases when user locale is en_US [[#38089]](https://github.com/woocommerce/woocommerce/pull/38089)
* Fix - Fix race condition that caused some store alerts to be undismissable [[#38047]](https://github.com/woocommerce/woocommerce/pull/38047)
* Fix - Fix shipping tour layout context error [[#38183]](https://github.com/woocommerce/woocommerce/pull/38183)
* Fix - fix stock status is not correct in JSON structure data if product is onbackorder [[#37837]](https://github.com/woocommerce/woocommerce/pull/37837)
* Fix - Fix task list progress title when no tasks are completed [[#38092]](https://github.com/woocommerce/woocommerce/pull/38092)
* Fix - Fix tracks user ID mismatch between PHP and JS when Jetpack is active and connected [[#38094]](https://github.com/woocommerce/woocommerce/pull/38094)
* Fix - Fix wc-experimental not translated issue [[#38108]](https://github.com/woocommerce/woocommerce/pull/38108)
* Fix - Fix wrong file name in error message in update-wp-env.php. [[#37891]](https://github.com/woocommerce/woocommerce/pull/37891)
* Fix - For the Twenty Twenty One theme, reduce padding within notices on smaller screens [[#37862]](https://github.com/woocommerce/woocommerce/pull/37862)
* Fix - Hide state selector for Ethiopia and Rwanda addresses [[#35481]](https://github.com/woocommerce/woocommerce/pull/35481)
* Fix - Hide upload logo step in Personalize task if theme doesn't support it [[#38161]](https://github.com/woocommerce/woocommerce/pull/38161)
* Fix - No warning shown for zero price. [[#37817]](https://github.com/woocommerce/woocommerce/pull/37817)
* Fix - Prevented an issue with height flickering when selecting a variation [[#38115]](https://github.com/woocommerce/woocommerce/pull/38115)
* Fix - Prevent login call if the user is already logged in. [[#37850]](https://github.com/woocommerce/woocommerce/pull/37850)
* Fix - Prevents error in Customers API endpoint when date_created value is missing [[#37860]](https://github.com/woocommerce/woocommerce/pull/37860)
* Fix - Removed aria-disabled attribute from "Update Cart" button as it already has a disabled attribute. [[#37820]](https://github.com/woocommerce/woocommerce/pull/37820)
* Fix - Remove the default text in "Additional content" being sent for all emails when the field is empty for Admin New Order email [[#37883]](https://github.com/woocommerce/woocommerce/pull/37883)
* Fix - Removing auto-draft as wc post type to resolve publish time bug. [[#38099]](https://github.com/woocommerce/woocommerce/pull/38099)
* Fix - replace title HTML attribute with aria-label for quantity input field [[#37811]](https://github.com/woocommerce/woocommerce/pull/37811)
* Fix - Save an order created via the REST API to prevent overrides from 3rd party plugins or themes if they try to add fees to the order. [[#37845]](https://github.com/woocommerce/woocommerce/pull/37845)
* Fix - Show correct confirmation message when removing an attribute from a product. [[#38355]](https://github.com/woocommerce/woocommerce/pull/38355)
* Fix - Show correct variations count when generating a single variation. [[#37876]](https://github.com/woocommerce/woocommerce/pull/37876)
* Fix - skip k6 api order RUD tests on non-existent order when C test fails [[#37887]](https://github.com/woocommerce/woocommerce/pull/37887)
* Fix - skip k6 batch update when batch create fails [[#38282]](https://github.com/woocommerce/woocommerce/pull/38282)
* Fix - Support strict SQL modes in HPOS migration that dont allow zero date values. [[#38332]](https://github.com/woocommerce/woocommerce/pull/38332)
* Fix - use correct escaping function [[#36868]](https://github.com/woocommerce/woocommerce/pull/36868)
* Fix - Use waitUntil instead of waitForLoadState in page.goto() and page.click(). [[#37831]](https://github.com/woocommerce/woocommerce/pull/37831)
* Fix - When creating default storefront pages, the site language (and not the language of the current user) should be used. [[#37795]](https://github.com/woocommerce/woocommerce/pull/37795)
* Fix - Fix Layout Controller forwarding arrays from the URL query string. [#38593](https://github.com/woocommerce/woocommerce/pull/38593)
* Add - Added SSR to WCCOM endpoints. [#38433](https://github.com/woocommerce/woocommerce/pull/38433)
* Add - Add admin-side order edit lock for HPOS. [[#38230]](https://github.com/woocommerce/woocommerce/pull/38230)
* Add - Add a filter to exclude Jetpack from suggested free extensions REST endpoint. [[#38286]](https://github.com/woocommerce/woocommerce/pull/38286)
* Add - Add a function to get the aria-describedby description for the add to cart button.
Add default description for the Select options button. [[#37880]](https://github.com/woocommerce/woocommerce/pull/37880)
* Add - Add Business Location page to the new core profiler [[#38019]](https://github.com/woocommerce/woocommerce/pull/38019)
* Add - Add core profiler "Welcome to Woo" page [[#37952]](https://github.com/woocommerce/woocommerce/pull/37952)
* Add - Add core profiler user profile page [[#38328]](https://github.com/woocommerce/woocommerce/pull/38328)
* Add - Add description block to product editor template [[#37852]](https://github.com/woocommerce/woocommerce/pull/37852)
* Add - Add e2e test for Merchant > Pages > Can create a new page [[#38238]](https://github.com/woocommerce/woocommerce/pull/38238)
* Add - Add e2e test for Merchant > Posts > Can create a new post [[#38041]](https://github.com/woocommerce/woocommerce/pull/38041)
* Add - Added async fetching for extensions and countries lists in new core profiler [[#38270]](https://github.com/woocommerce/woocommerce/pull/38270)
* Add - Added scaffolding for new core profiler [[#37628]](https://github.com/woocommerce/woocommerce/pull/37628)
* Add - Add HPOS specific k6 test suite [[#37665]](https://github.com/woocommerce/woocommerce/pull/37665)
* Add - Adding order attributes to product tabs template. [[#38081]](https://github.com/woocommerce/woocommerce/pull/38081)
* Add - Add navigation and progress-bar componentns for the new core profiler [[#37741]](https://github.com/woocommerce/woocommerce/pull/37741)
* Add - Add Sale price validation#37985 [[#38078]](https://github.com/woocommerce/woocommerce/pull/38078)
* Add - add support for minlenght in the template [[#37840]](https://github.com/woocommerce/woocommerce/pull/37840)
* Add - Add tinymce scripts to product editor pages [[#38175]](https://github.com/woocommerce/woocommerce/pull/38175)
* Add - Add unresolved assets for iframe editors to editor settings [[#37570]](https://github.com/woocommerce/woocommerce/pull/37570)
* Add - Add WooCommerce Admin page class to body of every page [[#38281]](https://github.com/woocommerce/woocommerce/pull/38281)
* Add - Create orders as 'auto-draft' by default in admin. [[#37643]](https://github.com/woocommerce/woocommerce/pull/37643)
* Add - Get feature flags from client side [[#37122]](https://github.com/woocommerce/woocommerce/pull/37122)
* Add - Only register blocks when user navigates to the product edit page#38200 [[#38303]](https://github.com/woocommerce/woocommerce/pull/38303)
* Add - Show the number of variations imported [[#37829]](https://github.com/woocommerce/woocommerce/pull/37829)
* Add - Track stock quantity for this product should be disabled when Enable stock management within settings is disabled, and enabled otherwise [[#37957]](https://github.com/woocommerce/woocommerce/pull/37957)
* Add - Update List price Pricing link on the general tab to navigate to the Pricing tab [[#37961]](https://github.com/woocommerce/woocommerce/pull/37961)
* Add - Update shipping class block to match new designs#38044 [[#38301]](https://github.com/woocommerce/woocommerce/pull/38301)
* Update - Update WooCommerce Blocks to 10.2.3 [#38663](https://github.com/woocommerce/woocommerce/pull/38663)
* Update - Update WooCommerce Blocks to 10.2.2 [#38545](https://github.com/woocommerce/woocommerce/pull/38545)
* Update - Update WooCommerce Blocks to 10.2.1 [#38449](https://github.com/woocommerce/woocommerce/pull/38449)
* Update - Add action hooks to WC_Abstract_Order::remove_order_items [[#37822]](https://github.com/woocommerce/woocommerce/pull/37822)
* Update - Add new REST endpoints at onboarding/plugins to support async plugin installation with real time error tracking. [[#38174]](https://github.com/woocommerce/woocommerce/pull/38174)
* Update - add pagination navigation below Settings Tax list table [[#37916]](https://github.com/woocommerce/woocommerce/pull/37916)
* Update - Add support for `showHeader` config in router config to hide header if needed. [[#38247]](https://github.com/woocommerce/woocommerce/pull/38247)
* Update - Add tracks events to shipping settings [[#38305]](https://github.com/woocommerce/woocommerce/pull/38305)
* Update - Always show the product variations empty state with message when there are no "used for variations" attributes on a product. [[#38358]](https://github.com/woocommerce/woocommerce/pull/38358)
* Update - Change product-category-metabox JS/style enqueue logic [[#38076]](https://github.com/woocommerce/woocommerce/pull/38076)
* Update - Fallback to simply not display any prices rather than empty prices and re-enable Purchase unit tests [[#38163]](https://github.com/woocommerce/woocommerce/pull/38163)
* Update - In the WC Tracker, group payment methods and origins ignoring unique ids within their names. [[#37951]](https://github.com/woocommerce/woocommerce/pull/37951)
* Update - Loading svgs in product block template by URL. [[#37869]](https://github.com/woocommerce/woocommerce/pull/37869)
* Update - Make all fields in the tax location form mandatory [[#38137]](https://github.com/woocommerce/woocommerce/pull/38137)
* Update - Moving AddNewShippingClass modal to product-editor package. [[#37968]](https://github.com/woocommerce/woocommerce/pull/37968)
* Update - Moving product attributes components to product-editor package. [[#38051]](https://github.com/woocommerce/woocommerce/pull/38051)
* Update - Moving product block editor styling to prdouct editor package. [[#37805]](https://github.com/woocommerce/woocommerce/pull/37805)
* Update - Only add product template when new editor feature flag is enabled. [[#38276]](https://github.com/woocommerce/woocommerce/pull/38276)
* Update - Remove Core onboarding usage of woocommerce_updated hook [[#38158]](https://github.com/woocommerce/woocommerce/pull/38158)
* Update - Remove sample data from product templates [[#38343]](https://github.com/woocommerce/woocommerce/pull/38343)
* Update - Replacing hardcoded info and error notices with the correct wp_print_notice functions. [[#37514]](https://github.com/woocommerce/woocommerce/pull/37514)
* Update - Update Category product metabox with an async dropdown search control rendered with React. [[#36869]](https://github.com/woocommerce/woocommerce/pull/36869)
* Update - Update current block names to reflect use case and avoid conflicts#37704 [[#37851]](https://github.com/woocommerce/woocommerce/pull/37851)
* Update - Updated product description tips text. [[#38070]](https://github.com/woocommerce/woocommerce/pull/38070)
* Update - Update empty state for product attributes tab. [[#38126]](https://github.com/woocommerce/woocommerce/pull/38126)
* Update - Update Payfast's title and logo [[#38090]](https://github.com/woocommerce/woocommerce/pull/38090)
* Update - Update product template to include category section and block. [[#37295]](https://github.com/woocommerce/woocommerce/pull/37295)
* Update - Update transformers doc with examples [[#38176]](https://github.com/woocommerce/woocommerce/pull/38176)
* Update - Update WooCommerce Blocks to 10.2.0 [[#38246]](https://github.com/woocommerce/woocommerce/pull/38246)
* Update - Update Woo to L-1 support policy for 7.8 [[#37970]](https://github.com/woocommerce/woocommerce/pull/37970)
* Update - Updating product editor block template to include stock status and refactor others. [[#37906]](https://github.com/woocommerce/woocommerce/pull/37906)
* Update - Updating the usage of LayoutContext and moving to admin-layout package. [[#37720]](https://github.com/woocommerce/woocommerce/pull/37720)
* Update - Use snackbar instead of alert when showing generated variations message. [[#38103]](https://github.com/woocommerce/woocommerce/pull/38103)
* Update - Woo Blocks 10.0.4 [[#38135]](https://github.com/woocommerce/woocommerce/pull/38135)
* Dev - Added model based testing for new core profiler [[#38154]](https://github.com/woocommerce/woocommerce/pull/38154)
* Dev - Added xstate inspector toggling via localStorage flag and dev node environment, and eslint xstate plugin [[#38022]](https://github.com/woocommerce/woocommerce/pull/38022)
* Dev - Add Gutenberg nightly and latest stable into the daily and release smoke tests. [[#38287]](https://github.com/woocommerce/woocommerce/pull/38287)
* Dev - Add instruction to run Playwright UI mode in E2E readme. [[#38197]](https://github.com/woocommerce/woocommerce/pull/38197)
* Dev - Add missing woocommerce_run_on_woocommerce_admin_updated hook for the scheduled action registered in RemoteInboxNotificationsEngine [[#38159]](https://github.com/woocommerce/woocommerce/pull/38159)
* Dev - Add the ability to skip the `review-testing-instructions` workflow when the PR is from an external contributor. [[#37813]](https://github.com/woocommerce/woocommerce/pull/37813)
* Dev - Break down the "create-variable-product" spec into smaller specs. [[#38335]](https://github.com/woocommerce/woocommerce/pull/38335)
* Dev - Cleanup task list and organize tasks file structure [[#38271]](https://github.com/woocommerce/woocommerce/pull/38271)
* Dev - Correct URL and assertion in merchant/add-order perf test. [[#37719]](https://github.com/woocommerce/woocommerce/pull/37719)
* Dev - Increase default timeout and test timeout of create-variable-product spec. [[#38321]](https://github.com/woocommerce/woocommerce/pull/38321)
* Dev - Migrate tasks fills index.js, purchase.tsx and related utils to TS [[#37725]](https://github.com/woocommerce/woocommerce/pull/37725)
* Dev - Modify 'WC_Settings_Tracking' to allow dropdown options recording for WooCommerce Settings [[#38035]](https://github.com/woocommerce/woocommerce/pull/38035)
* Dev - Optimize installation routine by reducing the number of DELETE statments for admin notices. [[#37472]](https://github.com/woocommerce/woocommerce/pull/37472)
* Dev - Register server-side tracking during rest requests [[#37796]](https://github.com/woocommerce/woocommerce/pull/37796)
* Dev - Remove daily.playwright.config.js and references to it. [[#38336]](https://github.com/woocommerce/woocommerce/pull/38336)
* Dev - Removed wp-env workaround since the bug has been fixed [[#38326]](https://github.com/woocommerce/woocommerce/pull/38326)
* Dev - remove unused deasync dependency [[#37821]](https://github.com/woocommerce/woocommerce/pull/37821)
* Dev - Remove `qs` dependency from `woocommerce-admin` [[#35128]](https://github.com/woocommerce/woocommerce/pull/35128)
* Dev - Update Playwright to 1.33 and introduce UI command [[#38100]](https://github.com/woocommerce/woocommerce/pull/38100)
* Dev - Update pnpm to version 8. [[#37915]](https://github.com/woocommerce/woocommerce/pull/37915)
* Dev - Update stable tag to 7.6.1 [[#38006]](https://github.com/woocommerce/woocommerce/pull/38006)
* Dev - Update tasklist documentation/example [[#38245]](https://github.com/woocommerce/woocommerce/pull/38245)
* Dev - Update the E2E test timeout to 90 sec, and update the E2E README. [[#38288]](https://github.com/woocommerce/woocommerce/pull/38288)
* Dev - Update the WSL setup instructions in the readme. [[#37819]](https://github.com/woocommerce/woocommerce/pull/37819)
* Dev - Use locator.fill to fill variation values in the form instead of page.fill [[#37854]](https://github.com/woocommerce/woocommerce/pull/37854)
* Dev - Variations - Remove separator between buttons and empty state screen [[#38123]](https://github.com/woocommerce/woocommerce/pull/38123)
* Dev - Variations - Rename Generate variations button after variations are created. [[#38084]](https://github.com/woocommerce/woocommerce/pull/38084)
* Tweak - Add a 24px spacing to store management body [[#38088]](https://github.com/woocommerce/woocommerce/pull/38088)
* Tweak - Add context to translatable strings for credit card labels. [[#36364]](https://github.com/woocommerce/woocommerce/pull/36364)
* Tweak - Add product type options tracking to product publish and update events. [[#38017]](https://github.com/woocommerce/woocommerce/pull/38017)
* Tweak - Correct spelling errors [[#37887]](https://github.com/woocommerce/woocommerce/pull/37887)
* Tweak - Fix spelling errors in Remote Inbox Notifications Transformers documentation. [[#38387]](https://github.com/woocommerce/woocommerce/pull/38387)
* Tweak - Fix styling of product data field descriptions, including checkboxes and radio buttons. [[#38066]](https://github.com/woocommerce/woocommerce/pull/38066)
* Tweak - Fix typo in a function comment. [[#37829]](https://github.com/woocommerce/woocommerce/pull/37829)
* Tweak - Improve spacing of product gallery thumbs when using the Twenty Twenty-Two theme. [[#35491]](https://github.com/woocommerce/woocommerce/pull/35491)
* Tweak - Makes more information available to handlers for the `checkout_place_order` (and related) events. [[#38147]](https://github.com/woocommerce/woocommerce/pull/38147)
* Tweak - Update plugin listing description [[#38074]](https://github.com/woocommerce/woocommerce/pull/38074)
* Tweak - Update usage of AdvancedFilter to use createInterpolateElement formats. [[#37967]](https://github.com/woocommerce/woocommerce/pull/37967)
* Performance - Compute if any order is pending, when deciding to process next migration batch [[#38165]](https://github.com/woocommerce/woocommerce/pull/38165)
* Performance - Removed global enqueue of wc-cart-fragments. Moved to the cart widget (its main consumer). [[#35530]](https://github.com/woocommerce/woocommerce/pull/35530)
* Enhancement - Add default styles for product meta in the TT3 order details table [[#38172]](https://github.com/woocommerce/woocommerce/pull/38172)
* Enhancement - Added a button to download SSR to a file. [[#38110]](https://github.com/woocommerce/woocommerce/pull/38110)
* Enhancement - Added missing button element classes in account orders and downloads pages [[#37933]](https://github.com/woocommerce/woocommerce/pull/37933)
* Enhancement - Add order note to display held stock inventory to provide more visibility to merchants. [[#37833]](https://github.com/woocommerce/woocommerce/pull/37833)
* Enhancement - Change from using a figure to using a div around the single product image to improve accessibility [[#37853]](https://github.com/woocommerce/woocommerce/pull/37853)
* Enhancement - Fix comment list styling in TT2 [[#37894]](https://github.com/woocommerce/woocommerce/pull/37894)
* Enhancement - Fixed the attributes table styling in TT3 tabs content area [[#37895]](https://github.com/woocommerce/woocommerce/pull/37895)
* Enhancement - Order is search with the phone number and linked with the customer/user account. [[#37844]](https://github.com/woocommerce/woocommerce/pull/37844)
* Enhancement - Print blocks-based CSS classes only when a FSE theme is used [[#37631]](https://github.com/woocommerce/woocommerce/pull/37631)
* Enhancement - Rename tracks event product_attributes_add to product_attributes_save on the product page and update attributes [[#38278]](https://github.com/woocommerce/woocommerce/pull/38278)
* Enhancement - When deleting an administrator user, any existing webhook(s) owned to the user being deleted are re-assigned to the nominated user if the "Attribute all content to" option is chosen, or re-assigned to user id zero. This helps avoid `woocommerce_rest_cannot_view` webhook payload errors. [[#37814]](https://github.com/woocommerce/woocommerce/pull/37814)
= 7.7.2 2023-06-01 =
**WooCommerce**

View File

@ -0,0 +1,4 @@
Significance: minor
Type: add
Add callback for the media uploader component when gallery is opened

View File

@ -34,6 +34,7 @@ type MediaUploaderProps = {
message: string;
file: File;
} ) => void;
onMediaGalleryOpen?: () => void;
onUpload?: ( files: MediaItem[] ) => void;
onFileUploadChange?: ( files: MediaItem[] ) => void;
uploadMedia?: ( options: UploadMediaOptions ) => Promise< void >;
@ -49,6 +50,7 @@ export const MediaUploader = ( {
multipleSelect = false,
onError = () => null,
onFileUploadChange = () => null,
onMediaGalleryOpen = () => null,
onUpload = () => null,
onSelect = () => null,
uploadMedia = wpUploadMedia,
@ -96,7 +98,13 @@ export const MediaUploader = ( {
allowedTypes={ allowedMediaTypes }
multiple={ multipleSelect }
render={ ( { open } ) => (
<Button variant="secondary" onClick={ open }>
<Button
variant="secondary"
onClick={ () => {
onMediaGalleryOpen();
open();
} }
>
{ buttonText }
</Button>
) }

View File

@ -0,0 +1,4 @@
Significance: minor
Type: add
Add missing track events to product editing experience

View File

@ -5,6 +5,7 @@ import { __ } from '@wordpress/i18n';
import { createElement, useState } from '@wordpress/element';
import { parse, serialize } from '@wordpress/blocks';
import { Button } from '@wordpress/components';
import { recordEvent } from '@woocommerce/tracks';
import { useBlockProps } from '@wordpress/block-editor';
import { useEntityProp } from '@wordpress/core-data';
@ -31,7 +32,10 @@ export function Edit() {
<div { ...blockProps }>
<Button
variant="secondary"
onClick={ () => setIsModalOpen( true ) }
onClick={ () => {
setIsModalOpen( true );
recordEvent( 'product_add_description_click' );
} }
>
{ description.length
? __( 'Edit description', 'woocommerce' )

View File

@ -87,6 +87,9 @@ export function Edit() {
multipleSelect={ true }
onError={ () => null }
onFileUploadChange={ onFileUpload }
onMediaGalleryOpen={ () => {
recordEvent( 'product_images_media_gallery_open' );
} }
onSelect={ ( files ) => {
const newImages = files.filter(
( img: Image ) =>

View File

@ -16,6 +16,7 @@ import {
Link,
} from '@woocommerce/components';
import { getAdminLink } from '@woocommerce/settings';
import { recordEvent } from '@woocommerce/tracks';
/**
* Internal dependencies
@ -182,7 +183,10 @@ export const AttributeControl: React.FC< AttributeControlProps > = ( {
<Button
variant="secondary"
className="woocommerce-add-attribute-list-item__add-button"
onClick={ openNewModal }
onClick={ () => {
openNewModal();
recordEvent( 'product_add_attributes_click' );
} }
>
{ uiStrings.newAttributeListItemLabel }
</Button>

View File

@ -23,6 +23,7 @@ import {
* Internal dependencies
*/
import { EnhancedProductAttribute } from '../../hooks/use-product-attributes';
import { TRACKS_SOURCE } from '../../constants';
type NarrowedQueryAttribute = Pick< QueryProductAttribute, 'id' | 'name' >;
@ -112,7 +113,7 @@ export const AttributeInputField: React.FC< AttributeInputFieldProps > = ( {
onSelect={ ( attribute ) => {
if ( isNewAttributeListItem( attribute ) ) {
recordEvent( 'product_attribute_add_custom_attribute', {
new_product_page: true,
source: TRACKS_SOURCE,
} );
}
onChange(

View File

@ -19,6 +19,11 @@ import {
QueryProductAttribute,
} from '@woocommerce/data';
/**
* Internal dependencies
*/
import { TRACKS_SOURCE } from '../../constants';
type CreateAttributeTermModalProps = {
initialAttributeTermName: string;
attributeId: number;
@ -41,7 +46,7 @@ export const CreateAttributeTermModal: React.FC<
const onAdd = async ( attribute: Partial< ProductAttributeTerm > ) => {
recordEvent( 'product_attribute_term_add', {
new_product_page: true,
source: TRACKS_SOURCE,
} );
setIsCreating( true );
try {
@ -51,14 +56,14 @@ export const CreateAttributeTermModal: React.FC<
attribute_id: attributeId,
} );
recordEvent( 'product_attribute_term_add_success', {
new_product_page: true,
source: TRACKS_SOURCE,
} );
invalidateResolutionForStoreSelector( 'getProductAttributes' );
setIsCreating( false );
onCreated( newAttribute );
} catch ( e ) {
recordEvent( 'product_attribute_term_add_failed', {
new_product_page: true,
source: TRACKS_SOURCE,
} );
createNotice(
'error',

View File

@ -28,6 +28,7 @@ import {
mapFromCategoriesToTreeItems,
mapFromCategoryToTreeItem,
} from './category-field';
import { TRACKS_SOURCE } from '../../constants';
type CreateCategoryModalProps = {
initialCategoryName?: string;
@ -61,7 +62,7 @@ export const CreateCategoryModal: React.FC< CreateCategoryModalProps > = ( {
const onSave = async () => {
recordEvent( 'product_category_add', {
new_product_page: true,
source: TRACKS_SOURCE,
} );
setIsCreating( true );
try {

View File

@ -13,6 +13,11 @@ import { cleanForSlug } from '@wordpress/url';
import { Product } from '@woocommerce/data';
import { recordEvent } from '@woocommerce/tracks';
/**
* Internal dependencies
*/
import { TRACKS_SOURCE } from '../../constants';
type EditProductLinkModalProps = {
product: Product;
permalinkPrefix: string;
@ -40,7 +45,7 @@ export const EditProductLinkModal: React.FC< EditProductLinkModalProps > = ( {
const onSave = async () => {
recordEvent( 'product_update_slug', {
new_product_page: true,
source: TRACKS_SOURCE,
product_id: product.id,
product_type: product.type,
} );

View File

@ -2,11 +2,11 @@
* External dependencies
*/
import { createElement, Fragment } from '@wordpress/element';
import { recordEvent } from '@woocommerce/tracks';
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore No types for this exist yet.
// eslint-disable-next-line @woocommerce/dependency-group
import { MoreMenuDropdown } from '@wordpress/interface';
//import { displayShortcut } from '@wordpress/keycodes';
/**
* Internal dependencies
@ -17,6 +17,9 @@ export const MoreMenu = () => {
return (
<>
<MoreMenuDropdown
toggleProps={ {
onClick: () => recordEvent( 'product_dropdown_click' ),
} }
popoverProps={ {
className: 'woocommerce-product-header__more-menu',
} }

View File

@ -1,11 +1,12 @@
/**
* External dependencies
*/
import { Product } from '@woocommerce/data';
import { getNewPath, navigateTo } from '@woocommerce/navigation';
import { Button } from '@wordpress/components';
import { useDispatch } from '@wordpress/data';
import { createElement } from '@wordpress/element';
import { getNewPath, navigateTo } from '@woocommerce/navigation';
import { Product } from '@woocommerce/data';
import { recordEvent } from '@woocommerce/tracks';
import { useDispatch } from '@wordpress/data';
/**
* Internal dependencies
@ -13,6 +14,7 @@ import { createElement } from '@wordpress/element';
import { getProductErrorMessage } from '../../../utils/get-product-error-message';
import { usePreview } from '../hooks/use-preview';
import { PreviewButtonProps } from './types';
import { TRACKS_SOURCE } from '../../../constants';
export function PreviewButton( {
productStatus,
@ -23,6 +25,9 @@ export function PreviewButton( {
const previewButtonProps = usePreview( {
productStatus,
...props,
onClick() {
recordEvent( 'product_preview_changes', { source: TRACKS_SOURCE } );
},
onSaveSuccess( savedProduct: Product ) {
if ( productStatus === 'auto-draft' ) {
const url = getNewPath( {}, `/product/${ savedProduct.id }` );

View File

@ -31,10 +31,12 @@ export function PublishButton( {
productStatus,
...props,
onPublishSuccess( savedProduct: Product ) {
recordProductEvent( 'product_update', savedProduct );
const isPublished = productStatus === 'publish';
if ( isPublished ) {
recordProductEvent( 'product_update', savedProduct );
}
const noticeContent = isPublished
? __( 'Product updated.', 'woocommerce' )
: __( 'Product added.', 'woocommerce' );

View File

@ -4,6 +4,10 @@
import { createElement, useEffect, useState } from '@wordpress/element';
import { ReactElement } from 'react';
import { NavigableMenu, Slot } from '@wordpress/components';
import { Product } from '@woocommerce/data';
import { recordEvent } from '@woocommerce/tracks';
import { useSelect } from '@wordpress/data';
import { useEntityProp } from '@wordpress/core-data';
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore No types for this exist yet.
// eslint-disable-next-line @woocommerce/dependency-group
@ -12,6 +16,7 @@ import { navigateTo, getNewPath, getQuery } from '@woocommerce/navigation';
/**
* Internal dependencies
*/
import { getTabTracksData } from './utils/get-tab-tracks-data';
import { sortFillsByOrder } from '../../utils';
import { TABS_SLOT_NAME } from './constants';
@ -26,6 +31,18 @@ export type TabsFillProps = {
export function Tabs( { onChange = () => {} }: TabsProps ) {
const [ selected, setSelected ] = useState< string | null >( null );
const query = getQuery() as Record< string, string >;
const [ productId ] = useEntityProp< number >(
'postType',
'product',
'id'
);
const product: Product = useSelect( ( select ) =>
select( 'core' ).getEditedEntityRecord(
'postType',
'product',
productId
)
);
useEffect( () => {
onChange( selected );
@ -69,10 +86,15 @@ export function Tabs( { onChange = () => {} }: TabsProps ) {
<Slot
fillProps={
{
onClick: ( tabId ) =>
onClick: ( tabId ) => {
navigateTo( {
url: getNewPath( { tab: tabId } ),
} ),
} );
recordEvent(
'product_tab_click',
getTabTracksData( tabId, product )
);
},
} as TabsFillProps
}
name={ TABS_SLOT_NAME }

View File

@ -0,0 +1,33 @@
/**
* External dependencies
*/
import { Product } from '@woocommerce/data';
/**
* Internal dependencies
*/
import { TRACKS_SOURCE } from '../../../constants';
/**
* Get the data for a tab click.
*
* @param {string} tabId Clicked tab.
* @param {Product} product Current product.
* @return {Object} The data for the event.
*/
export function getTabTracksData( tabId: string, product: Product ) {
const data = {
product_tab: tabId,
product_type: product.type,
source: TRACKS_SOURCE,
};
if ( tabId === 'inventory' ) {
return {
...data,
is_store_stock_management_enabled: product.manage_stock,
};
}
return data;
}

View File

@ -50,3 +50,5 @@ export const VARIANT_SHIPPING_SECTION_DIMENSIONS_ID = `variant/${ SHIPPING_SECTI
export const PRODUCT_DETAILS_SLUG = 'product-details';
export const PRODUCT_SCHEDULED_SALE_SLUG = 'product-scheduled-sale';
export const TRACKS_SOURCE = 'product-block-editor-v1';

View File

@ -25,6 +25,7 @@ import { AUTO_DRAFT_NAME, getDerivedProductType } from '../index';
import {
NUMBERS_AND_DECIMAL_SEPARATOR,
ONLY_ONE_DECIMAL_SEPARATOR,
TRACKS_SOURCE,
} from '../constants';
import { ProductVariationsOrder } from './use-variations-order';
@ -44,7 +45,7 @@ function getNoticePreviewActions( status: ProductStatus, permalink: string ) {
label: __( 'View in store', 'woocommerce' ),
onClick: () => {
recordEvent( 'product_preview_changes', {
new_product_page: true,
source: TRACKS_SOURCE,
} );
window.open( permalink, '_blank' );
},

View File

@ -3,6 +3,7 @@ export {
DETAILS_SECTION_ID,
NEW_PRODUCT_MANAGEMENT_ENABLED_OPTION_NAME,
TAB_GENERAL_ID,
TRACKS_SOURCE,
} from './constants';
/**

View File

@ -5,14 +5,62 @@ import { Product } from '@woocommerce/data';
import { recordEvent } from '@woocommerce/tracks';
export function recordProductEvent( eventName: string, product: Product ) {
const { downloadable, id, manage_stock, type, virtual } = product;
const {
attributes,
categories,
cross_sell_ids,
description,
dimensions,
downloadable,
id,
images,
manage_stock,
menu_order,
purchase_note,
reviews_allowed,
sale_price,
short_description,
tags,
type,
upsell_ids,
virtual,
weight,
} = product;
const product_type_options = {
virtual,
downloadable,
} as { [ key: string ]: boolean };
recordEvent( eventName, {
new_product_page: true,
attributes: attributes.length ? 'yes' : 'no',
categories: categories.length ? 'yes' : 'no',
cross_sells: cross_sell_ids.length ? 'yes' : 'no',
description: description.length ? 'yes' : 'no',
dimensions:
dimensions.length.length ||
dimensions.width.length ||
dimensions.height.length
? 'yes'
: 'no',
enable_reviews: reviews_allowed ? 'yes' : 'no',
is_downloadable: downloadable ? 'yes' : 'no',
is_virtual: virtual ? 'yes' : 'no',
manage_stock: manage_stock ? 'yes' : 'no',
menu_order: menu_order ? 'yes' : 'no',
product_id: id,
product_gallery: images.length > 1 ? 'yes' : 'no',
product_image: images.length ? 'yes' : 'no',
product_type: type,
is_downloadable: downloadable,
is_virtual: virtual,
manage_stock,
product_type_options: Object.keys( product_type_options )
.filter( ( key ) => product_type_options[ key ] )
.join( ',' ),
purchase_note: purchase_note.length ? 'yes' : 'no',
sale_price: sale_price.length ? 'yes' : 'no',
short_description: short_description.length ? 'yes' : 'no',
source: 'product-blocks-editor-v1',
tags: tags.length ? 'yes' : 'no',
upsells: upsell_ids.length ? 'yes' : 'no',
weight: weight.length ? 'yes' : 'no',
} );
}

View File

@ -38,16 +38,16 @@ function getHomeItems() {
},
{
title: __( 'Inbox', 'woocommerce' ),
link: 'https://woocommerce.com/document/home-screen/?utm_medium=product#section-2',
},
{
title: __( 'Stats Overview', 'woocommerce' ),
link: 'https://woocommerce.com/document/home-screen/?utm_medium=product#section-4',
},
{
title: __( 'Store Management', 'woocommerce' ),
title: __( 'Stats Overview', 'woocommerce' ),
link: 'https://woocommerce.com/document/home-screen/?utm_medium=product#section-5',
},
{
title: __( 'Store Management', 'woocommerce' ),
link: 'https://woocommerce.com/document/home-screen/?utm_medium=product#section-10',
},
{
title: __( 'Store Setup Checklist', 'woocommerce' ),
link: 'https://woocommerce.com/document/woocommerce-setup-wizard?utm_medium=product#store-setup-checklist',

View File

@ -106,6 +106,12 @@
top: -1px;
width: 22px;
}
@include breakpoint( '<782px' ) {
svg {
width: 18px;
}
}
}
}
}

View File

@ -68,6 +68,15 @@ export const MultipleSelector = ( {
inputValue: state.inputValue,
highlightedIndex: state.highlightedIndex,
};
case selectControlStateChangeTypes.InputBlur:
if ( state.isOpen && actionAndChanges.selectItem ) {
// Prevent the menu from closing when clicking on a selected item.
return {
...changes,
isOpen: true,
};
}
return changes;
default:
return changes;
}

View File

@ -20,7 +20,6 @@ import {
updateQueryString,
getQuery,
getNewPath,
navigateTo,
} from '@woocommerce/navigation';
import {
ExtensionList,
@ -332,9 +331,7 @@ const handleGeolocation = assign( {
} );
const redirectToWooHome = () => {
navigateTo( {
url: getNewPath( {}, '/', {} ),
} );
window.location.href = getNewPath( {}, '/', {} );
};
const redirectToJetpackAuthPage = (

View File

@ -598,3 +598,12 @@
}
}
}
@media screen and (max-height: 667px) {
.woocommerce-profiler-user-profile__content {
.woocommerce-profiler-button-container {
position: inherit;
padding: 0;
}
}
}

View File

@ -158,7 +158,7 @@ describe( 'Campaigns component', () => {
expect( screen.getByText( 'Campaign 6' ) ).toBeInTheDocument();
} );
it( 'renders a "Create new campaign" button in the card header, and upon clicking, displays the "Create a new campaign" modal', async () => {
it( 'does not render a "Create new campaign" button in the card header when there are no campaign types', async () => {
( useCampaigns as jest.Mock ).mockReturnValue( {
loading: false,
error: undefined,
@ -169,6 +169,43 @@ describe( 'Campaigns component', () => {
} );
( useCampaignTypes as jest.Mock ).mockReturnValue( {
loading: false,
data: [],
} );
render( <Campaigns /> );
expect(
screen.queryByRole( 'button', { name: 'Create new campaign' } )
).not.toBeInTheDocument();
} );
it( 'renders a "Create new campaign" button in the card header when there are campaign types, and upon clicking, displays the "Create a new campaign" modal', async () => {
( useCampaigns as jest.Mock ).mockReturnValue( {
loading: false,
error: undefined,
data: [ createTestCampaign( '1' ) ],
meta: {
total: 1,
},
} );
( useCampaignTypes as jest.Mock ).mockReturnValue( {
loading: false,
data: [
{
id: 'google-ads',
name: 'Google Ads',
description:
'Boost your product listings with a campaign that is automatically optimized to meet your goals.',
channel: {
slug: 'google-listings-and-ads',
name: 'Google Listings & Ads',
},
create_url:
'https://wc1.test/wp-admin/admin.php?page=wc-admin&path=/google/dashboard&subpath=/campaigns/create',
icon_url:
'https://woocommerce.com/wp-content/uploads/2021/06/woo-GoogleListingsAds-jworee.png',
},
],
} );
render( <Campaigns /> );

View File

@ -28,7 +28,7 @@ import {
CardHeaderTitle,
CreateNewCampaignModal,
} from '~/marketing/components';
import { useCampaigns } from '~/marketing/hooks';
import { useCampaignTypes, useCampaigns } from '~/marketing/hooks';
import './Campaigns.scss';
const tableCaption = __( 'Campaigns', 'woocommerce' );
@ -59,6 +59,7 @@ export const Campaigns = () => {
const [ page, setPage ] = useState( 1 );
const [ isModalOpen, setModalOpen ] = useState( false );
const { loading, data, meta } = useCampaigns( page, perPage );
const { data: dataCampaignTypes } = useCampaignTypes();
const total = meta?.total;
const getContent = () => {
@ -158,6 +159,7 @@ export const Campaigns = () => {
);
};
const showCreateCampaignButton = !! dataCampaignTypes?.length;
const showFooter = !! ( total && total > perPage );
return (
@ -166,12 +168,14 @@ export const Campaigns = () => {
<CardHeaderTitle>
{ __( 'Campaigns', 'woocommerce' ) }
</CardHeaderTitle>
<Button
variant="secondary"
onClick={ () => setModalOpen( true ) }
>
{ __( 'Create new campaign', 'woocommerce' ) }
</Button>
{ showCreateCampaignButton && (
<Button
variant="secondary"
onClick={ () => setModalOpen( true ) }
>
{ __( 'Create new campaign', 'woocommerce' ) }
</Button>
) }
{ isModalOpen && (
<CreateNewCampaignModal
onRequestClose={ () => setModalOpen( false ) }

View File

@ -13,6 +13,7 @@ import { CreateNewCampaignModal } from '~/marketing/components';
import {
useRegisteredChannels,
useRecommendedChannels,
useCampaignTypes,
} from '~/marketing/hooks';
import './IntroductionBanner.scss';
import wooIconUrl from './woo.svg';
@ -30,8 +31,11 @@ export const IntroductionBanner = ( {
const [ isModalOpen, setModalOpen ] = useState( false );
const { data: dataRegistered } = useRegisteredChannels();
const { data: dataRecommended } = useRecommendedChannels();
const { data: dataCampaignTypes } = useCampaignTypes();
const showCreateCampaignButton = !! dataRegistered?.length;
const showButtons = !! (
dataRegistered?.length && dataCampaignTypes?.length
);
/**
* Boolean to display the "Add channels" button in the introduction banner.
@ -102,21 +106,19 @@ export const IntroductionBanner = ( {
</Flex>
</FlexItem>
</Flex>
{ ( showCreateCampaignButton || showAddChannelsButton ) && (
{ showButtons && (
<Flex
className="woocommerce-marketing-introduction-banner-buttons"
justify="flex-start"
>
{ showCreateCampaignButton && (
<Button
variant="primary"
onClick={ () => {
setModalOpen( true );
} }
>
{ __( 'Create a campaign', 'woocommerce' ) }
</Button>
) }
<Button
variant="primary"
onClick={ () => {
setModalOpen( true );
} }
>
{ __( 'Create a campaign', 'woocommerce' ) }
</Button>
{ showAddChannelsButton && (
<Button
variant="secondary"

View File

@ -2,6 +2,10 @@
max-width: 680px;
margin: 0 auto;
.components-card {
margin-bottom: $gap-large;
}
.components-notice.is-error {
margin: 0 0 $gap-large 0;
}

View File

@ -5,7 +5,6 @@ import { __ } from '@wordpress/i18n';
import { MenuItem } from '@wordpress/components';
import { info, Icon } from '@wordpress/icons';
import { useState } from '@wordpress/element';
import { recordEvent } from '@woocommerce/tracks';
/**
* Internal dependencies
@ -14,9 +13,11 @@ import BlockEditorGuide from '~/products/tour/block-editor/block-editor-guide';
import { usePublishedProductsCount } from '~/products/tour/block-editor/use-published-products-count';
export const AboutTheEditorMenuItem = ( {
onClose,
onClick = () => null,
onCloseGuide,
}: {
onClose: () => void;
onClick: () => void;
onCloseGuide: () => void;
} ) => {
const [ isGuideOpen, setIsGuideOpen ] = useState( false );
const { isNewUser } = usePublishedProductsCount();
@ -24,10 +25,8 @@ export const AboutTheEditorMenuItem = ( {
<>
<MenuItem
onClick={ () => {
recordEvent(
'block_product_editor_about_the_editor_menu_item_clicked'
);
setIsGuideOpen( true );
onClick();
} }
icon={ <Icon icon={ info } /> }
iconPosition="right"
@ -39,7 +38,7 @@ export const AboutTheEditorMenuItem = ( {
isNewUser={ isNewUser }
onCloseGuide={ () => {
setIsGuideOpen( false );
onClose();
onCloseGuide();
} }
/>
) }

View File

@ -4,13 +4,12 @@
import { useDispatch, useSelect } from '@wordpress/data';
import { __ } from '@wordpress/i18n';
import { getAdminLink } from '@woocommerce/settings';
import { OPTIONS_STORE_NAME, Product } from '@woocommerce/data';
import { OPTIONS_STORE_NAME } from '@woocommerce/data';
import { MenuItem } from '@wordpress/components';
import {
ALLOW_TRACKING_OPTION_NAME,
STORE_KEY as CES_STORE_KEY,
} from '@woocommerce/customer-effort-score';
import { recordEvent } from '@woocommerce/tracks';
/**
* Internal dependencies
@ -18,11 +17,11 @@ import { recordEvent } from '@woocommerce/tracks';
import { getAdminSetting } from '~/utils/admin-settings';
export const ClassicEditorMenuItem = ( {
onClose,
onClick,
productId,
}: {
productId: number;
onClose: () => void;
onClick: () => void;
} ) => {
const { showProductMVPFeedbackModal } = useDispatch( CES_STORE_KEY );
@ -53,35 +52,17 @@ export const ClassicEditorMenuItem = ( {
`post-new.php?post_type=product&product_block_editor=0&_feature_nonce=${ _feature_nonce }`
);
const { type: productType, status: productStatus } = useSelect(
( select ) => {
const { getEntityRecord } = select( 'core' );
return getEntityRecord(
'postType',
'product',
productId
) as Product;
},
[ productId ]
);
if ( isLoading ) {
return null;
}
function handleMenuItemClick() {
recordEvent( 'product_editor_options_turn_off_editor_click', {
product_id: productId,
product_type: productType,
product_status: productStatus,
} );
if ( allowTracking ) {
showProductMVPFeedbackModal();
} else {
window.location.href = classicEditorUrl;
}
onClose();
onClick();
}
return (

View File

@ -23,7 +23,7 @@ import { isValidEmail } from '@woocommerce/product-editor';
*/
import { FeedbackIcon } from '../../images/feedback-icon';
export const FeedbackMenuItem = ( { onClose }: { onClose: () => void } ) => {
export const FeedbackMenuItem = ( { onClick }: { onClick: () => void } ) => {
const { showCesModal } = useDispatch( CES_STORE_KEY );
const { isDescendantOf } = useLayoutContext();
@ -167,7 +167,7 @@ export const FeedbackMenuItem = ( { onClose }: { onClose: () => void } ) => {
block_editor: isDescendantOf( 'product-block-editor' ),
}
);
onClose();
onClick();
} }
icon={ <FeedbackIcon /> }
iconPosition="right"

View File

@ -5,7 +5,10 @@ import {
__experimentalProductMVPFeedbackModalContainer as ProductMVPFeedbackModalContainer,
__experimentalWooProductMoreMenuItem as WooProductMoreMenuItem,
} from '@woocommerce/product-editor';
import { Product } from '@woocommerce/data';
import { recordEvent } from '@woocommerce/tracks';
import { registerPlugin } from '@wordpress/plugins';
import { useSelect } from '@wordpress/data';
import { WooHeaderItem } from '@woocommerce/admin-layout';
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
@ -25,11 +28,45 @@ import {
const MoreMenuFill = ( { onClose }: { onClose: () => void } ) => {
const [ id ] = useEntityProp( 'postType', 'product', 'id' );
const { type, status } = useSelect(
( select ) => {
const { getEntityRecord } = select( 'core' );
return getEntityRecord( 'postType', 'product', id ) as Product;
},
[ id ]
);
const recordClick = ( optionName: string ) => {
recordEvent( 'product_dropdown_option_click', {
selected_option: optionName,
product_type: type,
product_status: status,
} );
};
return (
<>
<FeedbackMenuItem onClose={ onClose } />
<ClassicEditorMenuItem productId={ id } onClose={ onClose } />
<AboutTheEditorMenuItem onClose={ onClose } />
<FeedbackMenuItem
onClick={ () => {
recordClick( 'feedback' );
onClose();
} }
/>
<ClassicEditorMenuItem
productId={ id }
onClick={ () => {
recordClick( 'classic_editor' );
onClose();
} }
/>
<AboutTheEditorMenuItem
onClick={ () => {
recordClick( 'about' );
} }
onCloseGuide={ () => {
onClose();
} }
/>
</>
);
};

View File

@ -18,6 +18,7 @@ import {
preventLeavingProductForm,
__experimentalUseProductHelper as useProductHelper,
__experimentalUseFeedbackBar as useFeedbackBar,
TRACKS_SOURCE,
} from '@woocommerce/product-editor';
import { Product } from '@woocommerce/data';
import { recordEvent } from '@woocommerce/tracks';
@ -75,7 +76,7 @@ export const ProductFormActions: React.FC = () => {
const onSaveDraft = async () => {
recordEvent( 'product_edit', {
new_product_page: true,
source: TRACKS_SOURCE,
...getProductDataForTracks(),
} );
if ( ! values.id ) {
@ -101,7 +102,7 @@ export const ProductFormActions: React.FC = () => {
const onPublish = async () => {
recordEvent( 'product_update', {
new_product_page: true,
source: TRACKS_SOURCE,
...getProductDataForTracks(),
} );
if ( ! values.id ) {
@ -127,7 +128,7 @@ export const ProductFormActions: React.FC = () => {
const onPublishAndDuplicate = async () => {
recordEvent( 'product_publish_and_copy', {
new_product_page: true,
source: TRACKS_SOURCE,
...getProductDataForTracks(),
} );
if ( values.id ) {
@ -140,7 +141,7 @@ export const ProductFormActions: React.FC = () => {
const onCopyToNewDraft = async () => {
recordEvent( 'product_copy', {
new_product_page: true,
source: TRACKS_SOURCE,
...getProductDataForTracks(),
} );
if ( values.id ) {
@ -155,7 +156,7 @@ export const ProductFormActions: React.FC = () => {
const onTrash = async () => {
recordEvent( 'product_delete', {
new_product_page: true,
source: TRACKS_SOURCE,
...getProductDataForTracks(),
} );
if ( values.id ) {
@ -205,7 +206,7 @@ export const ProductFormActions: React.FC = () => {
<SecondaryActionsComponent
onClick={ () =>
recordEvent( 'product_preview_changes', {
new_product_page: true,
source: TRACKS_SOURCE,
...getProductDataForTracks(),
} )
}

View File

@ -49,10 +49,10 @@ export const ProductMoreMenu = () => {
>
{ ( { onClose } ) => (
<>
<FeedbackMenuItem onClose={ onClose } />
<FeedbackMenuItem onClick={ onClose } />
<ClassicEditorMenuItem
productId={ values.id }
onClose={ onClose }
onClick={ onClose }
/>
</>
) }

View File

@ -6,6 +6,7 @@ import { Fragment } from '@wordpress/element';
import { Form, FormContextType } from '@woocommerce/components';
import { Product } from '@woocommerce/data';
import { recordEvent } from '@woocommerce/tracks';
import { TRACKS_SOURCE } from '@woocommerce/product-editor';
import userEvent from '@testing-library/user-event';
/**
@ -111,7 +112,7 @@ describe( 'ProductFormActions', () => {
'draft'
);
expect( recordEvent ).toHaveBeenCalledWith( 'product_edit', {
new_product_page: true,
source: TRACKS_SOURCE,
product_id: undefined,
product_type: undefined,
is_downloadable: undefined,
@ -133,7 +134,7 @@ describe( 'ProductFormActions', () => {
'publish'
);
expect( recordEvent ).toHaveBeenCalledWith( 'product_update', {
new_product_page: true,
source: TRACKS_SOURCE,
product_id: undefined,
product_type: undefined,
is_downloadable: undefined,
@ -222,7 +223,7 @@ describe( 'ProductFormActions', () => {
'draft'
);
expect( recordEvent ).toHaveBeenCalledWith( 'product_edit', {
new_product_page: true,
source: TRACKS_SOURCE,
product_id: 5,
product_type: 'simple',
is_downloadable: false,
@ -252,7 +253,7 @@ describe( 'ProductFormActions', () => {
);
publishButton?.click();
expect( recordEvent ).toHaveBeenCalledWith( 'product_update', {
new_product_page: true,
source: TRACKS_SOURCE,
product_id: 5,
product_type: 'simple',
is_downloadable: false,
@ -330,7 +331,7 @@ describe( 'ProductFormActions', () => {
expect( recordEvent ).toHaveBeenCalledWith(
'product_preview_changes',
{
new_product_page: true,
source: TRACKS_SOURCE,
product_id: 5,
product_type: 'simple',
is_downloadable: false,
@ -364,7 +365,7 @@ describe( 'ProductFormActions', () => {
).toEqual( false );
moveToTrashButton?.click();
expect( recordEvent ).toHaveBeenCalledWith( 'product_delete', {
new_product_page: true,
source: TRACKS_SOURCE,
product_id: 5,
product_type: 'simple',
is_downloadable: false,
@ -399,7 +400,7 @@ describe( 'ProductFormActions', () => {
expect( recordEvent ).toHaveBeenCalledWith(
'product_publish_and_copy',
{
new_product_page: true,
source: TRACKS_SOURCE,
product_id: 5,
product_type: 'simple',
is_downloadable: false,
@ -438,7 +439,7 @@ describe( 'ProductFormActions', () => {
const copyToANewDraftButton = queryByText( 'Copy to a new draft' );
copyToANewDraftButton?.click();
expect( recordEvent ).toHaveBeenCalledWith( 'product_copy', {
new_product_page: true,
source: TRACKS_SOURCE,
product_id: 5,
product_type: 'simple',
is_downloadable: false,

View File

@ -0,0 +1,4 @@
Significance: patch
Type: fix
check for WC_ADMIN_APP constant before using it

View File

@ -78,6 +78,9 @@ add_action( 'plugins_loaded', '_wc_beta_tester_bootstrap' );
* Register the JS.
*/
function add_extension_register_script() {
if ( ! defined( 'WC_ADMIN_APP' ) ) {
return;
}
$script_path = '/build/index.js';
$script_asset_path = dirname( __FILE__ ) . '/build/index.asset.php';
$script_asset = file_exists( $script_asset_path )

View File

@ -24,7 +24,7 @@
".",
"https://downloads.wordpress.org/plugin/akismet.zip",
"https://github.com/WP-API/Basic-Auth/archive/master.zip",
"https://downloads.wordpress.org/plugin/wp-mail-logging.zip"
"https://downloads.wordpress.org/plugin/wp-mail-logging.1.11.2.zip"
],
"themes": [
"https://downloads.wordpress.org/theme/twentynineteen.zip"
@ -35,4 +35,4 @@
}
}
}
}
}

View File

@ -1,7 +1,7 @@
{
"require-dev": {
"woocommerce/woocommerce-sniffs": "^0.1.3",
"sirbrillig/phpcs-changed": "^2.10.2"
"sirbrillig/phpcs-changed": "^2.11.1"
},
"config": {
"platform": {

View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "29a05e32698301ded5eeb893b4c22b90",
"content-hash": "9d6e48e1fc463e0a52cd9a1c5f815571",
"packages": [],
"packages-dev": [
{
@ -258,16 +258,16 @@
},
{
"name": "sirbrillig/phpcs-changed",
"version": "v2.10.2",
"version": "v2.11.1",
"source": {
"type": "git",
"url": "https://github.com/sirbrillig/phpcs-changed.git",
"reference": "ba0432bc86ffdc31a6946117be6c2419b7e3e16d"
"reference": "ebff6bebc105b674f671bb79e3a50c6a24bc0bb7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sirbrillig/phpcs-changed/zipball/ba0432bc86ffdc31a6946117be6c2419b7e3e16d",
"reference": "ba0432bc86ffdc31a6946117be6c2419b7e3e16d",
"url": "https://api.github.com/repos/sirbrillig/phpcs-changed/zipball/ebff6bebc105b674f671bb79e3a50c6a24bc0bb7",
"reference": "ebff6bebc105b674f671bb79e3a50c6a24bc0bb7",
"shasum": ""
},
"require": {
@ -275,10 +275,10 @@
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.7.1",
"phpstan/phpstan": "1.4.10 || ^1.7",
"phpunit/phpunit": "^6.4 || ^9.5",
"sirbrillig/phpcs-variable-analysis": "^2.1.3",
"squizlabs/php_codesniffer": "^3.2.1"
"squizlabs/php_codesniffer": "^3.2.1",
"vimeo/psalm": "^0.2 || ^0.3 || ^1.1 || ^4.24 || ^5.0@beta"
},
"bin": [
"bin/phpcs-changed"
@ -287,8 +287,6 @@
"autoload": {
"files": [
"PhpcsChanged/Cli.php",
"PhpcsChanged/SvnWorkflow.php",
"PhpcsChanged/GitWorkflow.php",
"PhpcsChanged/functions.php"
],
"psr-4": {
@ -308,9 +306,9 @@
"description": "Run phpcs on files, but only report warnings/errors from lines which were changed.",
"support": {
"issues": "https://github.com/sirbrillig/phpcs-changed/issues",
"source": "https://github.com/sirbrillig/phpcs-changed/tree/v2.10.2"
"source": "https://github.com/sirbrillig/phpcs-changed/tree/v2.11.1"
},
"time": "2023-03-25T15:10:31+00:00"
"time": "2023-06-16T02:31:57+00:00"
},
{
"name": "squizlabs/php_codesniffer",

View File

@ -1,4 +0,0 @@
Significance: patch
Type: enhancement
Fixed visibility and tax values convert to lowercase as issue facing in importing.

View File

@ -1,4 +0,0 @@
Significance: minor
Type: add
Add plugins page to the core profiler

View File

@ -1,4 +0,0 @@
Significance: minor
Type: add
Override the interface skeleton container so it can be scrollable

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
Fix block grouping within a section

View File

@ -1,4 +0,0 @@
Significance: minor
Type: add
Add support to change features through the url as query parameters

View File

@ -1,4 +0,0 @@
Significance: minor
Type: add
Replace 'use classic editor' with 'Turn off the new product editor' in options menu#38575

View File

@ -1,4 +0,0 @@
Significance: minor
Type: add
Implement the product blocks experiment within code for new users

View File

@ -1,4 +0,0 @@
Significance: minor
Type: add
Product Editor Onboarding: Add About the editor... option the more menu in product block editor

View File

@ -1,4 +0,0 @@
Significance: minor
Type: update
Always show pricing group fields, disable if not available for a product type

View File

@ -1,4 +0,0 @@
Significance: minor
Type: add
Show spotlight for first time visitors of block product editor

View File

@ -1,4 +0,0 @@
Significance: minor
Type: add
Added business info page to new core profiler

View File

@ -1,4 +0,0 @@
Significance: minor
Type: add
Add an animated spinner to the Core Profiler to be displayed when assets are loading.

View File

@ -1,4 +0,0 @@
Significance: minor
Type: add
Added ability for the core profiler state machine to navigate by using the 'step' URL query param

View File

@ -1,4 +0,0 @@
Significance: minor
Type: dev
Add a composer script to run phpcs-changed against the current branch

View File

@ -1,4 +0,0 @@
Significance: patch
Type: add
Provide a data-store agnostic way of untrashing orders.

View File

@ -1,4 +0,0 @@
Significance: patch
Type: add
Add an admin notice about the upcoming PHP version requirement change for PHP 7.3 users

View File

@ -1,4 +0,0 @@
Significance: minor
Type: add
Show feedback bar for product editor.

View File

@ -0,0 +1,5 @@
Significance: patch
Type: add
Comment: Track checkboxes and selects in Settings > Emails settings

View File

@ -1,4 +0,0 @@
Significance: minor
Type: add
Updated payment gateway suggestions for 2023 Q3

View File

@ -1,4 +0,0 @@
Significance: patch
Type: dev
Move Reports-related code to reduce duplicates.

View File

@ -1,4 +0,0 @@
Significance: patch
Type: dev
Lint fixes

View File

@ -1,4 +0,0 @@
Significance: patch
Type: dev
Refactored Core Profiler's plugin installation step to use XState

View File

@ -1,4 +0,0 @@
Significance: patch
Type: dev
Refactored core profiler state machine by modularising each page

View File

@ -1,4 +0,0 @@
Significance: patch
Type: dev
Tidied up core profiler's tracks actions

View File

@ -1,4 +0,0 @@
Significance: patch
Type: dev
Fix flakiness in `can set variation defaults` test.

View File

@ -0,0 +1,4 @@
Significance: patch
Type: dev
Ensure `can discard industry changes when navigating back to "Store Details"'` can run independent from previous tests

View File

@ -0,0 +1,4 @@
Significance: patch
Type: dev
Replace deprecated page methods.

View File

@ -0,0 +1,5 @@
Significance: patch
Type: dev
Skip failing e2e test preventing PRs being merged. GH fails but local works

View File

@ -0,0 +1,4 @@
Significance: minor
Type: add
Show create campaign button when there are campaign types in marketing page.

View File

@ -0,0 +1,4 @@
Significance: patch
Type: fix
When dormant customer accounts are removed, their content should be preserved.

View File

@ -1,4 +0,0 @@
Significance: patch
Type: tweak
Swap out deprecated jQuery ready handlers

View File

@ -0,0 +1,4 @@
Significance: minor
Type: update
Analytics API: Search for customers by all of the available fields instead of having to choose one

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
Handle possibly empty refund value in reports (PHP 8.1+).

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
Update status only when it's changed.

View File

@ -0,0 +1,4 @@
Significance: minor
Type: fix
Convert DatabaseUtil::get_index_columns() to use SHOW INDEX FROM instead of INFORMATION_SCHEMA query

View File

@ -1,4 +0,0 @@
Significance: minor
Type: add
Add properties and methods for detecting order admin screens more easily.

View File

@ -1,4 +0,0 @@
Significance: patch
Type: tweak
Do not show HPOS plugin incompat warning to users with insufficient access permissions.

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
fix Unsupported operand string * float

View File

@ -1,4 +0,0 @@
Significance: minor
Type: fix
Fix Shipping Methods autosaving entire form.

View File

@ -1,4 +0,0 @@
Significance: patch
Type: dev
Add HPOS compat queries for tracker.

View File

@ -1,4 +0,0 @@
Significance: minor
Type: fix
Add "PrepareUrl" transformer to RIM rules processor

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
ensure parameter datatype for array_slice

View File

@ -1,4 +0,0 @@
Significance: minor
Type: fix
Fix number of orders under tax report

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
fix string + string for PHP 8.X

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
Support values written in exponential notation for HPOS migrations.

View File

@ -1,4 +0,0 @@
Significance: minor
Type: fix
CES modal: styling fixes and extraFiels prop added

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
Fix selection of multiple orders in HPOS list table.

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
Fire bulk action orders hook for all custom actions.

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
Add support for taxonomy meta boxes in HPOS order edit screen.

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
Fix Layout Controller forwarding arrays from the URL query string.

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
improve get_children transient validation

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
Fixed a visual bug where text overlapped the image in the task list header.

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
Allow plugins_page_skipped parameter in Onboarding API endpoint

View File

@ -1,4 +0,0 @@
Significance: patch
Type: add
Add re-migrate support to HPOS CLI.

View File

@ -1,4 +0,0 @@
Significance: patch
Type: fix
Minor UI fixes in Core profiler steps

Some files were not shown because too many files have changed in this diff Show More