fix: Critical fixes for shipping and meta field registration

Issue 1: Shipping recalculation on order edit (FIXED)
- Problem: OrderForm recalculated shipping on every edit
- Expected: Shipping should be fixed unless address changes
- Solution: Use existing order.totals.shipping in edit mode
- Create mode: Still calculates from shipping method

Issue 2: Meta fields not appearing without data (DOCUMENTED)
- Problem: Private meta fields dont appear if no data exists yet
- Example: Admin cannot input tracking number on first time
- Root cause: Fields only exposed if data exists in database
- Solution: Plugins MUST register fields via MetaFieldsRegistry
- Registration makes field available even when empty

Updated METABOX_COMPAT.md:
- Changed optional to REQUIRED for field registration
- Added critical warning section
- Explained private vs public meta behavior
- Private meta: MUST register to appear
- Public meta: Auto-exposed, no registration needed

The Flow (Corrected):
1. Plugin registers field -> Field appears in UI (even empty)
2. Admin inputs data -> Saved to database
3. Data visible in both admins

Without Registration:
- Private meta (_field): Not exposed, not editable
- Public meta (field): Auto-exposed, auto-editable

Why Private Meta Requires Registration:
- Security: Hidden by default
- Privacy: Prevents exposing sensitive data
- Control: Plugins explicitly declare visibility

Files Changed:
- OrderForm.tsx: Use existing shipping total in edit mode
- METABOX_COMPAT.md: Critical documentation updates

Result:
- Shipping no longer recalculates on edit
- Clear documentation on field registration requirement
- Developers know they MUST register private meta fields
This commit is contained in:
dwindown
2025-11-20 12:53:55 +07:00
parent dd8df3ae80
commit afb54b962e
2 changed files with 44 additions and 6 deletions

View File

@@ -314,11 +314,18 @@ export default function OrderForm({
);
// Calculate shipping cost
// In edit mode: use existing order shipping total (fixed unless address changes)
// In create mode: calculate from selected shipping method
const shippingCost = React.useMemo(() => {
if (mode === 'edit' && initial?.totals?.shipping !== undefined) {
// Use existing shipping total from order
return Number(initial.totals.shipping) || 0;
}
// Create mode: calculate from shipping method
if (!shippingMethod) return 0;
const method = shippings.find(s => s.id === shippingMethod);
return method ? Number(method.cost) || 0 : 0;
}, [shippingMethod, shippings]);
}, [mode, initial?.totals?.shipping, shippingMethod, shippings]);
// Calculate discount from validated coupons
const couponDiscount = React.useMemo(() => {