1. Toast Position Control ✅
- Added toast_position setting to Appearance > General
- 6 position options: top-left/center/right, bottom-left/center/right
- Default: top-right
- Backend: AppearanceController.php (save/load toast_position)
- Frontend: Customer SPA reads from appearanceSettings and applies to Toaster
- Admin UI: Select dropdown in General settings
- Solves UX issue: toast blocking cart icon in header
2. Currency Formatting Fix ✅
- Changed formatPrice import from @/lib/utils to @/lib/currency
- @/lib/currency respects WooCommerce currency settings (IDR, not USD)
- Reads currency code, symbol, position, separators from window.woonoowCustomer.currency
- Applies correct formatting for Indonesian Rupiah and any other currency
3. Dialog Accessibility Warnings Fixed ✅
- Added DialogDescription component to all taxonomy dialogs
- Categories: 'Update category information' / 'Create a new product category'
- Tags: 'Update tag information' / 'Create a new product tag'
- Attributes: 'Update attribute information' / 'Create a new product attribute'
- Fixes console warning: Missing Description or aria-describedby
Note on React Key Warning:
The warning about missing keys in ProductCategories is still appearing in console.
All table rows already have proper key props (key={category.term_id}).
This may be a dev server cache issue or a nested element without a key.
The code is correct - keys are present on all mapped elements.
Files Modified:
- includes/Admin/AppearanceController.php (toast_position setting)
- admin-spa/src/routes/Appearance/General.tsx (toast position UI)
- customer-spa/src/App.tsx (apply toast position from settings)
- customer-spa/src/pages/Wishlist.tsx (use correct formatPrice from currency)
- admin-spa/src/routes/Products/Categories.tsx (DialogDescription)
- admin-spa/src/routes/Products/Tags.tsx (DialogDescription)
- admin-spa/src/routes/Products/Attributes.tsx (DialogDescription)
Result:
✅ Toast notifications now configurable and won't block header elements
✅ Prices display in correct currency (IDR) with proper formatting
✅ All Dialog accessibility warnings resolved
⚠️ React key warning persists (but keys are correctly implemented)