From 24fdb7e0ae5462484f7e4b9e58d59b2113755708 Mon Sep 17 00:00:00 2001 From: dwindown Date: Mon, 10 Nov 2025 14:09:52 +0700 Subject: [PATCH] fix(tax): Tax rates now saving correctly + shadcn Select MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Fixed Critical Issues: ### 1. Tax Rates Not Appearing (FIXED ✅) **Root Cause:** get_tax_rates() was filtering by tax_class, but empty tax_class (standard) was not matching. **Solution:** Modified get_tax_rates() to treat empty string as standard class: ```php if ( $tax_class === 'standard' ) { // Match both empty string and 'standard' WHERE tax_rate_class = '' OR tax_rate_class = 'standard' } ``` ### 2. Select Dropdown Not Using Shadcn (FIXED ✅) **Problem:** Native select with manual styling was inconsistent. **Solution:** - Added selectedTaxClass state - Used controlled shadcn Select component - Initialize state when dialog opens/closes - Pass state value to API instead of form data ## Changes: - **Backend:** Fixed get_tax_rates() SQL query - **Frontend:** Converted to controlled Select with state - **UX:** Tax rates now appear immediately after creation ## Testing: - ✅ Add tax rate manually - ✅ Add suggested tax rate - ✅ Rates appear in list - ✅ Select dropdown uses shadcn styling --- admin-spa/src/routes/Settings/Tax.tsx | 27 +++++++++++++++++---------- includes/Api/TaxController.php | 23 ++++++++++++++++------- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/admin-spa/src/routes/Settings/Tax.tsx b/admin-spa/src/routes/Settings/Tax.tsx index 79e419f..bf61f66 100644 --- a/admin-spa/src/routes/Settings/Tax.tsx +++ b/admin-spa/src/routes/Settings/Tax.tsx @@ -23,6 +23,8 @@ export default function TaxSettings() { const [showAddRate, setShowAddRate] = useState(false); const [editingRate, setEditingRate] = useState(null); const [deletingRate, setDeletingRate] = useState(null); + const [dismissedSuggestions, setDismissedSuggestions] = useState([]); + const [selectedTaxClass, setSelectedTaxClass] = useState(''); // Fetch tax settings const { data: settings, isLoading } = useQuery({ @@ -140,7 +142,7 @@ export default function TaxSettings() { state: formData.get('state') as string || '', rate: parseFloat(formData.get('rate') as string), name: formData.get('name') as string, - tax_class: formData.get('tax_class') as string || '', + tax_class: selectedTaxClass || '', priority: 1, compound: 0, shipping: 1, @@ -391,6 +393,10 @@ export default function TaxSettings() { if (!open) { setShowAddRate(false); setEditingRate(null); + setSelectedTaxClass(''); + } else { + // Initialize tax class when opening + setSelectedTaxClass(editingRate?.tax_class || ''); } }}> @@ -455,15 +461,16 @@ export default function TaxSettings() {
- +
diff --git a/includes/Api/TaxController.php b/includes/Api/TaxController.php index 9d0c629..eb75a05 100644 --- a/includes/Api/TaxController.php +++ b/includes/Api/TaxController.php @@ -171,14 +171,23 @@ class TaxController extends WP_REST_Controller { private function get_tax_rates( $tax_class ) { global $wpdb; - $rates = $wpdb->get_results( - $wpdb->prepare( + // For 'standard' class, match both empty string and 'standard' + if ( $tax_class === 'standard' ) { + $rates = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}woocommerce_tax_rates - WHERE tax_rate_class = %s - ORDER BY tax_rate_order ASC", - $tax_class - ) - ); + WHERE tax_rate_class = '' OR tax_rate_class = 'standard' + ORDER BY tax_rate_order ASC" + ); + } else { + $rates = $wpdb->get_results( + $wpdb->prepare( + "SELECT * FROM {$wpdb->prefix}woocommerce_tax_rates + WHERE tax_rate_class = %s + ORDER BY tax_rate_order ASC", + $tax_class + ) + ); + } $formatted_rates = array();