Commit Graph

13 Commits

Author SHA1 Message Date
Dwindi Ramadhana
47a1e78eb7 fix: backend email rendering for new button/card syntax
ROOT CAUSE:
Frontend blocksToMarkdown outputs NEW syntax:
- [card:type]...[/card]
- [button:style](url)Text[/button]

But backend EmailRenderer.php only had regex for OLD syntax:
- [card type="..."]...[/card]
- [button url="..."]Text[/button]

FIXES:
1. parse_cards() now handles BOTH syntaxes:
   - NEW [card:type] regex first (extracts type from :type)
   - OLD [card type="..."] regex for backward compatibility

2. render_card() now handles BOTH button syntaxes:
   - NEW [button:style](url)Text[/button] regex
   - OLD [button url="..."] regex for backward compatibility

3. Card types properly styled with inline CSS:
   - hero: gradient background
   - success: green background + border
   - info: blue background + border
   - warning: yellow background + orange border

4. Buttons rendered with full inline styles + table wrapper
   for Gmail/email client compatibility
2026-01-01 22:27:20 +07:00
Dwindi Ramadhana
58681e272e feat: temp password in emails + WC page redirects to SPA
1. Temp password for auto-registered users:
   - Store password in _woonoow_temp_password user meta (CheckoutController)
   - Add {user_temp_password} and {login_url} variables (EmailRenderer)
   - Update new_customer email template to show credentials

2. WC page redirects to SPA routes:
   - Added redirect_wc_pages_to_spa() in TemplateOverride
   - Maps: /shop → /store/#/, /cart → /store/#/cart, etc.
   - /checkout → /store/#/checkout, /my-account → /store/#/account
   - Single products → /store/#/products/{slug}

3. Removed shortcode system:
   - Commented out Shortcodes::init() in Bootstrap
   - WC pages now redirect to SPA instead
2026-01-01 16:45:24 +07:00
Dwindi Ramadhana
38a7a4ee23 fix: email variable replacement + icon URL path
1. Added missing base variables in get_variables():
   - site_name, site_title, store_name
   - shop_url, my_account_url
   - support_email, current_year

2. Fixed social icon URL path calculation:
   - Was using 3x dirname which pointed to 'includes/' not plugin root
   - Now uses WOONOOW_URL constant or correct 4x dirname

3. Added px-6 padding to EmailBuilder dialog body

4. Added portal container to Select component for CSS scoping
2026-01-01 02:12:09 +07:00
Dwindi Ramadhana
52cea87078 fix: email buttons now render with inline styles for Gmail
1. EmailRenderer: Added button parsing with full inline styles
   - Buttons now use table-based layout for email client compatibility
   - Solid and outline button styles with custom colors from settings

2. DefaultTemplates: Updated new_customer template
   - Added 'Set Your Password' button for auto-registered users
   - Uses {set_password_url} variable for password reset link

3. EmailRenderer: Added set_password_url variable
   - Generates secure password reset link for new customers
   - Also added my_account_url and shop_url to customer variables
2026-01-01 01:06:18 +07:00
dwindown
42457e75f1 fix: Card success styling and ensure list support
Fixed two email rendering issues:

1. Card Success Styling
   - Was using hero gradient (purple) instead of green theme
   - Now uses proper green background (#f0fdf4) with green border
   - Info card: blue theme with border
   - Warning card: orange theme with border
   - Hero card: keeps gradient as intended

2. List Support Verification
   - MarkdownParser already supports bullet lists
   - Supports: *, -, •, ✓, ✔ as list markers
   - Properly converts to <ul><li> HTML
   - Works in both visual editor and email preview

Card Types Now:
- default: white background
- hero: gradient background (purple)
- success: green background with left border
- info: blue background with left border
- warning: orange background with left border
2025-11-19 18:35:34 +07:00
dwindown
88de190df4 fix: Add all missing email template variables
Fixed missing variables: completion_date, order_items_table, payment_date, transaction_id, tracking_number, review_url, shop_url, and more.

Added proper HTML table for order items with styling.
All template variables now properly replaced in emails.
2025-11-18 22:03:51 +07:00
dwindown
1225d7b0ff fix: Email rendering - newlines, hero text color, and card borders
🐛 Three Critical Email Issues Fixed:

1. Newlines Not Working
    "Order Number: #359 Order Total: Rp129.000" on same line
    Fixed by adding <br> for line continuations in paragraphs

   Key change in MarkdownParser.php:
   - Accumulate paragraph content with <br> between lines
   - Match TypeScript behavior exactly
   - Protect variables from markdown parsing

   Before:
   $paragraph_content = $trimmed;

   After:
   if ($paragraph_content) {
       $paragraph_content .= '<br>' . $trimmed;
   } else {
       $paragraph_content = $trimmed;
   }

2. Hero Card Text Color
    Heading black instead of white in Gmail
    Add inline color styles to all headings/paragraphs

   Problem: Gmail doesn't inherit color from parent
   Solution: Add style="color: white;" to each element

   $content = preg_replace(
       '/<(h[1-6]|p)([^>]*)>/',
       '<$1$2 style="color: ' . $hero_text_color . ';">',
       $content
   );

3. Blue Border on Cards
    Unwanted blue border in Gmail (screenshot 2)
    Removed borders from .card-info, .card-warning, .card-success

   Problem: CSS template had borders
   Solution: Removed border declarations

   Before:
   .card-info { border: 1px solid #0071e3; }

   After:
   .card-info { background-color: #f0f7ff; }

�� Additional Improvements:
- Variable protection during markdown parsing
- Don't match bold/italic across newlines
- Proper list handling
- Block-level tag detection
- Paragraph accumulation with line breaks

🎯 Result:
-  Proper line breaks in paragraphs
-  White text in hero cards (Gmail compatible)
-  No unwanted borders
-  Variables preserved during parsing
-  Professional email appearance

Test: Create order, check email - should now show:
- Order Number: #359
- Order Total: Rp129.000
- Estimated Delivery: 3-5 business days
(Each on separate line with proper spacing)
2025-11-18 21:46:06 +07:00
dwindown
c599bce71a fix: Add markdown parsing, variable replacement, and logo fallback
🐛 Email Rendering Issues Fixed:

1. Markdown Not Parsed
    Raw markdown showing: ## Great news...
    Created MarkdownParser.php (PHP port from TypeScript)
    Parses headings, bold, italic, lists, links
    Supports card blocks and button syntax
    Proper newline handling

2. Variables Not Replaced
    {support_email} showing literally
    Added support_email variable
    Added current_year variable
    Added estimated_delivery variable (3-5 business days)

3. Broken Logo Image
    Broken image placeholder
    Fallback to site icon if no logo set
    Fallback to text header if no icon
    Proper URL handling

4. Newline Issues
    Variables on same line
    Markdown parser handles newlines correctly
    Proper paragraph wrapping

📦 New File:
- includes/Core/Notifications/MarkdownParser.php
  - parse() - Convert markdown to HTML
  - parse_basics() - Parse standard markdown
  - nl2br_email() - Convert newlines for email

🔧 Updated Files:
- EmailRenderer.php
  - Use MarkdownParser in render_card()
  - Add support_email, current_year variables
  - Add estimated_delivery calculation
  - Logo fallback to site icon
  - Text header fallback if no logo

🎯 Result:
-  Markdown properly rendered
-  All variables replaced
-  Logo displays (or text fallback)
-  Proper line breaks
-  Professional email appearance

📝 Example:
Before: ## Great news, {customer_name}!
After: <h2>Great news, Dwindi Ramadhana!</h2>

Before: {support_email}
After: admin@example.com

Before: Broken image
After: Site icon or store name
2025-11-18 18:36:28 +07:00
dwindown
af2a3d3dd5 fix: Enable email notifications by default with default templates
🐛 CRITICAL FIX - Root Cause Found:

Problem 1: Events Not Enabled by Default
- is_event_enabled() returned false if not configured
- Required explicit admin configuration
- Plugin didn't work out-of-the-box

Solution:
- Enable email notifications by default if not configured
- Allow plugin to work with default templates
- Users can still disable via admin if needed

Problem 2: Default Templates Not Loading
- EmailRenderer called get_template() with only 2 args
- Missing $recipient_type parameter
- Default template lookup failed

Solution:
- Pass recipient_type to get_template()
- Proper default template lookup
- Added debug logging for template resolution

📝 Changes:

1. EmailManager::is_event_enabled()
   - Returns true by default for email channel
   - Logs when using default (not configured)
   - Respects explicit disable if configured

2. EmailRenderer::get_template_settings()
   - Pass recipient_type to TemplateProvider
   - Log template found/not found
   - Proper default template resolution

🎯 Result:
- Plugin works out-of-the-box
- Default templates used if not customized
- Email notifications sent without configuration
- Users can still customize in admin

 Expected Behavior:
1. Install plugin
2. Create order
3. Email sent automatically (default template)
4. Customize templates in admin (optional)

This fixes the issue where check-settings.php showed:
- Email: ✗ NOT CONFIGURED
- Templates: 0

Now it will use defaults and send emails!
2025-11-18 18:25:27 +07:00
dwindown
b6c2b077ee feat: Complete Social Icons & Settings Expansion! 🎨
## Implemented (Tasks 1-6):

### 1. All Social Platforms Added 
**Platforms:**
- Facebook, X (Twitter), Instagram
- LinkedIn, YouTube
- Discord, Spotify, Telegram
- WhatsApp, Threads, Website

**Frontend:** Updated select dropdown with all platforms
**Backend:** Added to allowed_platforms whitelist

### 2. PNG Icons Instead of Emoji 
- Use local PNG files from `/assets/icons/`
- Format: `mage--{platform}-{color}.png`
- Applied to email rendering and preview
- Much more accurate than emoji

### 3. Icon Color Option (Black/White) 
- New setting: `social_icon_color`
- Select dropdown: White Icons / Black Icons
- White for dark backgrounds
- Black for light backgrounds
- Applied to all social icons

### 4. Body Background Color Setting 
- New setting: `body_bg_color`
- Color picker + hex input
- Default: #f8f8f8
- Applied to email body background
- Applied to preview

### 5. Editor Mode Styling 📝
**Note:** Editor mode intentionally shows structure/content
Preview mode shows final styled result with all customizations
This is standard email builder UX pattern

### 6. Hero Preview Text Color Fixed 
- Applied `hero_text_color` directly to h3 and p
- Now correctly shows selected color
- Both heading and paragraph use custom color

## Technical Changes:

**Frontend:**
- Added body_bg_color and social_icon_color to interface
- Updated all social platform icons (Lucide)
- PNG icon URLs in preview
- Hero preview color fix

**Backend:**
- Added body_bg_color and social_icon_color to defaults
- Sanitization for new fields
- Updated allowed_platforms array
- PNG icon URL generation with color param

**Email Rendering:**
- Use PNG icons with color selection
- Apply body_bg_color
- get_social_icon_url() updated for PNG files

## Files Modified:
- `routes/Settings/Notifications/EmailCustomization.tsx`
- `routes/Settings/Notifications/EditTemplate.tsx`
- `includes/Api/NotificationsController.php`
- `includes/Core/Notifications/EmailRenderer.php`

Task 7 (default email content) pending - separate commit.
2025-11-13 14:50:55 +07:00
dwindown
2a98d6fc2b feat: Backend API & Email Rendering with Settings! 🔌
## 4. Wire to Backend 

### API Endpoints Created:
- `GET /woonoow/v1/notifications/email-settings` - Fetch settings
- `POST /woonoow/v1/notifications/email-settings` - Save settings
- `DELETE /woonoow/v1/notifications/email-settings` - Reset to defaults

### Features:
- Proper sanitization (sanitize_hex_color, esc_url_raw, etc.)
- Social links validation (allowed platforms only)
- Defaults fallback
- Stored in wp_options as `woonoow_email_settings`

### Email Rendering Integration:
**Logo & Header:**
- Uses logo_url if set, otherwise header_text
- Falls back to store name

**Footer:**
- Uses footer_text with {current_year} support
- Replaces {current_year} with actual year dynamically
- Social icons rendered from social_links array

**Hero Cards:**
- Applies hero_gradient_start and hero_gradient_end
- Applies hero_text_color to text and headings
- Works for type="hero" and type="success" cards

**Button Colors:**
- Ready to apply primary_color and button_text_color
- (Template needs update for dynamic button colors)

### Files:
- `includes/Api/NotificationsController.php` - API endpoints
- `includes/Core/Notifications/EmailRenderer.php` - Apply settings to emails

### Security:
- Permission checks (check_permission)
- Input sanitization
- URL validation
- Platform whitelist for social links

Frontend can now save/load settings! Backend applies them to emails! 🎉
2025-11-13 13:45:03 +07:00
dwindown
1573bff7b3 feat: Card-based email system implementation
##  Core Card System Complete!

### base.html Template
-  Single, theme-agnostic template
-  Card system CSS (default, highlight, info, warning, success, bg)
-  Customizable header (logo/text)
-  Customizable footer + social icons
-  Customizable body background
-  Mobile responsive
-  Email client compatible (Outlook, Gmail, etc.)

### EmailRenderer.php - Card Parser
-  `parse_cards()` - Parses [card]...[/card] syntax
-  `parse_card_attributes()` - Extracts type and bg attributes
-  `render_card()` - Renders card HTML
-  `render_card_spacing()` - 24px spacing between cards
-  `render_html()` - Email customization support
-  `get_social_icon_url()` - Social media icons

### Card Types Supported
```
[card]                        → Default white card
[card type="highlight"]       → Purple gradient card
[card type="info"]            → Blue info card
[card type="warning"]         → Yellow warning card
[card type="success"]         → Green success card
[card bg="https://..."]       → Background image card
```

### Email Customization
-  Header: Logo or text
-  Body background color
-  Footer text
-  Social media links (Facebook, Instagram, Twitter, LinkedIn)
-  Stored in `woonoow_notification_settings[email_appearance]`

### Default Templates Updated
-  order_placed_email - Multi-card layout
-  order_processing_email - Success card + summary
-  Other templates ready to update

---

**Architecture:**
```
Content with [card] tags
    ↓
parse_cards()
    ↓
render_card() × N
    ↓
base.html template
    ↓
Beautiful HTML email! 🎨
```

**Next:** Settings UI + Live Preview 🚀
2025-11-12 23:14:00 +07:00
dwindown
30384464a1 feat: Custom email system foundation
##  Step 1-3: Email System Core

### EmailManager.php
-  Disables WooCommerce emails (prevents duplicates)
-  Hooks into all WC order status changes
-  Hooks into customer, product events
-  Checks if events are enabled before sending
-  Sends via wp_mail() (SMTP plugin compatible)

### EmailRenderer.php
-  Renders emails with design templates
-  Variable replacement system
-  Gets recipient email (staff/customer)
-  Loads order/product/customer variables
-  Filter hook: `woonoow_email_template`
-  Supports HTML template designs

### Email Design Templates (3)
**templates/emails/modern.html**
-  Clean, minimalist, Apple-inspired
-  Dark mode support
-  Mobile responsive
-  2024 design trends

**templates/emails/classic.html**
-  Professional, traditional
-  Gradient header
-  Table styling
-  Business-appropriate

**templates/emails/minimal.html**
-  Ultra-clean, monospace font
-  Black & white aesthetic
-  Text-focused
-  Dark mode invert

### Architecture
```
Design Template (HTML) → Content Template (Text) → Final Email
   modern.html        →  order_processing      →  Beautiful HTML
```

---

**Next:** Rich text editor + Content templates 🎨
2025-11-12 18:48:55 +07:00