Commit Graph

16 Commits

Author SHA1 Message Date
dwindown
5129ff9aea fix: Use correct meta key format for variation attributes
Found the issue from debug log:
- WooCommerce stores as: attribute_Color (exact case match)
- We were trying: attribute_color (lowercase) 

Fixed:
- Use 'attribute_' + exact attribute name
- get_post_meta with true flag returns single value (not array)

Result:
- Variation #362: {"Color": "Red"} 
- Variation #363: {"Color": "Blue"} 

Removed debug logging as requested.
2025-11-20 01:03:34 +07:00
dwindown
c397639176 debug: Log all variation meta to find correct attribute storage key
Added logging to see ALL meta keys and values for variations.
This will show us exactly how WooCommerce stores the attribute values.

Check debug.log for:
Variation #362 ALL META: Array(...)

This will reveal the actual meta key format.
2025-11-20 01:02:14 +07:00
dwindown
86525a32e3 fix: Properly extract variation attribute values from WooCommerce meta
Fixed empty attribute values in variations.

WooCommerce stores variation attributes in post meta:
- Key format: 'attribute_' + lowercase attribute name
- Example: 'attribute_color' → 'red'

Changes:
1. Try lowercase: attribute_color
2. Fallback to sanitized: attribute_pa-color
3. Capitalize name for display: Color

This should now show:
- Before: {"Color": ""}
- After: {"Color": "Red"} or {"Color": "Blue"}

Test by refreshing edit product page.
2025-11-20 01:00:50 +07:00
dwindown
4974d426ea debug: Add try-catch to get_products to catch silent errors
Wrapped entire get_products() in try-catch.

Will log:
- START when function begins
- END SUCCESS when completes
- ERROR + stack trace if exception thrown

This will reveal if there's a PHP error causing silent failure.
2025-11-20 00:54:52 +07:00
dwindown
b91c8bff61 debug: Check if callback is actually callable
Testing if [__CLASS__, 'get_products'] is callable.
If NO, PHP cannot call the method (maybe method doesn't exist or wrong visibility).
If YES but still not called, WordPress routing issue.
2025-11-20 00:52:20 +07:00
dwindown
cc4db4d98a debug: Add route registration success/failure logging
Added logging to verify:
1. register_routes() is called
2. register_rest_route() returns success/failure

This will show if route registration is actually working.

If we see FAILED, it means another plugin/route is conflicting.
If we see SUCCESS but get_products() not called, routing issue.
2025-11-20 00:49:35 +07:00
dwindown
55f3f0c2fd debug: Add comprehensive logging to trace route registration
Added logging at 3 critical points:
1. rest_api_init hook firing
2. Before ProductsController::register_routes()
3. After ProductsController::register_routes()
4. Inside ProductsController::get_products()

This will show us:
- Is rest_api_init hook firing?
- Is ProductsController being registered?
- Is get_products() being called when we hit /products?

Expected log sequence:
1. WooNooW Routes: rest_api_init hook fired
2. WooNooW Routes: Registering ProductsController routes
3. WooNooW Routes: ProductsController routes registered
4. WooNooW ProductsController::get_products() CALLED (when API called)

If any are missing, we know where the problem is.
2025-11-20 00:44:45 +07:00
dwindown
bc733ab2a6 debug: Add debug markers to verify ProductsController is running
Added debug markers:
1. _debug field in response with timestamp
2. X-WooNooW-Version header
3. Improved variation attribute retrieval

Issue: API returns different structure than code produces
Response has: id, name, price (only 9 fields)
Code returns: id, name, type, status, price, etc (15+ fields)

This suggests:
- Response is cached somewhere
- Different controller handling request
- Middleware transforming response

Debug steps:
1. Check response for _debug field
2. Check response headers for X-WooNooW-Version
3. If missing, endpoint not using our code
4. Check wp-content/debug.log for error messages
2025-11-20 00:39:24 +07:00
dwindown
304a58d8a1 fix: Force fresh data fetch and improve variation attribute handling
Fixed 2 issues:

1. Frontend Showing Stale Data - FIXED
   Problem: Table shows "Simple" even though API returns "variable"
   Root Cause: React Query caching old data

   Solution (index.tsx):
   - Added staleTime: 0 (always fetch fresh)
   - Added gcTime: 0 (don't cache)
   - Forces React Query to fetch from API every time

   Result: Table will show correct product type

2. Variation Attribute Values - IMPROVED
   Problem: attributes show { "Color": "" } instead of { "Color": "Red" }

   Improvements:
   - Use wc_attribute_label() for proper attribute names
   - Better handling of global vs custom attributes
   - Added debug logging to see raw WooCommerce data

   Debug Added:
   - Logs raw variation attributes to debug.log
   - Check: wp-content/debug.log
   - Shows what WooCommerce actually returns

   Note: If attribute values still empty, it means:
   - Variations not properly saved in WooCommerce
   - Need to re-save product or regenerate variations

Test:
1. Refresh products page
2. Should show correct type (variable)
3. Check debug.log for variation attribute data
4. If still empty, re-save the variable product
2025-11-20 00:32:42 +07:00
dwindown
5d0f887c4b fix: Add no-cache headers and fix variation attribute display
Fixed 2 critical issues:

1. API Response Caching - FIXED
   Problem: API returns old data without type, status fields
   Root Cause: WordPress REST API response caching

   Solution:
   - Added no-cache headers to response:
     * Cache-Control: no-cache, no-store, must-revalidate
     * Pragma: no-cache
     * Expires: 0
   - Added debug logging to verify data structure
   - Forces fresh data on every request

   Result: API will return fresh data with all fields

2. Variation Attribute Values Missing - FIXED
   Problem: Shows "color:" instead of "color: Red"
   Root Cause: API returns slugs not human-readable values

   Before:
   attributes: { "pa_color": "red" }

   After:
   attributes: { "Color": "Red" }

   Solution:
   - Remove 'pa_' prefix from attribute names
   - Capitalize attribute names
   - Convert taxonomy slugs to term names
   - Return human-readable format

   Code:
   - Clean name: pa_color → Color
   - Get term: red (slug) → Red (name)
   - Format: { Color: Red }

   Result: Variations show "color: Red" correctly

Test:
1. Hard refresh browser (Ctrl+Shift+R or Cmd+Shift+R)
2. Check products list - should show type and prices
3. Edit variable product - should show "color: Red"
2025-11-20 00:26:54 +07:00
dwindown
c10d5d1bd0 fix: Ensure all product fields returned in API response
Issue: API response missing type, status, stock fields
Cause: PHP opcode cache serving old code

Solution:
1. Cleared PHP opcode cache
2. Added detailed docblock to force file re-read
3. Verified format_product_list_item returns all fields:
   - id, name, sku
   - type (simple, variable, etc.) ← WAS MISSING
   - status (publish, draft, etc.) ← WAS MISSING
   - price, regular_price, sale_price
   - price_html (with variable product range support)
   - stock_status, stock_quantity, manage_stock ← WAS MISSING
   - image_url, permalink
   - date_created, date_modified ← WAS MISSING

Test: Refresh products page to see correct type and prices
2025-11-20 00:20:59 +07:00
dwindown
4d185f0c24 fix: Product list display, redirect after create, and edit form data loading
Fixed 3 critical issues:

1.  Price and Type Column Display
   Problem: Columns showing empty even though data exists
   Root Cause: price_html returns empty string for products without prices
   Solution:
   - Added fallback chain in index.tsx:
     1. Try price_html (formatted HTML)
     2. Fallback to regular_price (plain number)
     3. Fallback to "—" (dash)
   - Added fallback for type: {product.type || '—'}

   Now displays:
   - Formatted price if available
   - Plain price if no HTML
   - Dash if no price at all

2.  Redirect After Create Product
   Problem: Stays on form after creating product
   Expected: Return to products index
   Solution:
   - Changed New.tsx redirect from:
     navigate(`/products/${response.id}`) → navigate('/products')
   - Removed conditional logic
   - Always redirect to index after successful create

   User flow now:
   Create product → Success toast → Back to products list 

3.  Edit Form Not Loading Data
   Problem: Edit form shows empty fields instead of product data
   Root Cause: Missing fields in API response (virtual, downloadable, featured)
   Solution:
   - Added to format_product_full() in ProductsController.php:
     * $data['virtual'] = $product->is_virtual();
     * $data['downloadable'] = $product->is_downloadable();
     * $data['featured'] = $product->is_featured();

   Now edit form receives complete data:
   - Basic info (name, type, status, descriptions)
   - Pricing (SKU, regular_price, sale_price)
   - Inventory (manage_stock, stock_quantity, stock_status)
   - Categories & tags
   - Virtual, downloadable, featured flags
   - Attributes & variations (for variable products)

Result:
 Products list shows prices and types correctly
 Creating product redirects to index
 Editing product loads all data properly
2025-11-19 23:13:52 +07:00
dwindown
7bab3d809d fix: PHP Fatal Error and attribute input UX
Critical Fixes:

1.  PHP Fatal Error - FIXED
   Problem: call_user_func() error - Permissions::check_admin does not exist
   Cause: Method name mismatch in ProductsController.php
   Solution: Changed all 8 occurrences from:
     'permission_callback' => [Permissions::class, 'check_admin']
   To:
     'permission_callback' => [Permissions::class, 'check_admin_permission']

   Affected routes:
   - GET /products
   - GET /products/:id
   - POST /products
   - PUT /products/:id
   - DELETE /products/:id
   - GET /products/categories
   - GET /products/tags
   - GET /products/attributes

2.  Attribute Options Input - FIXED
   Problem: Cannot type anything after first word (cursor jumps)
   Cause: Controlled input with immediate state update on onChange
   Solution: Changed to uncontrolled input with onBlur

   Changes:
   - value → defaultValue (uncontrolled)
   - onChange → onBlur (update on blur)
   - Added key prop for proper re-rendering
   - Added onKeyDown for Enter key support
   - Updated help text: "press Enter or click away"

   Now you can:
    Type: Red, Blue, Green (naturally!)
    Type: Red | Blue | Green (pipe works too!)
    Press Enter to save
    Click away to save
    No cursor jumping!

Result:
- Products index page loads without PHP error
- Attribute options input works naturally
- Both comma and pipe separators supported
2025-11-19 23:04:58 +07:00
dwindown
d13a356331 fix: Major UX improvements and API error handling
Fixed Issues:
1.  API error handling - Added try-catch and validation
2.  Pipe separator UX - Now accepts comma OR pipe naturally
3.  Tab restructuring - Merged pricing into General tab

Changes:

🔧 API (ProductsController.php):
- Added try-catch error handling in create_product
- Validate required fields (name)
- Better empty field checks (use !empty instead of ??)
- Support virtual, downloadable, featured flags
- Array validation for categories/tags/variations
- Return proper WP_Error on exceptions

🎨 UX Improvements:

1. Attribute Options Input (VariationsTab.tsx):
    Old: Pipe only, spaces rejected
    New: Comma OR pipe, spaces allowed
   - Split by /[,|]/ regex
   - Display as comma-separated (more natural)
   - Help text: "Type naturally: Red, Blue, Green"
   - No more cursor gymnastics!

2. Tab Restructuring (ProductFormTabbed.tsx):
    Old: 5 tabs (General, Pricing, Inventory, Variations, Organization)
    New: 3-4 tabs (General+Pricing, Inventory, Variations*, Organization)
   - Pricing merged into General tab
   - Variable products: 4 tabs (Variations shown)
   - Simple products: 3 tabs (Variations hidden)
   - Dynamic grid: grid-cols-3 or grid-cols-4
   - Less tab switching!

3. GeneralTab.tsx Enhancement:
   - Added pricing fields section
   - SKU, Regular Price, Sale Price
   - Savings calculator ("Customers save X%")
   - Context-aware help text:
     * Simple: "Base price before discounts"
     * Variable: "Base price (can override per variation)"
   - All in one place!

📊 Result:
- Simpler navigation (3-4 tabs vs 5)
- Natural typing (comma works!)
- Better context (pricing with product info)
- Less cognitive load
- Faster product creation
2025-11-19 22:59:31 +07:00
dwindown
89b31fc9c3 fix: Product form TypeScript and API errors
Fixed Issues:
1. TypeScript error on .indeterminate property (line 332)
   - Cast checkbox element to any for indeterminate access
2. API error handling for categories/tags endpoints
   - Added is_wp_error() checks
   - Return empty array on error instead of 500

Next: Implement modern tabbed product form (Shopify-style)
2025-11-19 22:00:15 +07:00
dwindown
8b58b2a605 docs: Update progress and SOP with CRUD pattern
Updated documentation with latest progress and standardized CRUD pattern.

PROGRESS_NOTE.md Updates:
- Email notification enhancements (variable dropdown, card reorganization)
- Card styling fixes (success = green, not purple)
- List support verification
- Product CRUD backend API complete (600+ lines)
- All endpoints: list, get, create, update, delete
- Full variant support for variable products
- Categories, tags, attributes endpoints

PROJECT_SOP.md Updates:
- Added Section 6.9: CRUD Module Pattern (Standard Template)
- Complete file structure template
- Backend API pattern with code examples
- Frontend index/create/edit page patterns
- Comprehensive checklist for new modules
- Based on Orders module analysis
- Ready to use for Products, Customers, Coupons, etc.

Benefits:
- Consistent pattern across all modules
- Faster development (copy-paste template)
- Standardized UX and code structure
- Clear checklist for implementation
- Reference implementation documented
2025-11-19 18:58:59 +07:00