fix(tax): Tax rates now saving correctly + shadcn Select
## 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
This commit is contained in:
@@ -23,6 +23,8 @@ export default function TaxSettings() {
|
|||||||
const [showAddRate, setShowAddRate] = useState(false);
|
const [showAddRate, setShowAddRate] = useState(false);
|
||||||
const [editingRate, setEditingRate] = useState<any | null>(null);
|
const [editingRate, setEditingRate] = useState<any | null>(null);
|
||||||
const [deletingRate, setDeletingRate] = useState<any | null>(null);
|
const [deletingRate, setDeletingRate] = useState<any | null>(null);
|
||||||
|
const [dismissedSuggestions, setDismissedSuggestions] = useState<string[]>([]);
|
||||||
|
const [selectedTaxClass, setSelectedTaxClass] = useState<string>('');
|
||||||
|
|
||||||
// Fetch tax settings
|
// Fetch tax settings
|
||||||
const { data: settings, isLoading } = useQuery({
|
const { data: settings, isLoading } = useQuery({
|
||||||
@@ -140,7 +142,7 @@ export default function TaxSettings() {
|
|||||||
state: formData.get('state') as string || '',
|
state: formData.get('state') as string || '',
|
||||||
rate: parseFloat(formData.get('rate') as string),
|
rate: parseFloat(formData.get('rate') as string),
|
||||||
name: formData.get('name') as string,
|
name: formData.get('name') as string,
|
||||||
tax_class: formData.get('tax_class') as string || '',
|
tax_class: selectedTaxClass || '',
|
||||||
priority: 1,
|
priority: 1,
|
||||||
compound: 0,
|
compound: 0,
|
||||||
shipping: 1,
|
shipping: 1,
|
||||||
@@ -391,6 +393,10 @@ export default function TaxSettings() {
|
|||||||
if (!open) {
|
if (!open) {
|
||||||
setShowAddRate(false);
|
setShowAddRate(false);
|
||||||
setEditingRate(null);
|
setEditingRate(null);
|
||||||
|
setSelectedTaxClass('');
|
||||||
|
} else {
|
||||||
|
// Initialize tax class when opening
|
||||||
|
setSelectedTaxClass(editingRate?.tax_class || '');
|
||||||
}
|
}
|
||||||
}}>
|
}}>
|
||||||
<DialogContent>
|
<DialogContent>
|
||||||
@@ -455,15 +461,16 @@ export default function TaxSettings() {
|
|||||||
|
|
||||||
<div>
|
<div>
|
||||||
<Label>{__('Tax Class (Optional)')}</Label>
|
<Label>{__('Tax Class (Optional)')}</Label>
|
||||||
<select
|
<Select value={selectedTaxClass} onValueChange={setSelectedTaxClass}>
|
||||||
name="tax_class"
|
<SelectTrigger>
|
||||||
defaultValue={editingRate?.tax_class || ''}
|
<SelectValue placeholder={__('Standard')} />
|
||||||
className="flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"
|
</SelectTrigger>
|
||||||
>
|
<SelectContent>
|
||||||
<option value="">{__('Standard')}</option>
|
<SelectItem value="">{__('Standard')}</SelectItem>
|
||||||
<option value="reduced-rate">{__('Reduced Rate')}</option>
|
<SelectItem value="reduced-rate">{__('Reduced Rate')}</SelectItem>
|
||||||
<option value="zero-rate">{__('Zero Rate')}</option>
|
<SelectItem value="zero-rate">{__('Zero Rate')}</SelectItem>
|
||||||
</select>
|
</SelectContent>
|
||||||
|
</Select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -171,6 +171,14 @@ class TaxController extends WP_REST_Controller {
|
|||||||
private function get_tax_rates( $tax_class ) {
|
private function get_tax_rates( $tax_class ) {
|
||||||
global $wpdb;
|
global $wpdb;
|
||||||
|
|
||||||
|
// 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 = '' OR tax_rate_class = 'standard'
|
||||||
|
ORDER BY tax_rate_order ASC"
|
||||||
|
);
|
||||||
|
} else {
|
||||||
$rates = $wpdb->get_results(
|
$rates = $wpdb->get_results(
|
||||||
$wpdb->prepare(
|
$wpdb->prepare(
|
||||||
"SELECT * FROM {$wpdb->prefix}woocommerce_tax_rates
|
"SELECT * FROM {$wpdb->prefix}woocommerce_tax_rates
|
||||||
@@ -179,6 +187,7 @@ class TaxController extends WP_REST_Controller {
|
|||||||
$tax_class
|
$tax_class
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
$formatted_rates = array();
|
$formatted_rates = array();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user