Commit 93e5cbfa6b for woocommerce
commit 93e5cbfa6b8cc3d75fa1146c16bdd0ad70da42bc
Author: Neil Carlo Sucuangco <succute@yahoo.com>
Date: Tue Dec 23 03:54:10 2025 +0800
Allow blank Flat rate cost in admin validation (#61313)
* Allow blank Flat rate cost in admin validation
* Add changefile(s) from automation for the following project(s): woocommerce
---------
Co-authored-by: Allie Mims <60988591+allie500@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
diff --git a/plugins/woocommerce/changelog/61313-fix-flat-rate-blank-cost-validation b/plugins/woocommerce/changelog/61313-fix-flat-rate-blank-cost-validation
new file mode 100644
index 0000000000..45f2e046be
--- /dev/null
+++ b/plugins/woocommerce/changelog/61313-fix-flat-rate-blank-cost-validation
@@ -0,0 +1,4 @@
+Significance: patch
+Type: fix
+
+Flat rate: allow empty main cost so class-only rates work again
\ No newline at end of file
diff --git a/plugins/woocommerce/client/legacy/js/admin/utils/number-validation.js b/plugins/woocommerce/client/legacy/js/admin/utils/number-validation.js
index a429c19dd1..2a0fd21ffc 100644
--- a/plugins/woocommerce/client/legacy/js/admin/utils/number-validation.js
+++ b/plugins/woocommerce/client/legacy/js/admin/utils/number-validation.js
@@ -12,10 +12,22 @@
* @returns {boolean} Whether the value is a valid formatted number or formula
*/
function isValidFormattedNumber( value, config ) {
- // Check if value is a string and config is provided
- if ( ! value || typeof value !== 'string' || ! config || typeof config !== 'object' ) {
- return false;
- }
+ // Ensure we are dealing with a string; non-strings are invalid.
+ if ( typeof value !== 'string' ) {
+ return false;
+ }
+
+ // Treat empty input as valid so optional fields (e.g. Flat rate main cost)
+ // can be saved as blank to rely on class-only costs.
+ // This preserves 10.0.x behavior where blank values were allowed.
+ if ( value.trim() === '' ) {
+ return true;
+ }
+
+ // For non-empty values, require a config object.
+ if ( ! config || typeof config !== 'object' ) {
+ return false;
+ }
var decimalSeparator = config.decimalSeparator || '.';
var thousandSeparator = config.thousandSeparator || ',';
diff --git a/plugins/woocommerce/client/legacy/js/admin/utils/test/number-validation.test.js b/plugins/woocommerce/client/legacy/js/admin/utils/test/number-validation.test.js
index b2269c1f0a..d26c878802 100644
--- a/plugins/woocommerce/client/legacy/js/admin/utils/test/number-validation.test.js
+++ b/plugins/woocommerce/client/legacy/js/admin/utils/test/number-validation.test.js
@@ -18,8 +18,8 @@ describe( 'Number Validation Utils - isValidFormattedNumber', () => {
thousandSeparator: ','
};
- test( 'should return false for empty or invalid input', () => {
- expect( isValidFormattedNumber( '', config ) ).toBe( false );
+ test( 'should treat empty string as valid and reject non-string/invalid inputs', () => {
+ expect( isValidFormattedNumber( '', config ) ).toBe( true );
expect( isValidFormattedNumber( null, config ) ).toBe( false );
expect( isValidFormattedNumber( undefined, config ) ).toBe( false );
expect( isValidFormattedNumber( 123, config ) ).toBe( false ); // not a string