Problem: React warning about missing keys persisted despite keys being present.
Root cause: term_id/attribute_id could be undefined during initial render before API response.
Solution: Add fallback keys using array index when primary ID is undefined:
- Categories: key={category.term_id || `category-${index}`}
- Tags: key={tag.term_id || `tag-${index}`}
- Attributes: key={attribute.attribute_id || `attribute-${index}`}
This ensures React always has a valid key, even during the brief moment
when data is loading or if the API returns malformed data.
Files Modified:
- admin-spa/src/routes/Products/Categories.tsx
- admin-spa/src/routes/Products/Tags.tsx
- admin-spa/src/routes/Products/Attributes.tsx
Result:
✅ React key warnings should be resolved
✅ Graceful handling of edge cases where IDs might be missing
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)