diff --git a/admin-spa/src/components/EmailBuilder/BlockRenderer.tsx b/admin-spa/src/components/EmailBuilder/BlockRenderer.tsx index 0ebec45..b91b15e 100644 --- a/admin-spa/src/components/EmailBuilder/BlockRenderer.tsx +++ b/admin-spa/src/components/EmailBuilder/BlockRenderer.tsx @@ -24,6 +24,15 @@ export function BlockRenderer({ isLast }: BlockRendererProps) { + // Prevent navigation in builder + const handleClick = (e: React.MouseEvent) => { + const target = e.target as HTMLElement; + if (target.tagName === 'A' || target.tagName === 'BUTTON' || target.closest('a') || target.closest('button')) { + e.preventDefault(); + e.stopPropagation(); + } + }; + const renderBlockContent = () => { switch (block.type) { case 'card': @@ -119,7 +128,7 @@ export function BlockRenderer({ }; return ( -
+
{/* Block Content */}
{renderBlockContent()} diff --git a/admin-spa/src/components/ui/rich-text-editor.tsx b/admin-spa/src/components/ui/rich-text-editor.tsx index 6e4e04e..7e7e655 100644 --- a/admin-spa/src/components/ui/rich-text-editor.tsx +++ b/admin-spa/src/components/ui/rich-text-editor.tsx @@ -75,6 +75,14 @@ export function RichTextEditor({ class: 'prose prose-sm max-w-none focus:outline-none min-h-[200px] px-4 py-3 [&_h1]:text-3xl [&_h1]:font-bold [&_h1]:mt-4 [&_h1]:mb-2 [&_h2]:text-2xl [&_h2]:font-bold [&_h2]:mt-3 [&_h2]:mb-2 [&_h3]:text-xl [&_h3]:font-bold [&_h3]:mt-2 [&_h3]:mb-1 [&_h4]:text-lg [&_h4]:font-bold [&_h4]:mt-2 [&_h4]:mb-1', }, + handleClick: (view, pos, event) => { + const target = event.target as HTMLElement; + if (target.tagName === 'A' || target.closest('a')) { + event.preventDefault(); + return true; + } + return false; + }, }, }); diff --git a/admin-spa/src/lib/wp-media.ts b/admin-spa/src/lib/wp-media.ts index c8f3903..bc8a7ef 100644 --- a/admin-spa/src/lib/wp-media.ts +++ b/admin-spa/src/lib/wp-media.ts @@ -66,17 +66,11 @@ export function openWPMedia( // Check if WordPress media is available if (typeof window.wp === 'undefined' || typeof window.wp.media === 'undefined') { console.error('WordPress media library is not available'); + console.error('window.wp:', typeof window.wp); + console.error('window.wp.media:', typeof (window as any).wp?.media); - // Fallback to URL prompt - const url = window.prompt('WordPress Media library is not loaded. Please enter image URL:'); - if (url) { - onSelect({ - url, - id: 0, - title: 'External Image', - filename: url.split('/').pop() || 'image', - }); - } + // Show error message + alert('WordPress Media library is not loaded.\n\nPlease ensure you are in WordPress admin and the page has fully loaded.\n\nIf the problem persists, try refreshing the page.'); return; } diff --git a/includes/Admin/Assets.php b/includes/Admin/Assets.php index ef23565..30abeeb 100644 --- a/includes/Admin/Assets.php +++ b/includes/Admin/Assets.php @@ -16,6 +16,9 @@ class Assets { return; } + // Enqueue WordPress Media library for image uploads + wp_enqueue_media(); + // Decide dev vs prod $is_dev = self::is_dev_mode(); if ($is_dev) { diff --git a/includes/Core/Notifications/TemplateProvider.php b/includes/Core/Notifications/TemplateProvider.php index 0df71a7..225198a 100644 --- a/includes/Core/Notifications/TemplateProvider.php +++ b/includes/Core/Notifications/TemplateProvider.php @@ -160,9 +160,7 @@ class TemplateProvider { Phone: {customer_phone}

[/card] -[card] -

View Order Details

-[/card]', 'woonoow'), +[button link="{order_url}" style="solid"]View Order Details[/button]', 'woonoow'), 'variables' => self::get_order_variables(), 'wc_email_id' => 'WC_Email_New_Order', ], @@ -183,11 +181,12 @@ class TemplateProvider {

Total: {order_total}

Payment: {payment_method}

-{order_items} +{order_items_table} [/card] +[button link="{order_url}" style="solid"]Track Your Order[/button] + [card] -

Track Your Order

Questions? Reply to this email or contact us.

[/card]', 'woonoow'), 'variables' => self::get_order_variables(), @@ -292,8 +291,10 @@ class TemplateProvider { 'order_status' => __('Order Status', 'woonoow'), 'order_date' => __('Order Date', 'woonoow'), 'order_url' => __('Order URL', 'woonoow'), - 'order_items' => __('Order Items (formatted table)', 'woonoow'), + 'order_items_list' => __('Order Items (formatted list)', 'woonoow'), + 'order_items_table' => __('Order Items (formatted table)', 'woonoow'), 'payment_method' => __('Payment Method', 'woonoow'), + 'payment_url' => __('Payment URL (for pending payments)', 'woonoow'), 'shipping_method' => __('Shipping Method', 'woonoow'), 'tracking_number' => __('Tracking Number', 'woonoow'), 'refund_amount' => __('Refund Amount', 'woonoow'),