Skip to content

Commit 5ea3e7f

Browse files
committed
Merge release/9.6.0 into trunk
2 parents eb0a327 + 7131024 commit 5ea3e7f

File tree

52 files changed

+8915
-5204
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+8915
-5204
lines changed

.github/dependabot.yml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ updates:
1414
- dependency-name: "@woocommerce/*"
1515
# Reviewers for issues created
1616
reviewers:
17-
- 'Automattic/harmony'
17+
- 'Automattic/gamma'
18+
- 'Automattic/moltres'
1819

1920
# Enable version updates for composer
2021
- package-ecosystem: 'composer'
@@ -25,7 +26,8 @@ updates:
2526
interval: 'weekly'
2627
# Reviewers for issues created
2728
reviewers:
28-
- 'Automattic/harmony'
29+
- 'Automattic/gamma'
30+
- 'Automattic/moltres'
2931

3032
# Enable version updates for Docker
3133
- package-ecosystem: 'docker'
@@ -36,4 +38,5 @@ updates:
3638
interval: 'weekly'
3739
# Reviewers for issues created
3840
reviewers:
39-
- 'Automattic/harmony'
41+
- 'Automattic/gamma'
42+
- 'Automattic/moltres'

changelog.txt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,36 @@
11
*** WooPayments Changelog ***
22

3+
= 9.6.0 - 2025-07-02 =
4+
* Add - Add cover letter for the new evidence submission screen for Product Unacceptable chargeback reason
5+
* Add - Added a URL parameter to allow merchants to access the VAT details modal.
6+
* Add - Show an admin notice when bundled subscriptions are in use
7+
* Fix - Add NO VAT description for Norway in tax descriptions
8+
* Fix - fix: ensure Google Pay/Apple Pay postcode matching for shipping zones works even when the provided postcode is redacted.
9+
* Fix - Fix a layout shift when uploading evidence for a dispute on the new challenge dispute screen
10+
* Fix - Fix mobile version of the StepperPanel and make the top navigation clickable.
11+
* Fix - Fix padding on the recommended document section
12+
* Fix - Fix payment methods logos width calculation in block editor preview
13+
* Fix - Fix preselected Payment Methods ignored during account creation via KYC session.
14+
* Fix - Fix spacing on disputes expandable block
15+
* Fix - Fix state for the cover letter.
16+
* Fix - Fix the browser print preview page on the payouts page.
17+
* Fix - Prevent double stock reduction after (3DS) authentication.
18+
* Fix - Prevent fatal error on the Pay for Order page upon deleted orders.
19+
* Update - Change the copy of the cover letter notice.
20+
* Update - Clicking on the Next button scroll the page position to the top.
21+
* Update - Evidence submission form for product not received
22+
* Update - fix: update Google Pay/Apple Pay buttons compatibility when multi-currency functionality is disabled - they'll no longer throw an exception for logged-out customers
23+
* Update - Refine "Temporarily Suspended" language, statuses and tooltip copy
24+
* Update - update: add `wcpay_express_checkout_js_params` filter for express checkout JS params.
25+
* Update - Updates the recomended documents section for the new disputes experience
26+
* Dev - Add missing arrow icons from the new evidence form
27+
* Dev - Ensure the submitted state is working as expected
28+
* Dev - Fix the regexp checking for the loading state of the checkout button to cover changes in latest WooCommerce.
29+
* Dev - Remove CTA from the new evidence "Evidence saved!" toast.
30+
* Dev - Revert @woocommerce/onboarding upgrade in PR 10840
31+
* Dev - Update reviewers for dependabot
32+
* Dev - Update tested WooCommerce version to 10.0.0
33+
334
= 9.5.0 - 2025-06-11 =
435
* Add - Add specific texts for collecting Norway and New Zealand tax data
536
* Add - Add specific texts for collecting Singapore tax data

client/checkout/blocks/payment-methods-logos/payment-methods-logos.tsx

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,23 +52,57 @@ export const PaymentMethodsLogos: React.FC< PaymentMethodsLogosProps > = ( {
5252
buttonRef.current?.focus();
5353
}, [] );
5454

55+
// Try to find the preview iframe in the page editor.
56+
const previewFrame = document.querySelector(
57+
'iframe[name="editor-canvas"]'
58+
);
59+
5560
useEffect( () => {
5661
const updateMaxElements = () => {
62+
// Get the actual width based on whether we're in an iframe or not.
63+
let width: number;
64+
65+
if ( previewFrame ) {
66+
// Get the width from the iframe's clientWidth.
67+
width = previewFrame.clientWidth;
68+
} else {
69+
width = window.innerWidth;
70+
}
71+
5772
const sortedConfigs = [ ...breakpointConfigs ].sort(
5873
( a, b ) => a.breakpoint - b.breakpoint
5974
);
6075
const config = sortedConfigs.find(
61-
( cfg ) => window.innerWidth <= cfg.breakpoint
76+
( cfg ) => width <= cfg.breakpoint
6277
);
6378

6479
setMaxShownElements( config ? config.maxElements : maxElements );
6580
};
6681

82+
// Initial update
6783
updateMaxElements();
68-
window.addEventListener( 'resize', updateMaxElements );
6984

85+
// Use ResizeObserver if available, otherwise fallback to window resize
86+
if ( typeof ResizeObserver !== 'undefined' ) {
87+
const resizeObserver = new ResizeObserver( updateMaxElements );
88+
89+
if ( previewFrame ) {
90+
resizeObserver.observe( previewFrame );
91+
} else {
92+
// Fallback to window resize
93+
window.addEventListener( 'resize', updateMaxElements );
94+
}
95+
96+
return () => {
97+
resizeObserver.disconnect();
98+
window.removeEventListener( 'resize', updateMaxElements );
99+
};
100+
}
101+
102+
// Fallback for browsers without ResizeObserver
103+
window.addEventListener( 'resize', updateMaxElements );
70104
return () => window.removeEventListener( 'resize', updateMaxElements );
71-
}, [ breakpointConfigs, maxElements ] );
105+
}, [ breakpointConfigs, maxElements, previewFrame ] );
72106

73107
useEffect( () => {
74108
if ( popoverAnchor ) {

client/checkout/blocks/payment-methods-logos/style.scss

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,18 @@
22
> div {
33
display: flex;
44
align-items: center;
5+
flex-wrap: nowrap;
6+
min-width: 0;
7+
max-width: 100%;
8+
overflow: hidden;
59

610
img {
711
width: 37px;
812
height: 24px;
913
margin-right: 4px;
14+
flex-shrink: 1;
15+
min-width: 0;
16+
max-width: 100%;
1017
}
1118
}
1219

@@ -20,6 +27,10 @@
2027
border-radius: 3px;
2128
font-size: 11px;
2229
font-weight: 600;
30+
white-space: nowrap;
31+
flex-shrink: 1;
32+
text-overflow: ellipsis;
33+
overflow: hidden;
2334
}
2435
}
2536

client/components/account-status/index.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,6 @@ const AccountStatusDetails = ( props ) => {
118118
status={ accountStatus.deposits?.status }
119119
interval={ accountStatus.deposits?.interval }
120120
accountStatus={ accountStatus.status }
121-
poEnabled={ accountStatus.progressiveOnboarding.isEnabled }
122-
poComplete={
123-
accountStatus.progressiveOnboarding.isComplete
124-
}
125121
iconSize={ 24 }
126122
/>
127123
</AccountStatusItem>

client/components/account-status/status-chip.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import Chip from 'components/chip';
1212
import './style.scss';
1313

1414
const StatusChip = ( props ) => {
15-
const { accountStatus, poEnabled, poComplete } = props;
15+
const { accountStatus } = props;
1616

1717
let description = __( 'Unknown', 'woocommerce-payments' );
1818
let type = 'light';
@@ -27,10 +27,7 @@ const StatusChip = ( props ) => {
2727
} else if ( accountStatus === 'restricted_soon' ) {
2828
description = __( 'Restricted soon', 'woocommerce-payments' );
2929
type = 'warning';
30-
} else if (
31-
accountStatus === 'pending_verification' ||
32-
( poEnabled && ! poComplete && accountStatus === 'restricted' )
33-
) {
30+
} else if ( accountStatus === 'pending_verification' ) {
3431
description = __( 'Pending', 'woocommerce-payments' );
3532
type = 'light';
3633
tooltip = __(

client/components/deposits-status/index.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ const DepositsStatusSuspended: React.FC< DepositsStatusProps > = ( {
6767
} ) => {
6868
const description =
6969
/* translators: <a> - suspended accounts FAQ URL */
70-
__( 'Temporarily suspended', 'woocommerce-payments' );
70+
__( 'Under Review', 'woocommerce-payments' );
7171

7272
return (
7373
<span className={ 'account-status__info__yellow' }>
@@ -85,7 +85,7 @@ const DepositsStatusSuspended: React.FC< DepositsStatusProps > = ( {
8585
/* translators: 1: WooPayments */
8686
__(
8787
// eslint-disable-next-line max-len
88-
'After the information review, your account was temporarily suspended. {{learnMoreLink}}Learn more{{/learnMoreLink}}',
88+
'While the account is under review payouts may remain suspended. {{learnMoreLink}}Learn more{{/learnMoreLink}}',
8989
'woocommerce-payments'
9090
),
9191
'WooPayments'
@@ -134,20 +134,16 @@ const DepositsStatus: React.FC< Props > = ( {
134134
status,
135135
interval,
136136
accountStatus,
137-
poEnabled,
138-
poComplete,
139137
iconSize,
140138
} ) => {
141-
const isPoInProgress = poEnabled && ! poComplete;
142-
143139
if ( status === 'blocked' || accountStatus === 'under_review' ) {
144140
return (
145141
<DepositsStatusSuspended
146142
iconSize={ iconSize }
147143
interval={ interval }
148144
/>
149145
);
150-
} else if ( accountStatus === 'pending_verification' || isPoInProgress ) {
146+
} else if ( accountStatus === 'pending_verification' ) {
151147
return (
152148
<DepositsStatusPending
153149
iconSize={ iconSize }

client/components/deposits-status/test/__snapshots__/index.js.snap

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ exports[`DepositsStatus renders blocked status 1`] = `
1818
/>
1919
</g>
2020
</svg>
21-
Temporarily suspended
21+
Under Review
2222
<button
2323
class="wcpay-tooltip__content-wrapper wcpay-tooltip--click__content-wrapper"
2424
type="button"
@@ -69,7 +69,7 @@ exports[`DepositsStatus renders blocked status 2`] = `
6969
/>
7070
</g>
7171
</svg>
72-
Temporarily suspended
72+
Under Review
7373
<button
7474
class="wcpay-tooltip__content-wrapper wcpay-tooltip--click__content-wrapper"
7575
type="button"
@@ -212,7 +212,7 @@ exports[`DepositsStatus renders pending verification status 1`] = `
212212
/>
213213
</g>
214214
</svg>
215-
Temporarily suspended
215+
Under Review
216216
<button
217217
class="wcpay-tooltip__content-wrapper wcpay-tooltip--click__content-wrapper"
218218
type="button"

client/components/deposits-status/test/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ describe( 'DepositsStatus', () => {
5454
}
5555
);
5656

57-
expect( await findByText( /Temporarily suspended/i ) ).toBeVisible();
57+
expect( await findByText( /Under Review/i ) ).toBeVisible();
5858
expect( depositsStatus ).toMatchSnapshot();
5959
} );
6060

@@ -67,7 +67,7 @@ describe( 'DepositsStatus', () => {
6767
}
6868
);
6969

70-
expect( await findByText( /Temporarily suspended/i ) ).toBeVisible();
70+
expect( await findByText( /Under Review/i ) ).toBeVisible();
7171
expect( depositsStatus ).toMatchSnapshot();
7272
} );
7373

client/components/stepper/stepper-panel.tsx

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,32 +14,55 @@ import clsx from 'clsx';
1414
interface StepperIndicatorProps {
1515
steps: string[];
1616
currentStep: number;
17+
onStepClick?: ( stepIndex: number ) => void;
1718
}
1819

1920
export const StepperPanel: React.FC< StepperIndicatorProps > = ( {
2021
steps,
2122
currentStep,
23+
onStepClick,
2224
} ) => (
2325
<div className="stepper-panel">
2426
{ steps.map( ( label, idx ) => {
2527
const isComplete = idx < currentStep;
2628
const isActive = idx === currentStep;
29+
const isClickable = typeof onStepClick === 'function';
30+
31+
const StepLabel = isClickable ? 'button' : 'div';
32+
33+
const handleClick = () => {
34+
if ( isClickable && onStepClick ) {
35+
onStepClick( idx );
36+
}
37+
};
38+
2739
return (
2840
<div
2941
key={ label }
3042
className={ clsx( 'stepper-step', {
3143
active: isActive,
3244
complete: isComplete,
45+
clickable: isClickable,
3346
} ) }
3447
>
35-
<div className="stepper-circle">
48+
<StepLabel
49+
className="stepper-circle"
50+
onClick={ handleClick }
51+
disabled={ ! isClickable }
52+
>
3653
{ isComplete ? (
3754
<Icon icon={ check } size={ 36 } />
3855
) : (
3956
idx + 1
4057
) }
41-
</div>
42-
<div className="stepper-label">{ label }</div>
58+
</StepLabel>
59+
<StepLabel
60+
className="stepper-label"
61+
onClick={ handleClick }
62+
disabled={ ! isClickable }
63+
>
64+
{ label }
65+
</StepLabel>
4366
{ idx < steps.length - 1 && (
4467
<div className="stepper-line" />
4568
) }

0 commit comments

Comments
 (0)