Commit Graph

7 Commits

Author SHA1 Message Date
Dwindi Ramadhana
82399d4ddf fix: WP-Admin CSS conflicts and add-to-cart redirect
- Fix CSS conflicts between WP-Admin and SPA (radio buttons, chart text)
- Add Tailwind important selector scoped to #woonoow-admin-app
- Remove overly aggressive inline SVG styles from Assets.php
- Add targeted WordPress admin CSS overrides in index.css
- Fix add-to-cart redirect to use woocommerce_add_to_cart_redirect filter
- Let WooCommerce handle cart operations natively for proper session management
- Remove duplicate tailwind.config.cjs
2025-12-31 14:06:04 +07:00
dwindown
c9e036217e feat: Implement smart back navigation with fallback across all detail/edit pages
Implemented context-aware back button that respects user's navigation path:

Pattern:
```typescript
const handleBack = () => {
  if (window.history.state?.idx > 0) {
    navigate(-1); // Go back in history
  } else {
    navigate('/fallback'); // Safe fallback
  }
};
```

Updated Pages:
 Orders/Detail.tsx → Fallback: /orders
 Orders/Edit.tsx → Fallback: /orders/:id
 Customers/Detail.tsx → Fallback: /customers
 Customers/Edit.tsx → Fallback: /customers
 Products/Edit.tsx → Fallback: /products
 Coupons/Edit.tsx → Fallback: /coupons

User Flow Examples:

1. Normal Navigation (History Available):
   Customers Index → Customer Detail → Orders Tab → Order Detail
   → Click Back → Returns to Customer Detail 

2. Direct Access (No History):
   User opens /orders/360 directly
   → Click Back → Goes to /orders (fallback) 

3. New Tab (No History):
   User opens order in new tab
   → Click Back → Goes to /orders (fallback) 

4. Page Refresh (History Cleared):
   User refreshes page
   → Click Back → Goes to fallback 

Benefits:
 Respects user's navigation path when possible
 Never breaks or leaves the app
 Predictable behavior in all scenarios
 Professional UX (like Gmail, Shopify, etc.)
 Works with deep links and bookmarks

Technical:
- Uses window.history.state.idx to detect history
- Falls back to safe default when no history
- Consistent pattern across all pages
- No URL parameters needed

Result: Back button now works intelligently based on context!
2025-11-21 10:12:26 +07:00
dwindown
fe545a480d fix: Move useEffect before early returns (Rules of Hooks)
Critical bug: Hook called after conditional return

Problem:
- useEffect at line 107 was AFTER early returns (lines 83-102)
- When loading/error states triggered early return
- Hook order changed between renders
- React detected hook order violation
- Component broke with blank screen

Rules of Hooks violation:
 Before:
1. All hooks (useState, useQuery, etc.)
2. Early return if loading
3. Early return if error
4. useEffect (line 107) ← WRONG! After conditional returns

 After:
1. All hooks including ALL useEffects
2. Early return if loading
3. Early return if error
4. Render

Fix:
- Moved useEffect from line 107 to line 62
- Now before any early returns
- Changed product?.meta to productQ.data?.meta
- Hooks always called in same order
- No conditional hook calls

Result:
 Product edit form loads correctly
 No React warnings
 Follows Rules of Hooks
 Consistent hook order every render
2025-11-20 22:22:40 +07:00
dwindown
0c5efa3efc feat: Phase 2 - Frontend meta fields components (Level 1)
Implemented: Frontend Components for Level 1 Compatibility

Created Components:
- MetaFields.tsx - Generic meta field renderer
- useMetaFields.ts - Hook for field registry

Integrated Into:
- Orders/Edit.tsx - Meta fields after OrderForm
- Products/Edit.tsx - Meta fields after ProductForm

Features:
- Supports: text, textarea, number, date, select, checkbox
- Groups fields by section
- Zero coupling with specific plugins
- Renders any registered fields dynamically
- Read-only mode support

How It Works:
1. Backend exposes meta via API (Phase 1)
2. PHP registers fields via MetaFieldsRegistry (Phase 3 - next)
3. Fields localized to window.WooNooWMetaFields
4. useMetaFields hook reads registry
5. MetaFields component renders fields
6. User edits fields
7. Form submission includes meta
8. Backend saves via update_order_meta_data()

Result:
- Generic, reusable components
- Zero plugin-specific code
- Works with any registered fields
- Clean separation of concerns

Next: Phase 3 - PHP MetaFieldsRegistry system
2025-11-20 12:32:06 +07:00
dwindown
07b5b072c2 fix: Use active WooCommerce currency instead of hardcoded USD
Fixed Issues:
1.  Currency hardcoded to USD in product forms
2.  Edit page redirect to non-existent detail page

Changes:

🌍 Currency Integration (GeneralTab.tsx):
- Import getStoreCurrency() from @/lib/currency
- Get store currency data: symbol, decimals, position
- Replace hardcoded $ icon with dynamic store.symbol
- Use store.decimals for input step:
  * step="1" for zero-decimal currencies (IDR, JPY, etc.)
  * step="0.01" for decimal currencies (USD, EUR, etc.)
- Update placeholder based on decimals:
  * "0" for zero-decimal
  * "0.00" for decimal

Before:
- <DollarSign /> icon (always $)
- step="0.01" (always 2 decimals)
- placeholder="0.00" (always 2 decimals)

After:
- <span>{store.symbol}</span> (Rp, $, RM, etc.)
- step={store.decimals === 0 ? '1' : '0.01'}
- placeholder={store.decimals === 0 ? '0' : '0.00'}

🌍 Currency Display (index.tsx):
- Import formatMoney() from @/lib/currency
- Replace hardcoded $:
  * Before: ${parseFloat(product.regular_price).toFixed(2)}
  * After: formatMoney(product.regular_price)
- Now respects:
  * Currency symbol (Rp, $, RM, etc.)
  * Decimal places (0 for IDR, 2 for USD)
  * Thousand separator (. for IDR, , for USD)
  * Decimal separator (, for IDR, . for USD)
  * Position (left/right/left_space/right_space)

Examples:
- IDR: Rp 100.000 (no decimals, dot separator)
- USD: $100.00 (2 decimals, comma separator)
- MYR: RM 100.00 (2 decimals)

🔧 Edit Page Fix:
- Changed redirect after update:
  * Before: navigate(`/products/${id}`) → 404 (no detail page)
  * After: navigate('/products') → products list 

Result:
 Product forms use active WooCommerce currency
 Prices display with correct symbol and format
 Input fields respect currency decimals
 Edit page redirects to index after save
 Consistent with Orders module pattern
2025-11-19 23:32:59 +07:00
dwindown
397e1426dd feat: Modern tabbed product form (Shopify-inspired UX)
Replaced single-form with modular tabbed interface for better UX.

 New Modular Components:
- GeneralTab.tsx - Basic info, descriptions, product type
- PricingTab.tsx - SKU, prices with savings calculator
- InventoryTab.tsx - Stock management with visual status
- VariationsTab.tsx - Attributes & variations generator
- OrganizationTab.tsx - Categories & tags
- ProductFormTabbed.tsx - Main form orchestrator

🎨 UX Improvements:
 Progressive Disclosure - Only show relevant fields per tab
 Visual Hierarchy - Cards with clear titles & descriptions
 Inline Help - Contextual hints below each field
 Smart Defaults - Pre-fill variation prices with base price
 Better Separator - Use | (pipe) instead of comma (easier to type!)
 Visual Feedback - Badges, color-coded status, savings %
 Validation Routing - Auto-switch to tab with errors
 Mobile Optimized - Responsive tabs, touch-friendly
 Disabled State - Variations tab disabled for non-variable products

🔧 Technical:
- Modular architecture (5 separate tab components)
- Type-safe with TypeScript
- Reusable across create/edit
- Form ref support for page header buttons
- Full i18n support

📊 Stats:
- 5 tab components (~150-300 lines each)
- 1 orchestrator component (~250 lines)
- Total: ~1,200 lines well-organized code
- Much better than 600-line single form!

Industry Standard:
Based on Shopify, Shopee, Wix, Magento best practices
2025-11-19 22:13:13 +07:00
dwindown
479293ed09 feat: Product New/Edit pages with comprehensive form
Implemented full Product CRUD create/edit functionality.

Product New Page (New.tsx):
 Create new products
 Page header with back/create buttons
 Form submission with React Query mutation
 Success toast & navigation
 Error handling

Product Edit Page (Edit.tsx):
 Load existing product data
 Update product with PUT request
 Loading & error states
 Page header with back/save buttons
 Query invalidation on success

ProductForm Component (partials/ProductForm.tsx - 600+ lines):
 Basic Information (name, type, status, descriptions)
 Product Types: Simple, Variable, Grouped, External
 Pricing (regular, sale, SKU) for simple products
 Inventory Management (stock tracking, quantity, status)
 Categories & Tags (multi-select with checkboxes)
 Attributes & Variations (for variable products)
  - Add/remove attributes
  - Define attribute options
  - Generate all variations automatically
  - Per-variation pricing & stock
 Additional Options (virtual, downloadable, featured)
 Form validation
 Reusable for create/edit modes
 Full i18n support

Features:
- Dynamic category/tag fetching from API
- Variation generator from attributes
- Manage stock toggle
- Stock status badges
- Form ref for external submit
- Hide submit button option (for page header buttons)
- Comprehensive validation
- Toast notifications

Pattern:
- Follows PROJECT_SOP.md CRUD template
- Consistent with Orders module
- Clean separation of concerns
- Type-safe with TypeScript
2025-11-19 20:36:26 +07:00