| 1 |
<?php |
| 2 |
/** |
| 3 |
* MxChat Admin Settings Page - Redesigned with Sidebar Navigation |
| 4 |
* |
| 5 |
* @package MxChat |
| 6 |
* @since 2.7.0 |
| 7 |
*/ |
| 8 |
|
| 9 |
if (!defined('ABSPATH')) { |
| 10 |
exit; |
| 11 |
} |
| 12 |
|
| 13 |
/** |
| 14 |
* Render the new sidebar-based admin settings page |
| 15 |
*/ |
| 16 |
function mxchat_render_settings_page($admin_instance) { |
| 17 |
$is_activated = $admin_instance->is_activated(); |
| 18 |
$options = get_option('mxchat_options', array()); |
| 19 |
$plugin_url = plugin_dir_url(dirname(__FILE__)); |
| 20 |
?> |
| 21 |
<div class="mxch-admin-wrapper"> |
| 22 |
<!-- Mobile Header --> |
| 23 |
<header class="mxch-mobile-header"> |
| 24 |
<a href="#" class="mxch-mobile-logo"> |
| 25 |
<div class="mxch-mobile-logo-icon"> |
| 26 |
<img src="<?php echo esc_url($plugin_url . 'images/icon-128x128.png'); ?>" alt="MxChat"> |
| 27 |
</div> |
| 28 |
<span class="mxch-mobile-logo-text">MxChat</span> |
| 29 |
</a> |
| 30 |
<button type="button" class="mxch-mobile-menu-btn" aria-label="<?php esc_attr_e('Open menu', 'mxchat'); ?>"> |
| 31 |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg> |
| 32 |
</button> |
| 33 |
</header> |
| 34 |
|
| 35 |
<!-- Mobile Menu Overlay --> |
| 36 |
<div class="mxch-mobile-overlay"></div> |
| 37 |
|
| 38 |
<!-- Mobile Menu Modal --> |
| 39 |
<div class="mxch-mobile-menu"> |
| 40 |
<div class="mxch-mobile-menu-header"> |
| 41 |
<span class="mxch-mobile-menu-title"><?php esc_html_e('Settings', 'mxchat'); ?></span> |
| 42 |
<button type="button" class="mxch-mobile-menu-close" aria-label="<?php esc_attr_e('Close menu', 'mxchat'); ?>"> |
| 43 |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg> |
| 44 |
</button> |
| 45 |
</div> |
| 46 |
<nav class="mxch-mobile-menu-nav"> |
| 47 |
<!-- Configuration Section --> |
| 48 |
<div class="mxch-mobile-nav-section"> |
| 49 |
<div class="mxch-mobile-nav-section-title"><?php esc_html_e('Configuration', 'mxchat'); ?></div> |
| 50 |
<button class="mxch-mobile-nav-link" data-parent="chatbot"> |
| 51 |
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 8V4H8"/><rect width="16" height="12" x="4" y="8" rx="2"/><path d="M2 14h2"/><path d="M20 14h2"/><path d="M15 13v2"/><path d="M9 13v2"/></svg> |
| 52 |
<span><?php esc_html_e('Chatbot', 'mxchat'); ?></span> |
| 53 |
<svg class="mxch-mobile-nav-arrow" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"></polyline></svg> |
| 54 |
</button> |
| 55 |
<div class="mxch-mobile-nav-sub" data-parent="chatbot"> |
| 56 |
<button class="mxch-mobile-nav-sub-link active" data-target="chatbot-ai-models"><?php esc_html_e('AI Models', 'mxchat'); ?></button> |
| 57 |
<button class="mxch-mobile-nav-sub-link" data-target="chatbot-behavior"><?php esc_html_e('Behavior', 'mxchat'); ?></button> |
| 58 |
<button class="mxch-mobile-nav-sub-link" data-target="chatbot-display"><?php esc_html_e('Display', 'mxchat'); ?></button> |
| 59 |
<button class="mxch-mobile-nav-sub-link" data-target="chatbot-lead-capture"><?php esc_html_e('Lead Capture', 'mxchat'); ?></button> |
| 60 |
<button class="mxch-mobile-nav-sub-link" data-target="chatbot-quick-questions"><?php esc_html_e('Quick Questions', 'mxchat'); ?></button> |
| 61 |
<button class="mxch-mobile-nav-sub-link" data-target="chatbot-rate-limits"><?php esc_html_e('Rate Limits', 'mxchat'); ?></button> |
| 62 |
</div> |
| 63 |
<button class="mxch-mobile-nav-link" data-target="api-keys"> |
| 64 |
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21 2-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0 3 3L22 7l-3-3m-3.5 3.5L19 4"/></svg> |
| 65 |
<span><?php esc_html_e('API Keys', 'mxchat'); ?></span> |
| 66 |
</button> |
| 67 |
<button class="mxch-mobile-nav-link" data-target="optimization"> |
| 68 |
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg> |
| 69 |
<span><?php esc_html_e('Optimization', 'mxchat'); ?></span> |
| 70 |
</button> |
| 71 |
<button class="mxch-mobile-nav-link" data-target="testing"> |
| 72 |
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 2v6"/><path d="M15 2v6"/><path d="M12 17v5"/><path d="M5 8h14"/><path d="M6 11v-1a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v1"/><path d="m9 14 3 3 3-3"/></svg> |
| 73 |
<span><?php esc_html_e('Testing', 'mxchat'); ?></span> |
| 74 |
</button> |
| 75 |
</div> |
| 76 |
<!-- Integrations Section --> |
| 77 |
<div class="mxch-mobile-nav-section"> |
| 78 |
<div class="mxch-mobile-nav-section-title"><?php esc_html_e('Integrations', 'mxchat'); ?></div> |
| 79 |
<button class="mxch-mobile-nav-link" data-parent="integrations"> |
| 80 |
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg> |
| 81 |
<span><?php esc_html_e('Integrations', 'mxchat'); ?></span> |
| 82 |
<svg class="mxch-mobile-nav-arrow" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"></polyline></svg> |
| 83 |
</button> |
| 84 |
<div class="mxch-mobile-nav-sub" data-parent="integrations"> |
| 85 |
<button class="mxch-mobile-nav-sub-link" data-target="integrations-toolbar"><?php esc_html_e('Toolbar', 'mxchat'); ?></button> |
| 86 |
<button class="mxch-mobile-nav-sub-link" data-target="integrations-loops"><?php esc_html_e('Loops', 'mxchat'); ?></button> |
| 87 |
<button class="mxch-mobile-nav-sub-link" data-target="integrations-brave"><?php esc_html_e('Brave Search', 'mxchat'); ?></button> |
| 88 |
<button class="mxch-mobile-nav-sub-link" data-target="integrations-slack"><?php esc_html_e('Slack', 'mxchat'); ?></button> |
| 89 |
<button class="mxch-mobile-nav-sub-link" data-target="integrations-telegram"><?php esc_html_e('Telegram', 'mxchat'); ?></button> |
| 90 |
</div> |
| 91 |
</div> |
| 92 |
<!-- Resources Section --> |
| 93 |
<div class="mxch-mobile-nav-section"> |
| 94 |
<div class="mxch-mobile-nav-section-title"><?php esc_html_e('Resources', 'mxchat'); ?></div> |
| 95 |
<button class="mxch-mobile-nav-link" data-target="tutorials"> |
| 96 |
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="23 7 16 12 23 17 23 7"/><rect x="1" y="5" width="15" height="14" rx="2" ry="2"/></svg> |
| 97 |
<span><?php esc_html_e('Tutorials', 'mxchat'); ?></span> |
| 98 |
</button> |
| 99 |
</div> |
| 100 |
<?php if (!$is_activated): ?> |
| 101 |
<div class="mxch-mobile-menu-footer"> |
| 102 |
<a href="https://mxchat.ai/" target="_blank" class="mxch-mobile-upgrade-btn"> |
| 103 |
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 9H4.5a2.5 2.5 0 0 1 0-5H6"/><path d="M18 9h1.5a2.5 2.5 0 0 0 0-5H18"/><path d="M4 22h16"/><path d="M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20.24 7 22"/><path d="M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20.24 17 22"/><path d="M18 2H6v7a6 6 0 0 0 12 0V2Z"/></svg> |
| 104 |
<?php esc_html_e('Upgrade to Pro', 'mxchat'); ?> |
| 105 |
</a> |
| 106 |
</div> |
| 107 |
<?php endif; ?> |
| 108 |
</nav> |
| 109 |
</div> |
| 110 |
|
| 111 |
<!-- Sidebar Navigation --> |
| 112 |
<aside class="mxch-sidebar"> |
| 113 |
<div class="mxch-sidebar-header"> |
| 114 |
<a href="#" class="mxch-sidebar-logo"> |
| 115 |
<div class="mxch-sidebar-logo-icon"> |
| 116 |
<img src="<?php echo esc_url($plugin_url . 'images/icon-128x128.png'); ?>" alt="MxChat"> |
| 117 |
</div> |
| 118 |
<span class="mxch-sidebar-logo-text">MxChat</span> |
| 119 |
<span class="mxch-sidebar-version">v<?php echo esc_html(MXCHAT_VERSION ?? '2.7.0'); ?></span> |
| 120 |
</a> |
| 121 |
</div> |
| 122 |
|
| 123 |
<nav class="mxch-sidebar-nav"> |
| 124 |
<!-- Chatbot Section --> |
| 125 |
<div class="mxch-nav-section"> |
| 126 |
<div class="mxch-nav-section-title"><?php esc_html_e('Configuration', 'mxchat'); ?></div> |
| 127 |
|
| 128 |
<div class="mxch-nav-item expanded" data-section="chatbot"> |
| 129 |
<button class="mxch-nav-link active"> |
| 130 |
<span class="mxch-nav-link-icon"> |
| 131 |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 8V4H8"/><rect width="16" height="12" x="4" y="8" rx="2"/><path d="M2 14h2"/><path d="M20 14h2"/><path d="M15 13v2"/><path d="M9 13v2"/></svg> |
| 132 |
</span> |
| 133 |
<span class="mxch-nav-link-text"><?php esc_html_e('Chatbot', 'mxchat'); ?></span> |
| 134 |
<svg class="mxch-nav-link-arrow" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"></polyline></svg> |
| 135 |
</button> |
| 136 |
<div class="mxch-nav-sub"> |
| 137 |
<button class="mxch-nav-sub-link active" data-target="chatbot-ai-models"><?php esc_html_e('AI Models', 'mxchat'); ?></button> |
| 138 |
<button class="mxch-nav-sub-link" data-target="chatbot-behavior"><?php esc_html_e('Behavior', 'mxchat'); ?></button> |
| 139 |
<button class="mxch-nav-sub-link" data-target="chatbot-display"><?php esc_html_e('Display', 'mxchat'); ?></button> |
| 140 |
<button class="mxch-nav-sub-link" data-target="chatbot-lead-capture"><?php esc_html_e('Lead Capture', 'mxchat'); ?></button> |
| 141 |
<button class="mxch-nav-sub-link" data-target="chatbot-quick-questions"><?php esc_html_e('Quick Questions', 'mxchat'); ?></button> |
| 142 |
<button class="mxch-nav-sub-link" data-target="chatbot-rate-limits"><?php esc_html_e('Rate Limits', 'mxchat'); ?></button> |
| 143 |
</div> |
| 144 |
</div> |
| 145 |
|
| 146 |
<div class="mxch-nav-item" data-section="api-keys"> |
| 147 |
<button class="mxch-nav-link" data-target="api-keys"> |
| 148 |
<span class="mxch-nav-link-icon"> |
| 149 |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21 2-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0 3 3L22 7l-3-3m-3.5 3.5L19 4"/></svg> |
| 150 |
</span> |
| 151 |
<span class="mxch-nav-link-text"><?php esc_html_e('API Keys', 'mxchat'); ?></span> |
| 152 |
</button> |
| 153 |
</div> |
| 154 |
|
| 155 |
<div class="mxch-nav-item" data-section="optimization"> |
| 156 |
<button class="mxch-nav-link" data-target="optimization"> |
| 157 |
<span class="mxch-nav-link-icon"> |
| 158 |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg> |
| 159 |
</span> |
| 160 |
<span class="mxch-nav-link-text"><?php esc_html_e('Optimization', 'mxchat'); ?></span> |
| 161 |
</button> |
| 162 |
</div> |
| 163 |
|
| 164 |
<div class="mxch-nav-item" data-section="testing"> |
| 165 |
<button class="mxch-nav-link" data-target="testing"> |
| 166 |
<span class="mxch-nav-link-icon"> |
| 167 |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 2v6"/><path d="M15 2v6"/><path d="M12 17v5"/><path d="M5 8h14"/><path d="M6 11v-1a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v1"/><path d="m9 14 3 3 3-3"/></svg> |
| 168 |
</span> |
| 169 |
<span class="mxch-nav-link-text"><?php esc_html_e('Testing', 'mxchat'); ?></span> |
| 170 |
</button> |
| 171 |
</div> |
| 172 |
</div> |
| 173 |
|
| 174 |
<!-- Integrations Section --> |
| 175 |
<div class="mxch-nav-section"> |
| 176 |
<div class="mxch-nav-section-title"><?php esc_html_e('Integrations', 'mxchat'); ?></div> |
| 177 |
|
| 178 |
<div class="mxch-nav-item" data-section="integrations"> |
| 179 |
<button class="mxch-nav-link"> |
| 180 |
<span class="mxch-nav-link-icon"> |
| 181 |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg> |
| 182 |
</span> |
| 183 |
<span class="mxch-nav-link-text"><?php esc_html_e('Integrations', 'mxchat'); ?></span> |
| 184 |
<svg class="mxch-nav-link-arrow" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 18 15 12 9 6"></polyline></svg> |
| 185 |
</button> |
| 186 |
<div class="mxch-nav-sub"> |
| 187 |
<button class="mxch-nav-sub-link" data-target="integrations-toolbar"><?php esc_html_e('Toolbar', 'mxchat'); ?></button> |
| 188 |
<button class="mxch-nav-sub-link" data-target="integrations-loops"><?php esc_html_e('Loops', 'mxchat'); ?></button> |
| 189 |
<button class="mxch-nav-sub-link" data-target="integrations-brave"><?php esc_html_e('Brave Search', 'mxchat'); ?></button> |
| 190 |
<button class="mxch-nav-sub-link" data-target="integrations-slack"><?php esc_html_e('Slack', 'mxchat'); ?></button> |
| 191 |
<button class="mxch-nav-sub-link" data-target="integrations-telegram"><?php esc_html_e('Telegram', 'mxchat'); ?></button> |
| 192 |
</div> |
| 193 |
</div> |
| 194 |
</div> |
| 195 |
|
| 196 |
<!-- Resources Section --> |
| 197 |
<div class="mxch-nav-section"> |
| 198 |
<div class="mxch-nav-section-title"><?php esc_html_e('Resources', 'mxchat'); ?></div> |
| 199 |
|
| 200 |
<div class="mxch-nav-item" data-section="tutorials"> |
| 201 |
<button class="mxch-nav-link" data-target="tutorials"> |
| 202 |
<span class="mxch-nav-link-icon"> |
| 203 |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="23 7 16 12 23 17 23 7"/><rect x="1" y="5" width="15" height="14" rx="2" ry="2"/></svg> |
| 204 |
</span> |
| 205 |
<span class="mxch-nav-link-text"><?php esc_html_e('Tutorials', 'mxchat'); ?></span> |
| 206 |
</button> |
| 207 |
</div> |
| 208 |
</div> |
| 209 |
|
| 210 |
</nav> |
| 211 |
|
| 212 |
<?php if (!$is_activated): ?> |
| 213 |
<div class="mxch-sidebar-footer"> |
| 214 |
<a href="https://mxchat.ai/" target="_blank" class="mxch-sidebar-upgrade-v2"> |
| 215 |
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg> |
| 216 |
<?php esc_html_e('Pro Upgrade', 'mxchat'); ?> |
| 217 |
</a> |
| 218 |
</div> |
| 219 |
<?php endif; ?> |
| 220 |
</aside> |
| 221 |
|
| 222 |
<!-- Main Content Area --> |
| 223 |
<main class="mxch-content"> |
| 224 |
<?php if (!$is_activated): ?> |
| 225 |
<div class="mxch-pro-banner"> |
| 226 |
<div class="mxch-pro-banner-content"> |
| 227 |
<h3 class="mxch-pro-banner-title"><?php esc_html_e('Stop paying $50–200/month for AI chatbot tools.', 'mxchat'); ?></h3> |
| 228 |
<p class="mxch-pro-banner-text"><?php esc_html_e('One payment unlocks every MxChat Pro add-on for life — MCP server access for Claude / ChatGPT / Claude Code, WooCommerce sales, Google Search Console insights, AI-generated chatbot themes, lead-capture forms, unlimited bots, image analysis, and more. No renewals. No surprise bills.', 'mxchat'); ?></p> |
| 229 |
</div> |
| 230 |
<a href="https://mxchat.ai/" target="_blank" class="mxch-pro-banner-btn"><span><?php esc_html_e('Get Lifetime Access →', 'mxchat'); ?></span></a> |
| 231 |
</div> |
| 232 |
<?php endif; ?> |
| 233 |
|
| 234 |
<?php |
| 235 |
// Show theme migration notice for Pro users |
| 236 |
$admin_instance->show_theme_migration_banner(); |
| 237 |
?> |
| 238 |
|
| 239 |
<!-- ======================================== |
| 240 |
CHATBOT - AI MODELS |
| 241 |
======================================== --> |
| 242 |
<div id="chatbot-ai-models" class="mxch-section active"> |
| 243 |
<div class="mxch-content-header"> |
| 244 |
<h1 class="mxch-content-title"><?php esc_html_e('AI Models', 'mxchat'); ?></h1> |
| 245 |
<p class="mxch-content-subtitle"><?php esc_html_e('Configure the AI models your chatbot will use for conversations and embeddings.', 'mxchat'); ?></p> |
| 246 |
</div> |
| 247 |
|
| 248 |
<div class="mxch-card"> |
| 249 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 250 |
<?php |
| 251 |
// Chat Model |
| 252 |
mxchat_render_field_wrapper('model', __('Chat Model', 'mxchat'), function() use ($admin_instance) { |
| 253 |
$admin_instance->mxchat_model_callback(); |
| 254 |
}, __('Select the AI model your chatbot will use for conversations.', 'mxchat')); |
| 255 |
|
| 256 |
// Embedding Model |
| 257 |
mxchat_render_field_wrapper('embedding_model', __('Embedding Model', 'mxchat'), function() use ($admin_instance) { |
| 258 |
$admin_instance->embedding_model_callback(); |
| 259 |
}, __('Vector embedding model for knowledge base matching. Changing models requires reconfiguring knowledge data.', 'mxchat')); |
| 260 |
|
| 261 |
// Enable Streaming |
| 262 |
mxchat_render_field_wrapper('enable_streaming', __('Enable Streaming', 'mxchat'), function() use ($admin_instance) { |
| 263 |
$admin_instance->enable_streaming_toggle_callback(); |
| 264 |
}, __('Enable real-time streaming responses for supported models (OpenAI, Claude, DeepSeek, Grok).', 'mxchat')); |
| 265 |
|
| 266 |
// Enable Web Search (OpenAI only) |
| 267 |
mxchat_render_field_wrapper('enable_web_search', __('Enable Web Search', 'mxchat'), function() use ($admin_instance) { |
| 268 |
$admin_instance->enable_web_search_toggle_callback(); |
| 269 |
}, __('Allow the chatbot to search the web for current information (OpenAI models only).', 'mxchat')); |
| 270 |
?> |
| 271 |
</div> |
| 272 |
</div> |
| 273 |
</div> |
| 274 |
|
| 275 |
<!-- ======================================== |
| 276 |
CHATBOT - BEHAVIOR |
| 277 |
======================================== --> |
| 278 |
<div id="chatbot-behavior" class="mxch-section"> |
| 279 |
<div class="mxch-content-header"> |
| 280 |
<h1 class="mxch-content-title"><?php esc_html_e('Behavior', 'mxchat'); ?></h1> |
| 281 |
<p class="mxch-content-subtitle"><?php esc_html_e('Control how your AI chatbot responds and processes queries.', 'mxchat'); ?></p> |
| 282 |
</div> |
| 283 |
|
| 284 |
<div class="mxch-card"> |
| 285 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 286 |
<?php |
| 287 |
// AI Instructions |
| 288 |
mxchat_render_field_wrapper('system_prompt_instructions', __('AI Instructions (Behavior)', 'mxchat'), function() use ($admin_instance) { |
| 289 |
$admin_instance->system_prompt_instructions_callback(); |
| 290 |
}, __('Provide system-level instructions to guide the AI\'s behavior and responses.', 'mxchat')); |
| 291 |
|
| 292 |
// Similarity Threshold |
| 293 |
mxchat_render_field_wrapper('similarity_threshold', __('Similarity Threshold', 'mxchat'), function() use ($admin_instance) { |
| 294 |
$admin_instance->mxchat_similarity_threshold_callback(); |
| 295 |
}, __('Adjust threshold for content matching. Lower values = more matches, higher values = stricter matching.', 'mxchat')); |
| 296 |
|
| 297 |
// RAG Sources Limit |
| 298 |
mxchat_render_field_wrapper('rag_sources_limit', __('RAG Sources Limit', 'mxchat'), function() use ($admin_instance) { |
| 299 |
$admin_instance->mxchat_rag_sources_limit_callback(); |
| 300 |
}, __('Number of knowledge base sources (pages/documents) to include in AI context. Higher values provide more context but use more tokens.', 'mxchat')); |
| 301 |
|
| 302 |
// RAG Chunks Limit |
| 303 |
mxchat_render_field_wrapper('rag_chunks_limit', __('RAG Chunks Limit', 'mxchat'), function() use ($admin_instance) { |
| 304 |
$admin_instance->mxchat_rag_chunks_limit_callback(); |
| 305 |
}, __('Maximum total content chunks sent to the AI across all sources. Higher values provide more context but increase token usage and cost.', 'mxchat')); |
| 306 |
|
| 307 |
// Contextual Awareness |
| 308 |
mxchat_render_field_wrapper('contextual_awareness', __('Contextual Awareness', 'mxchat'), function() use ($admin_instance) { |
| 309 |
$admin_instance->mxchat_contextual_awareness_callback(); |
| 310 |
}, __('Allow the chatbot to understand and reference the current page content for more relevant responses.', 'mxchat')); |
| 311 |
|
| 312 |
// Citation Links |
| 313 |
mxchat_render_field_wrapper('citation_links', __('Citation Links', 'mxchat'), function() use ($admin_instance) { |
| 314 |
$admin_instance->mxchat_citation_links_toggle_callback(); |
| 315 |
}, __('Allow the AI to include citation links from your knowledge database in responses. If disabled, ensure your AI Behavior settings do not mention links or the AI may fabricate URLs.', 'mxchat')); |
| 316 |
|
| 317 |
// Satisfaction Rating Prompt |
| 318 |
// The toggle callback inline-renders the 5 customization |
| 319 |
// fields inside a single sub-options wrapper (plan-29caac). |
| 320 |
// No separate customization group needed — the wrapper handles |
| 321 |
// its own server-side display state based on the toggle value. |
| 322 |
mxchat_render_field_wrapper('satisfaction_rating', __('Satisfaction Rating Prompt', 'mxchat'), function() use ($admin_instance) { |
| 323 |
$admin_instance->mxchat_satisfaction_rating_toggle_callback(); |
| 324 |
}, __('Show a 👍 / 👎 prompt after a conversation has had a couple of bot replies and the visitor has been idle for a moment. Disable to hide the prompt site-wide.', 'mxchat')); |
| 325 |
?> |
| 326 |
</div> |
| 327 |
</div> |
| 328 |
</div> |
| 329 |
|
| 330 |
<!-- ======================================== |
| 331 |
CHATBOT - DISPLAY |
| 332 |
======================================== --> |
| 333 |
<div id="chatbot-display" class="mxch-section"> |
| 334 |
<div class="mxch-content-header"> |
| 335 |
<h1 class="mxch-content-title"><?php esc_html_e('Display Settings', 'mxchat'); ?></h1> |
| 336 |
<p class="mxch-content-subtitle"><?php esc_html_e('Customize how and where your chatbot appears on your website.', 'mxchat'); ?></p> |
| 337 |
</div> |
| 338 |
|
| 339 |
<div class="mxch-card"> |
| 340 |
<div class="mxch-card-header"> |
| 341 |
<h3 class="mxch-card-title"> |
| 342 |
<svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><line x1="3" y1="9" x2="21" y2="9"/><line x1="9" y1="21" x2="9" y2="9"/></svg> |
| 343 |
<?php esc_html_e('Visibility', 'mxchat'); ?> |
| 344 |
</h3> |
| 345 |
</div> |
| 346 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 347 |
<?php |
| 348 |
// Auto-Display |
| 349 |
mxchat_render_field_wrapper('auto_display', __('Auto-Display Chatbot', 'mxchat'), function() use ($admin_instance) { |
| 350 |
$admin_instance->mxchat_append_to_body_callback(); |
| 351 |
}, __('Show chatbot automatically on all pages. Disable to use shortcode [mxchat_chatbot floating="yes"] for floating widget or [mxchat_chatbot floating="no"] for embedded chat.', 'mxchat')); |
| 352 |
|
| 353 |
// Open Links in New Tab |
| 354 |
mxchat_render_field_wrapper('link_target', __('Open Links in New Tab', 'mxchat'), function() use ($admin_instance) { |
| 355 |
$admin_instance->mxchat_link_target_toggle_callback(); |
| 356 |
}, __('Open links clicked in chat responses in a new browser tab.', 'mxchat')); |
| 357 |
|
| 358 |
// Chat Persistence |
| 359 |
mxchat_render_field_wrapper('chat_persistence', __('Chat Persistence', 'mxchat'), function() use ($admin_instance) { |
| 360 |
$admin_instance->mxchat_chat_persistence_toggle_callback(); |
| 361 |
}, __('Keep chat history when users navigate or return within 24 hours.', 'mxchat')); |
| 362 |
?> |
| 363 |
</div> |
| 364 |
</div> |
| 365 |
|
| 366 |
<div class="mxch-card"> |
| 367 |
<div class="mxch-card-header"> |
| 368 |
<h3 class="mxch-card-title"> |
| 369 |
<svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg> |
| 370 |
<?php esc_html_e('Text & Labels', 'mxchat'); ?> |
| 371 |
</h3> |
| 372 |
</div> |
| 373 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 374 |
<?php |
| 375 |
// Top Bar Title |
| 376 |
mxchat_render_field_wrapper('top_bar_title', __('Top Bar Title', 'mxchat'), function() use ($admin_instance) { |
| 377 |
$admin_instance->mxchat_top_bar_title_callback(); |
| 378 |
}, __('Title text shown in the chatbot header.', 'mxchat')); |
| 379 |
|
| 380 |
// AI Agent Text |
| 381 |
mxchat_render_field_wrapper('ai_agent_text', __('AI Agent Text', 'mxchat'), function() use ($admin_instance) { |
| 382 |
$admin_instance->mxchat_ai_agent_text_callback(); |
| 383 |
}, __('Text shown for AI agents in the status indicator.', 'mxchat')); |
| 384 |
|
| 385 |
// Intro Message |
| 386 |
mxchat_render_field_wrapper('intro_message', __('Introductory Message', 'mxchat'), function() use ($admin_instance) { |
| 387 |
$admin_instance->mxchat_intro_message_callback(); |
| 388 |
}, __('First message shown when chat opens. HTML allowed.', 'mxchat')); |
| 389 |
|
| 390 |
// Input Placeholder |
| 391 |
mxchat_render_field_wrapper('input_copy', __('Input Placeholder', 'mxchat'), function() use ($admin_instance) { |
| 392 |
$admin_instance->mxchat_input_copy_callback(); |
| 393 |
}, __('Placeholder text in the chat input field.', 'mxchat')); |
| 394 |
|
| 395 |
// Chat Teaser |
| 396 |
mxchat_render_field_wrapper('pre_chat_message', __('Chat Teaser Pop-up', 'mxchat'), function() use ($admin_instance) { |
| 397 |
$admin_instance->mxchat_pre_chat_message_callback(); |
| 398 |
}, __('Message shown before users start chatting.', 'mxchat')); |
| 399 |
?> |
| 400 |
</div> |
| 401 |
</div> |
| 402 |
</div> |
| 403 |
|
| 404 |
<!-- ======================================== |
| 405 |
CHATBOT - LEAD CAPTURE |
| 406 |
======================================== --> |
| 407 |
<div id="chatbot-lead-capture" class="mxch-section"> |
| 408 |
<div class="mxch-content-header"> |
| 409 |
<h1 class="mxch-content-title"><?php esc_html_e('Lead Capture', 'mxchat'); ?></h1> |
| 410 |
<p class="mxch-content-subtitle"><?php esc_html_e('Collect user information and manage privacy settings.', 'mxchat'); ?></p> |
| 411 |
</div> |
| 412 |
|
| 413 |
<div class="mxch-card"> |
| 414 |
<div class="mxch-card-header"> |
| 415 |
<h3 class="mxch-card-title"> |
| 416 |
<svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"/></svg> |
| 417 |
<?php esc_html_e('Email Capture', 'mxchat'); ?> |
| 418 |
</h3> |
| 419 |
</div> |
| 420 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 421 |
<?php |
| 422 |
// Require Email |
| 423 |
mxchat_render_field_wrapper('enable_email_block', __('Require Email to Chat', 'mxchat'), function() use ($admin_instance) { |
| 424 |
$admin_instance->enable_email_block_callback(); |
| 425 |
}, __('Require users to enter their email before chatting. Shows for non-logged-in users.', 'mxchat')); |
| 426 |
|
| 427 |
// Email Form Content |
| 428 |
mxchat_render_field_wrapper('email_blocker_header', __('Email Form Content', 'mxchat'), function() use ($admin_instance) { |
| 429 |
$admin_instance->email_blocker_header_content_callback(); |
| 430 |
}, __('HTML content shown above the email form.', 'mxchat')); |
| 431 |
|
| 432 |
// Email Button Text |
| 433 |
mxchat_render_field_wrapper('email_blocker_button', __('Submit Button Text', 'mxchat'), function() use ($admin_instance) { |
| 434 |
$admin_instance->email_blocker_button_text_callback(); |
| 435 |
}, __('Text for the email form submit button.', 'mxchat')); |
| 436 |
|
| 437 |
// Require Name |
| 438 |
mxchat_render_field_wrapper('enable_name_field', __('Also Require Name', 'mxchat'), function() use ($admin_instance) { |
| 439 |
$admin_instance->enable_name_field_callback(); |
| 440 |
}, __('Also require users to enter their name with email.', 'mxchat')); |
| 441 |
|
| 442 |
// Name Placeholder |
| 443 |
mxchat_render_field_wrapper('name_placeholder', __('Name Field Placeholder', 'mxchat'), function() use ($admin_instance) { |
| 444 |
$admin_instance->name_field_placeholder_callback(); |
| 445 |
}, __('Placeholder text for the name input field.', 'mxchat')); |
| 446 |
?> |
| 447 |
</div> |
| 448 |
</div> |
| 449 |
|
| 450 |
<div class="mxch-card"> |
| 451 |
<div class="mxch-card-header"> |
| 452 |
<h3 class="mxch-card-title"> |
| 453 |
<svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg> |
| 454 |
<?php esc_html_e('Privacy & Compliance', 'mxchat'); ?> |
| 455 |
</h3> |
| 456 |
</div> |
| 457 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 458 |
<?php |
| 459 |
// Privacy Notice |
| 460 |
mxchat_render_field_wrapper('privacy_toggle', __('Privacy Notice', 'mxchat'), function() use ($admin_instance) { |
| 461 |
$admin_instance->mxchat_privacy_toggle_callback(); |
| 462 |
}, __('Show privacy notice below the chat widget.', 'mxchat')); |
| 463 |
|
| 464 |
// Complianz |
| 465 |
mxchat_render_field_wrapper('complianz_toggle', __('Complianz Integration', 'mxchat'), function() use ($admin_instance) { |
| 466 |
$admin_instance->mxchat_complianz_toggle_callback(); |
| 467 |
}, __('Apply Complianz consent logic to the chatbot (requires Complianz plugin).', 'mxchat')); |
| 468 |
?> |
| 469 |
</div> |
| 470 |
</div> |
| 471 |
</div> |
| 472 |
|
| 473 |
<!-- ======================================== |
| 474 |
CHATBOT - QUICK QUESTIONS |
| 475 |
======================================== --> |
| 476 |
<div id="chatbot-quick-questions" class="mxch-section"> |
| 477 |
<div class="mxch-content-header"> |
| 478 |
<h1 class="mxch-content-title"><?php esc_html_e('Quick Questions', 'mxchat'); ?></h1> |
| 479 |
<p class="mxch-content-subtitle"><?php esc_html_e('Pre-defined questions displayed above the chat input to help users get started.', 'mxchat'); ?></p> |
| 480 |
</div> |
| 481 |
|
| 482 |
<div class="mxch-card"> |
| 483 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 484 |
<?php |
| 485 |
// Quick Question 1 |
| 486 |
mxchat_render_field_wrapper('popular_question_1', __('Quick Question 1', 'mxchat'), function() use ($admin_instance) { |
| 487 |
$admin_instance->mxchat_popular_question_1_callback(); |
| 488 |
}); |
| 489 |
|
| 490 |
// Quick Question 2 |
| 491 |
mxchat_render_field_wrapper('popular_question_2', __('Quick Question 2', 'mxchat'), function() use ($admin_instance) { |
| 492 |
$admin_instance->mxchat_popular_question_2_callback(); |
| 493 |
}); |
| 494 |
|
| 495 |
// Quick Question 3 |
| 496 |
mxchat_render_field_wrapper('popular_question_3', __('Quick Question 3', 'mxchat'), function() use ($admin_instance) { |
| 497 |
$admin_instance->mxchat_popular_question_3_callback(); |
| 498 |
}); |
| 499 |
|
| 500 |
// Additional Questions |
| 501 |
mxchat_render_field_wrapper('additional_questions', __('Additional Questions', 'mxchat'), function() use ($admin_instance) { |
| 502 |
$admin_instance->mxchat_additional_popular_questions_callback(); |
| 503 |
}, __('Add as many quick questions as you need.', 'mxchat')); |
| 504 |
?> |
| 505 |
</div> |
| 506 |
</div> |
| 507 |
</div> |
| 508 |
|
| 509 |
<!-- ======================================== |
| 510 |
CHATBOT - RATE LIMITS |
| 511 |
======================================== --> |
| 512 |
<div id="chatbot-rate-limits" class="mxch-section"> |
| 513 |
<div class="mxch-content-header"> |
| 514 |
<h1 class="mxch-content-title"><?php esc_html_e('Rate Limits', 'mxchat'); ?></h1> |
| 515 |
<p class="mxch-content-subtitle"><?php esc_html_e('Set message limits for each user role to manage API usage.', 'mxchat'); ?></p> |
| 516 |
</div> |
| 517 |
|
| 518 |
<div class="mxch-notice mxch-notice-info" style="margin-bottom: 24px;"> |
| 519 |
<svg class="mxch-notice-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg> |
| 520 |
<div> |
| 521 |
<strong><?php esc_html_e('Placeholders available:', 'mxchat'); ?></strong> |
| 522 |
<code>{limit}</code>, <code>{timeframe}</code>, <code>{count}</code>, <code>{remaining}</code> |
| 523 |
<br> |
| 524 |
<strong><?php esc_html_e('Markdown links supported:', 'mxchat'); ?></strong> |
| 525 |
<code>[Link text](https://example.com)</code> |
| 526 |
</div> |
| 527 |
</div> |
| 528 |
|
| 529 |
<div class="mxch-card"> |
| 530 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 531 |
<?php |
| 532 |
// Render rate limits with accordion |
| 533 |
mxchat_render_rate_limits_accordion($admin_instance); |
| 534 |
?> |
| 535 |
</div> |
| 536 |
</div> |
| 537 |
</div> |
| 538 |
|
| 539 |
<!-- ======================================== |
| 540 |
API KEYS |
| 541 |
======================================== --> |
| 542 |
<div id="api-keys" class="mxch-section"> |
| 543 |
<div class="mxch-content-header"> |
| 544 |
<h1 class="mxch-content-title"><?php esc_html_e('API Keys', 'mxchat'); ?></h1> |
| 545 |
<p class="mxch-content-subtitle"><?php esc_html_e('Manage API keys for AI providers and integrations.', 'mxchat'); ?></p> |
| 546 |
</div> |
| 547 |
|
| 548 |
<div class="mxch-card"> |
| 549 |
<div class="mxch-card-header"> |
| 550 |
<h3 class="mxch-card-title"> |
| 551 |
<svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 8V4H8"/><rect width="16" height="12" x="4" y="8" rx="2"/><path d="M2 14h2"/><path d="M20 14h2"/><path d="M15 13v2"/><path d="M9 13v2"/></svg> |
| 552 |
<?php esc_html_e('AI Providers', 'mxchat'); ?> |
| 553 |
</h3> |
| 554 |
</div> |
| 555 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 556 |
<table class="form-table"> |
| 557 |
<?php do_settings_fields('mxchat-api-keys', 'mxchat_api_keys_section'); ?> |
| 558 |
</table> |
| 559 |
</div> |
| 560 |
</div> |
| 561 |
</div> |
| 562 |
|
| 563 |
<!-- ======================================== |
| 564 |
OPTIMIZATION |
| 565 |
======================================== --> |
| 566 |
<div id="optimization" class="mxch-section"> |
| 567 |
<div class="mxch-content-header"> |
| 568 |
<h1 class="mxch-content-title"><?php esc_html_e('Optimization & Diagnostics', 'mxchat'); ?></h1> |
| 569 |
<p class="mxch-content-subtitle"><?php esc_html_e('Optimize performance, debug issues, and manage plugin settings.', 'mxchat'); ?></p> |
| 570 |
</div> |
| 571 |
|
| 572 |
<!-- Script Loading Card --> |
| 573 |
<div class="mxch-card"> |
| 574 |
<div class="mxch-card-header"> |
| 575 |
<h3 class="mxch-card-title"> |
| 576 |
<svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg> |
| 577 |
<?php esc_html_e('Script Loading', 'mxchat'); ?> |
| 578 |
</h3> |
| 579 |
</div> |
| 580 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 581 |
<?php |
| 582 |
$script_loading_strategy = isset($options['script_loading_strategy']) ? $options['script_loading_strategy'] : 'default'; |
| 583 |
?> |
| 584 |
<div class="mxch-field"> |
| 585 |
<label class="mxch-field-label"><?php esc_html_e('Script Loading Strategy', 'mxchat'); ?></label> |
| 586 |
<div class="mxch-field-control"> |
| 587 |
<select name="mxchat_options[script_loading_strategy]" id="script_loading_strategy" class="mxch-select mxchat-autosave-field"> |
| 588 |
<option value="default" <?php selected($script_loading_strategy, 'default'); ?>><?php esc_html_e('Default (Immediate)', 'mxchat'); ?></option> |
| 589 |
<option value="defer" <?php selected($script_loading_strategy, 'defer'); ?>><?php esc_html_e('Deferred', 'mxchat'); ?></option> |
| 590 |
<option value="delay_1s" <?php selected($script_loading_strategy, 'delay_1s'); ?>><?php esc_html_e('Delay 1 Second', 'mxchat'); ?></option> |
| 591 |
<option value="delay_3s" <?php selected($script_loading_strategy, 'delay_3s'); ?>><?php esc_html_e('Delay 3 Seconds', 'mxchat'); ?></option> |
| 592 |
<option value="delay_5s" <?php selected($script_loading_strategy, 'delay_5s'); ?>><?php esc_html_e('Delay 5 Seconds', 'mxchat'); ?></option> |
| 593 |
<option value="on_interaction" <?php selected($script_loading_strategy, 'on_interaction'); ?>><?php esc_html_e('On User Interaction', 'mxchat'); ?></option> |
| 594 |
</select> |
| 595 |
</div> |
| 596 |
<p class="mxch-field-description"><?php esc_html_e('Control when the chatbot script loads to improve page performance.', 'mxchat'); ?></p> |
| 597 |
</div> |
| 598 |
|
| 599 |
<div class="mxch-notice mxch-notice-info" style="margin-top: 16px;"> |
| 600 |
<svg class="mxch-notice-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg> |
| 601 |
<div> |
| 602 |
<strong><?php esc_html_e('Loading Strategies:', 'mxchat'); ?></strong> |
| 603 |
<ul style="margin: 8px 0 0 0; padding-left: 20px;"> |
| 604 |
<li><strong><?php esc_html_e('Default:', 'mxchat'); ?></strong> <?php esc_html_e('Script loads immediately in the footer. Best for sites where chat is critical.', 'mxchat'); ?></li> |
| 605 |
<li><strong><?php esc_html_e('Deferred:', 'mxchat'); ?></strong> <?php esc_html_e('Script loads after HTML parsing completes. Good balance of performance and availability.', 'mxchat'); ?></li> |
| 606 |
<li><strong><?php esc_html_e('Delay:', 'mxchat'); ?></strong> <?php esc_html_e('Script loads after a set delay. Helps improve LCP scores.', 'mxchat'); ?></li> |
| 607 |
<li><strong><?php esc_html_e('On User Interaction:', 'mxchat'); ?></strong> <?php esc_html_e('Script loads when user scrolls, moves mouse, or touches screen. Best for Core Web Vitals but chat appears with slight delay.', 'mxchat'); ?></li> |
| 608 |
</ul> |
| 609 |
</div> |
| 610 |
</div> |
| 611 |
</div> |
| 612 |
</div> |
| 613 |
|
| 614 |
<!-- Page Cache Compatibility Card --> |
| 615 |
<div class="mxch-card"> |
| 616 |
<div class="mxch-card-header"> |
| 617 |
<h3 class="mxch-card-title"> |
| 618 |
<svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/><polyline points="3.27 6.96 12 12.01 20.73 6.96"/><line x1="12" y1="22.08" x2="12" y2="12"/></svg> |
| 619 |
<?php esc_html_e('Page Cache Compatibility', 'mxchat'); ?> |
| 620 |
</h3> |
| 621 |
</div> |
| 622 |
<div class="mxch-card-body"> |
| 623 |
<p class="mxch-field-description" style="margin-top: 0;"><?php esc_html_e('MxChat\'s chat send (and stream send, plus PDF / Word upload) all POST to /wp-admin/admin-ajax.php. Page-cache plugins occasionally cache those responses, which breaks the per-session nonce flow on the first message. MxChat auto-tells the five most common cache plugins to never cache chat AJAX via their own filter APIs — no setup needed for those. For other cache plugins (or Cloudflare APO), copy the manual exclusion string into your cache plugin\'s exclusion list.', 'mxchat'); ?></p> |
| 624 |
|
| 625 |
<?php |
| 626 |
$mxch_cache_rows = array( |
| 627 |
array('name' => 'WP Rocket', 'state' => 'auto', 'exclusion' => '/wp-admin/admin-ajax\\.php\\?action=mxchat_.*'), |
| 628 |
array('name' => 'LiteSpeed Cache', 'state' => 'auto', 'exclusion' => '/wp-admin/admin-ajax.php?action=mxchat_*'), |
| 629 |
array('name' => 'W3 Total Cache', 'state' => 'auto', 'exclusion' => '/wp-admin/admin-ajax.php?action=mxchat_*'), |
| 630 |
array('name' => 'FlyingPress', 'state' => 'auto', 'exclusion' => '/wp-admin/admin-ajax.php?action=mxchat_*'), |
| 631 |
array('name' => 'WP Super Cache', 'state' => 'auto', 'exclusion' => 'wp-admin/admin-ajax.php'), |
| 632 |
array('name' => 'Cloudflare APO', 'state' => 'manual', 'exclusion' => 'Page Rule / Cache Rule: URI Path contains "/wp-admin/admin-ajax.php" → Bypass Cache'), |
| 633 |
); |
| 634 |
?> |
| 635 |
|
| 636 |
<div class="mxch-cache-compat-grid" style="display: grid; grid-template-columns: 1fr; gap: 12px; margin-top: 16px;"> |
| 637 |
<?php foreach ($mxch_cache_rows as $row) : |
| 638 |
$is_auto = ($row['state'] === 'auto'); |
| 639 |
$pill_class = $is_auto ? 'mxch-status-pill-active' : 'mxch-status-pill-warning'; |
| 640 |
$pill_label = $is_auto ? __('Auto-handled', 'mxchat') : __('Manual', 'mxchat'); |
| 641 |
?> |
| 642 |
<div class="mxch-cache-compat-row" style="display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 14px; background: #f8fafc; border: 1px solid var(--mxch-card-border); border-radius: var(--mxch-radius-md);"> |
| 643 |
<div style="display: flex; align-items: center; gap: 10px; min-width: 0; flex: 0 0 auto;"> |
| 644 |
<span style="font-weight: 500;"><?php echo esc_html($row['name']); ?></span> |
| 645 |
<span class="mxch-status-pill <?php echo esc_attr($pill_class); ?>"> |
| 646 |
<span class="mxch-status-dot"></span> |
| 647 |
<?php echo esc_html($pill_label); ?> |
| 648 |
</span> |
| 649 |
</div> |
| 650 |
<div style="display: flex; align-items: center; gap: 8px; flex: 1 1 auto; min-width: 0;"> |
| 651 |
<code style="background: #fff; border: 1px solid var(--mxch-card-border); padding: 4px 8px; border-radius: var(--mxch-radius-sm); font-size: 12px; color: var(--mxch-text-secondary); flex: 1 1 auto; overflow-x: auto; white-space: nowrap; min-width: 0;"><?php echo esc_html($row['exclusion']); ?></code> |
| 652 |
<button type="button" class="mxch-btn mxch-btn-secondary mxch-btn-sm" data-mxch-copy="<?php echo esc_attr($row['exclusion']); ?>" style="flex: 0 0 auto;"> |
| 653 |
<?php esc_html_e('Copy', 'mxchat'); ?> |
| 654 |
</button> |
| 655 |
</div> |
| 656 |
</div> |
| 657 |
<?php endforeach; ?> |
| 658 |
</div> |
| 659 |
|
| 660 |
<div class="mxch-notice mxch-notice-info" style="margin-top: 16px;"> |
| 661 |
<svg class="mxch-notice-icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg> |
| 662 |
<span><?php esc_html_e('Auto-handled plugins receive a filter from MxChat that excludes chat AJAX from their cache. Even so, having the exclusion in your own exclusion list is harmless and acts as a belt-and-suspenders guarantee.', 'mxchat'); ?></span> |
| 663 |
</div> |
| 664 |
</div> |
| 665 |
</div> |
| 666 |
|
| 667 |
<!-- Debug Mode Card --> |
| 668 |
<?php |
| 669 |
$debug_mode = isset($options['debug_mode']) ? $options['debug_mode'] : 'off'; |
| 670 |
$debug_active = ($debug_mode === 'on'); |
| 671 |
?> |
| 672 |
<div class="mxch-card"> |
| 673 |
<div class="mxch-card-header"> |
| 674 |
<h3 class="mxch-card-title"> |
| 675 |
<svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z"/><path d="m9 12 2 2 4-4"/></svg> |
| 676 |
<?php esc_html_e('Debug Mode', 'mxchat'); ?> |
| 677 |
</h3> |
| 678 |
</div> |
| 679 |
<div class="mxch-card-body"> |
| 680 |
<div class="mxch-field"> |
| 681 |
<label class="mxch-toggle"> |
| 682 |
<input type="checkbox" class="mxch-toggle-input" id="mxchat_debug_mode" name="mxchat_options[debug_mode]" value="on" <?php checked($debug_active); ?>> |
| 683 |
<span class="mxch-toggle-switch"></span> |
| 684 |
<span class="mxch-toggle-label"><?php esc_html_e('Enable Debug Logging', 'mxchat'); ?></span> |
| 685 |
</label> |
| 686 |
<p class="mxch-field-description"><?php esc_html_e('Tracks settings changes, knowledge base errors, API issues, and embedding failures. Enable only when troubleshooting. Max 100 entries stored.', 'mxchat'); ?></p> |
| 687 |
</div> |
| 688 |
</div> |
| 689 |
</div> |
| 690 |
|
| 691 |
<!-- Debug Log Viewer Card --> |
| 692 |
<div class="mxch-card"> |
| 693 |
<div class="mxch-card-header" style="display: flex; justify-content: space-between; align-items: center;"> |
| 694 |
<h3 class="mxch-card-title"> |
| 695 |
<svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/><polyline points="10 9 9 9 8 9"/></svg> |
| 696 |
<?php esc_html_e('Debug Log', 'mxchat'); ?> |
| 697 |
</h3> |
| 698 |
<div style="display: flex; gap: 8px; align-items: center;"> |
| 699 |
<span id="mxchat-log-count" class="mxch-badge" style="display: none;"></span> |
| 700 |
<button type="button" class="mxch-btn mxch-btn-secondary mxch-btn-sm" id="mxchat-refresh-log"> |
| 701 |
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.5 2v6h-6M2.5 22v-6h6M2 11.5a10 10 0 0 1 18.8-4.3M22 12.5a10 10 0 0 1-18.8 4.2"/></svg> |
| 702 |
<?php esc_html_e('Refresh', 'mxchat'); ?> |
| 703 |
</button> |
| 704 |
<button type="button" class="mxch-btn mxch-btn-secondary mxch-btn-sm" id="mxchat-clear-log"> |
| 705 |
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/></svg> |
| 706 |
<?php esc_html_e('Clear', 'mxchat'); ?> |
| 707 |
</button> |
| 708 |
</div> |
| 709 |
</div> |
| 710 |
<div class="mxch-card-body"> |
| 711 |
<div id="mxchat-debug-log" class="mxchat-debug-log-viewer"> |
| 712 |
<div class="mxchat-debug-log-empty"> |
| 713 |
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" style="opacity: 0.3;"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg> |
| 714 |
<p><?php esc_html_e('No log entries yet. Enable debug mode to start logging.', 'mxchat'); ?></p> |
| 715 |
</div> |
| 716 |
</div> |
| 717 |
</div> |
| 718 |
</div> |
| 719 |
|
| 720 |
<!-- Settings Tools Card --> |
| 721 |
<div class="mxch-card"> |
| 722 |
<div class="mxch-card-header"> |
| 723 |
<h3 class="mxch-card-title"> |
| 724 |
<svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg> |
| 725 |
<?php esc_html_e('Settings Tools', 'mxchat'); ?> |
| 726 |
</h3> |
| 727 |
</div> |
| 728 |
<div class="mxch-card-body"> |
| 729 |
<div class="mxch-tools-grid"> |
| 730 |
<!-- Export Settings --> |
| 731 |
<div class="mxch-tool-item"> |
| 732 |
<div class="mxch-tool-icon"> |
| 733 |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg> |
| 734 |
</div> |
| 735 |
<div class="mxch-tool-content"> |
| 736 |
<h4><?php esc_html_e('Export Settings', 'mxchat'); ?></h4> |
| 737 |
<p><?php esc_html_e('Download a JSON file of your current settings for backup or support. API keys are masked for security.', 'mxchat'); ?></p> |
| 738 |
<button type="button" class="mxch-btn mxch-btn-secondary" id="mxchat-export-settings"> |
| 739 |
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg> |
| 740 |
<?php esc_html_e('Export Settings', 'mxchat'); ?> |
| 741 |
</button> |
| 742 |
</div> |
| 743 |
</div> |
| 744 |
|
| 745 |
<!-- Reset All Settings --> |
| 746 |
<div class="mxch-tool-item mxch-tool-item-danger"> |
| 747 |
<div class="mxch-tool-icon"> |
| 748 |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 6h18"/><path d="M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6"/><path d="M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"/><line x1="10" y1="11" x2="10" y2="17"/><line x1="14" y1="11" x2="14" y2="17"/></svg> |
| 749 |
</div> |
| 750 |
<div class="mxch-tool-content"> |
| 751 |
<h4><?php esc_html_e('Reset All Settings', 'mxchat'); ?></h4> |
| 752 |
<p><?php esc_html_e('Reset all MxChat settings to their default values. This action cannot be undone.', 'mxchat'); ?></p> |
| 753 |
<button type="button" class="mxch-btn mxch-btn-danger" id="mxchat-reset-settings"> |
| 754 |
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 6h18"/><path d="M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6"/></svg> |
| 755 |
<?php esc_html_e('Reset All Settings', 'mxchat'); ?> |
| 756 |
</button> |
| 757 |
</div> |
| 758 |
</div> |
| 759 |
</div> |
| 760 |
</div> |
| 761 |
</div> |
| 762 |
|
| 763 |
<!-- Reset Confirmation Modal --> |
| 764 |
<div id="mxchat-reset-modal" class="mxch-modal" style="display: none;"> |
| 765 |
<div class="mxch-modal-backdrop"></div> |
| 766 |
<div class="mxch-modal-content"> |
| 767 |
<div class="mxch-modal-header"> |
| 768 |
<h3><?php esc_html_e('Reset All Settings', 'mxchat'); ?></h3> |
| 769 |
<button type="button" class="mxch-modal-close" id="mxchat-reset-modal-close">×</button> |
| 770 |
</div> |
| 771 |
<div class="mxch-modal-body"> |
| 772 |
<div class="mxch-notice mxch-notice-warning"> |
| 773 |
<svg class="mxch-notice-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg> |
| 774 |
<div> |
| 775 |
<strong><?php esc_html_e('Warning: This action cannot be undone!', 'mxchat'); ?></strong> |
| 776 |
<p><?php esc_html_e('All your MxChat settings including API keys, customizations, and configurations will be permanently deleted.', 'mxchat'); ?></p> |
| 777 |
</div> |
| 778 |
</div> |
| 779 |
<div class="mxch-field" style="margin-top: 20px;"> |
| 780 |
<label class="mxch-field-label"><?php esc_html_e('Type RESET to confirm:', 'mxchat'); ?></label> |
| 781 |
<input type="text" id="mxchat-reset-confirmation" class="mxch-input" placeholder="RESET" autocomplete="off"> |
| 782 |
</div> |
| 783 |
</div> |
| 784 |
<div class="mxch-modal-footer"> |
| 785 |
<button type="button" class="mxch-btn mxch-btn-secondary" id="mxchat-reset-cancel"><?php esc_html_e('Cancel', 'mxchat'); ?></button> |
| 786 |
<button type="button" class="mxch-btn mxch-btn-danger" id="mxchat-reset-confirm" disabled><?php esc_html_e('Reset All Settings', 'mxchat'); ?></button> |
| 787 |
</div> |
| 788 |
</div> |
| 789 |
</div> |
| 790 |
</div> |
| 791 |
|
| 792 |
<!-- ======================================== |
| 793 |
INTEGRATIONS - TOOLBAR |
| 794 |
======================================== --> |
| 795 |
<div id="integrations-toolbar" class="mxch-section"> |
| 796 |
<div class="mxch-content-header"> |
| 797 |
<h1 class="mxch-content-title"><?php esc_html_e('Toolbar Settings', 'mxchat'); ?></h1> |
| 798 |
<p class="mxch-content-subtitle"><?php esc_html_e('Configure the chat toolbar and document upload features.', 'mxchat'); ?></p> |
| 799 |
</div> |
| 800 |
|
| 801 |
<div class="mxch-card"> |
| 802 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 803 |
<table class="form-table"> |
| 804 |
<?php do_settings_fields('mxchat-embed', 'mxchat_pdf_intent_section'); ?> |
| 805 |
</table> |
| 806 |
</div> |
| 807 |
</div> |
| 808 |
</div> |
| 809 |
|
| 810 |
<!-- ======================================== |
| 811 |
INTEGRATIONS - LOOPS |
| 812 |
======================================== --> |
| 813 |
<div id="integrations-loops" class="mxch-section"> |
| 814 |
<div class="mxch-content-header"> |
| 815 |
<h1 class="mxch-content-title"><?php esc_html_e('Loops Integration', 'mxchat'); ?></h1> |
| 816 |
<p class="mxch-content-subtitle"><?php esc_html_e('Configure email capture with Loops for mailing list growth.', 'mxchat'); ?></p> |
| 817 |
</div> |
| 818 |
|
| 819 |
<div class="mxch-card"> |
| 820 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 821 |
<table class="form-table"> |
| 822 |
<?php do_settings_fields('mxchat-embed', 'mxchat_loops_section'); ?> |
| 823 |
</table> |
| 824 |
</div> |
| 825 |
</div> |
| 826 |
</div> |
| 827 |
|
| 828 |
<!-- ======================================== |
| 829 |
INTEGRATIONS - BRAVE SEARCH |
| 830 |
======================================== --> |
| 831 |
<div id="integrations-brave" class="mxch-section"> |
| 832 |
<div class="mxch-content-header"> |
| 833 |
<h1 class="mxch-content-title"><?php esc_html_e('Brave Search', 'mxchat'); ?></h1> |
| 834 |
<p class="mxch-content-subtitle"><?php esc_html_e('Configure Brave Search API for web search capabilities.', 'mxchat'); ?></p> |
| 835 |
</div> |
| 836 |
|
| 837 |
<div class="mxch-card"> |
| 838 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 839 |
<table class="form-table"> |
| 840 |
<?php do_settings_fields('mxchat-embed', 'mxchat_brave_section'); ?> |
| 841 |
</table> |
| 842 |
</div> |
| 843 |
</div> |
| 844 |
</div> |
| 845 |
|
| 846 |
<!-- ======================================== |
| 847 |
INTEGRATIONS - SLACK |
| 848 |
======================================== --> |
| 849 |
<div id="integrations-slack" class="mxch-section"> |
| 850 |
<div class="mxch-content-header"> |
| 851 |
<h1 class="mxch-content-title"><?php esc_html_e('Slack', 'mxchat'); ?></h1> |
| 852 |
<p class="mxch-content-subtitle"><?php esc_html_e('Connect your chatbot to Slack for live human support.', 'mxchat'); ?></p> |
| 853 |
</div> |
| 854 |
|
| 855 |
<div class="mxch-notice mxch-notice-info" style="margin-bottom: 24px;"> |
| 856 |
<svg class="mxch-notice-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg> |
| 857 |
<div> |
| 858 |
<?php printf( |
| 859 |
esc_html__('Visit our %s for setup instructions.', 'mxchat'), |
| 860 |
'<a href="https://mxchat.ai/documentation/#slack_integration" target="_blank">' . esc_html__('documentation page', 'mxchat') . '</a>' |
| 861 |
); ?> |
| 862 |
</div> |
| 863 |
</div> |
| 864 |
|
| 865 |
<div class="mxch-card"> |
| 866 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 867 |
<table class="form-table"> |
| 868 |
<?php do_settings_fields('mxchat-embed', 'mxchat_live_agent_section'); ?> |
| 869 |
</table> |
| 870 |
</div> |
| 871 |
</div> |
| 872 |
|
| 873 |
<div class="mxch-card" style="margin-top: 24px;"> |
| 874 |
<div class="mxch-card-header"> |
| 875 |
<h3 class="mxch-card-title"> |
| 876 |
<svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg> |
| 877 |
<?php esc_html_e('Test Connection', 'mxchat'); ?> |
| 878 |
</h3> |
| 879 |
</div> |
| 880 |
<div class="mxch-card-body"> |
| 881 |
<p class="mxch-field-description" style="margin-bottom: 16px;"> |
| 882 |
<?php esc_html_e('Test your Slack bot token to verify it has the required permissions. This will check if the bot can authenticate and create channels.', 'mxchat'); ?> |
| 883 |
</p> |
| 884 |
<button type="button" id="mxchat-test-slack-connection" class="mxch-btn mxch-btn-secondary"> |
| 885 |
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right: 8px;"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg> |
| 886 |
<?php esc_html_e('Test Slack Connection', 'mxchat'); ?> |
| 887 |
</button> |
| 888 |
<div id="mxchat-slack-test-result" style="margin-top: 16px; display: none;"></div> |
| 889 |
</div> |
| 890 |
</div> |
| 891 |
|
| 892 |
<div class="mxch-card" style="margin-top: 24px;"> |
| 893 |
<div class="mxch-card-header"> |
| 894 |
<h3 class="mxch-card-title"> |
| 895 |
<svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg> |
| 896 |
<?php esc_html_e('Required OAuth Scopes', 'mxchat'); ?> |
| 897 |
</h3> |
| 898 |
</div> |
| 899 |
<div class="mxch-card-body"> |
| 900 |
<p class="mxch-field-description" style="margin-bottom: 12px;"> |
| 901 |
<?php esc_html_e('Your Slack app needs these Bot Token Scopes (OAuth & Permissions > Scopes):', 'mxchat'); ?> |
| 902 |
</p> |
| 903 |
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 8px; background: #f8f9fa; padding: 16px; border-radius: 8px; font-family: monospace; font-size: 13px;"> |
| 904 |
<code style="background: #e9ecef; padding: 4px 8px; border-radius: 4px;">channels:manage</code> |
| 905 |
<code style="background: #e9ecef; padding: 4px 8px; border-radius: 4px;">channels:read</code> |
| 906 |
<code style="background: #e9ecef; padding: 4px 8px; border-radius: 4px;">chat:write</code> |
| 907 |
<code style="background: #e9ecef; padding: 4px 8px; border-radius: 4px;">chat:write.public</code> |
| 908 |
<code style="background: #e9ecef; padding: 4px 8px; border-radius: 4px;">groups:write</code> |
| 909 |
<code style="background: #e9ecef; padding: 4px 8px; border-radius: 4px;">users:read</code> |
| 910 |
</div> |
| 911 |
<p class="mxch-field-description" style="margin-top: 12px;"> |
| 912 |
<?php esc_html_e('After adding scopes, reinstall the app to your workspace.', 'mxchat'); ?> |
| 913 |
</p> |
| 914 |
</div> |
| 915 |
</div> |
| 916 |
</div> |
| 917 |
|
| 918 |
<!-- ======================================== |
| 919 |
INTEGRATIONS - TELEGRAM |
| 920 |
======================================== --> |
| 921 |
<div id="integrations-telegram" class="mxch-section"> |
| 922 |
<div class="mxch-content-header"> |
| 923 |
<h1 class="mxch-content-title"><?php esc_html_e('Telegram', 'mxchat'); ?></h1> |
| 924 |
<p class="mxch-content-subtitle"><?php esc_html_e('Connect your chatbot to Telegram for live human support.', 'mxchat'); ?></p> |
| 925 |
</div> |
| 926 |
|
| 927 |
<div class="mxch-notice mxch-notice-info" style="margin-bottom: 24px;"> |
| 928 |
<svg class="mxch-notice-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg> |
| 929 |
<div> |
| 930 |
<?php esc_html_e('Telegram Live Agent requires a Telegram bot and a supergroup with forum topics enabled.', 'mxchat'); ?> |
| 931 |
<a href="https://mxchat.ai/documentation-bot/" target="_blank" style="margin-left: 5px;"><?php esc_html_e('Chat with our advanced doc bot for assistance setting up.', 'mxchat'); ?></a> |
| 932 |
</div> |
| 933 |
</div> |
| 934 |
|
| 935 |
<div class="mxch-card"> |
| 936 |
<div class="mxch-card-body mxchat-autosave-section"> |
| 937 |
<table class="form-table"> |
| 938 |
<?php do_settings_fields('mxchat-embed', 'mxchat_telegram_section'); ?> |
| 939 |
</table> |
| 940 |
</div> |
| 941 |
</div> |
| 942 |
|
| 943 |
<div class="mxch-card" style="margin-top: 24px;"> |
| 944 |
<div class="mxch-card-header"> |
| 945 |
<h3 class="mxch-card-title"> |
| 946 |
<svg class="mxch-card-title-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg> |
| 947 |
<?php esc_html_e('Webhook Setup', 'mxchat'); ?> |
| 948 |
</h3> |
| 949 |
</div> |
| 950 |
<div class="mxch-card-body"> |
| 951 |
<?php |
| 952 |
$telegram_bot_token = $options['telegram_bot_token'] ?? ''; |
| 953 |
$telegram_webhook_secret = $options['telegram_webhook_secret'] ?? ''; |
| 954 |
$webhook_url = rest_url('mxchat/v1/telegram-webhook'); |
| 955 |
?> |
| 956 |
|
| 957 |
<p class="mxch-field-description" style="margin-bottom: 8px;"> |
| 958 |
<strong><?php esc_html_e('Your Webhook URL:', 'mxchat'); ?></strong> |
| 959 |
</p> |
| 960 |
<div class="mxch-webhook-url-display" style="margin-bottom: 20px;"> |
| 961 |
<code id="mxch-telegram-webhook-url"><?php echo esc_url($webhook_url); ?></code> |
| 962 |
<button type="button" class="mxch-btn mxch-btn-secondary mxch-btn-sm" onclick="navigator.clipboard.writeText(document.getElementById('mxch-telegram-webhook-url').textContent); this.textContent='Copied!'; setTimeout(() => this.textContent='Copy', 2000);"> |
| 963 |
<?php esc_html_e('Copy', 'mxchat'); ?> |
| 964 |
</button> |
| 965 |
</div> |
| 966 |
|
| 967 |
<?php if (!empty($telegram_bot_token)) : ?> |
| 968 |
<p class="mxch-field-description" style="margin-bottom: 8px;"> |
| 969 |
<strong><?php esc_html_e('Register Webhook URL:', 'mxchat'); ?></strong><br> |
| 970 |
<?php esc_html_e('Copy and paste this URL into your browser to register the webhook with Telegram:', 'mxchat'); ?> |
| 971 |
</p> |
| 972 |
<?php |
| 973 |
$registration_url = 'https://api.telegram.org/bot' . $telegram_bot_token . '/setWebhook?url=' . urlencode($webhook_url); |
| 974 |
if (!empty($telegram_webhook_secret)) { |
| 975 |
$registration_url .= '&secret_token=' . urlencode($telegram_webhook_secret); |
| 976 |
} |
| 977 |
?> |
| 978 |
<div class="mxch-webhook-url-display" style="margin-bottom: 12px;"> |
| 979 |
<code id="mxch-telegram-registration-url" style="word-break: break-all; font-size: 12px;"><?php echo esc_url($registration_url); ?></code> |
| 980 |
<button type="button" class="mxch-btn mxch-btn-secondary mxch-btn-sm" onclick="navigator.clipboard.writeText(document.getElementById('mxch-telegram-registration-url').textContent); this.textContent='Copied!'; setTimeout(() => this.textContent='Copy', 2000);"> |
| 981 |
<?php esc_html_e('Copy', 'mxchat'); ?> |
| 982 |
</button> |
| 983 |
</div> |
| 984 |
<p class="mxch-field-description" style="color: #22c55e;"> |
| 985 |
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align: middle; margin-right: 4px;"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg> |
| 986 |
<?php esc_html_e('You should see {"ok":true,"result":true,"description":"Webhook was set"} after visiting the URL.', 'mxchat'); ?> |
| 987 |
</p> |
| 988 |
<?php else : ?> |
| 989 |
<p class="mxch-field-description" style="color: #f59e0b;"> |
| 990 |
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align: middle; margin-right: 4px;"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg> |
| 991 |
<?php esc_html_e('Enter your Bot Token above and save to generate the registration URL.', 'mxchat'); ?> |
| 992 |
</p> |
| 993 |
<?php endif; ?> |
| 994 |
</div> |
| 995 |
</div> |
| 996 |
</div> |
| 997 |
|
| 998 |
<!-- ======================================== |
| 999 |
TUTORIALS |
| 1000 |
======================================== --> |
| 1001 |
<div id="tutorials" class="mxch-section"> |
| 1002 |
<div class="mxch-content-header"> |
| 1003 |
<h1 class="mxch-content-title"><?php esc_html_e('Video Tutorials', 'mxchat'); ?></h1> |
| 1004 |
<p class="mxch-content-subtitle"><?php esc_html_e('Learn how to get the most out of MxChat with our video guides.', 'mxchat'); ?></p> |
| 1005 |
</div> |
| 1006 |
|
| 1007 |
<div class="mxch-card" style="margin-bottom: 24px;"> |
| 1008 |
<div class="mxch-card-body"> |
| 1009 |
<div style="display: flex; align-items: flex-start; gap: 16px;"> |
| 1010 |
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="color: var(--mxch-warning); flex-shrink: 0;"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg> |
| 1011 |
<div> |
| 1012 |
<h3 style="margin: 0 0 8px 0; font-size: 16px; font-weight: 600;"><?php esc_html_e('Need Help?', 'mxchat'); ?></h3> |
| 1013 |
<p style="margin: 0 0 12px 0; color: var(--mxch-text-secondary);"><?php esc_html_e('If you\'re having trouble or believe something is not working as expected, please submit a support ticket.', 'mxchat'); ?></p> |
| 1014 |
<a href="https://wordpress.org/support/plugin/mxchat-basic/" target="_blank" class="mxch-btn mxch-btn-secondary mxch-btn-sm"> |
| 1015 |
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 9a2 2 0 0 1-2 2H6l-4 4V4c0-1.1.9-2 2-2h8a2 2 0 0 1 2 2v5Z"/><path d="M18 9h2a2 2 0 0 1 2 2v11l-4-4h-6a2 2 0 0 1-2-2v-1"/></svg> |
| 1016 |
<?php esc_html_e('Submit Support Ticket', 'mxchat'); ?> |
| 1017 |
</a> |
| 1018 |
</div> |
| 1019 |
</div> |
| 1020 |
</div> |
| 1021 |
</div> |
| 1022 |
|
| 1023 |
<div class="mxch-tutorials-grid"> |
| 1024 |
<?php |
| 1025 |
$tutorials = array( |
| 1026 |
array( |
| 1027 |
'title' => __('Quick Setup with MxChat', 'mxchat'), |
| 1028 |
'description' => __('Learn how to quickly setup and understand how your chatbot works.', 'mxchat'), |
| 1029 |
'url' => 'https://www.youtube.com/watch?v=3BqoiyWaQiM&t' |
| 1030 |
), |
| 1031 |
array( |
| 1032 |
'title' => __('AI Content Generation', 'mxchat'), |
| 1033 |
'description' => __('Generate full blog posts and landing pages with AI—from prompt to publish in minutes.', 'mxchat'), |
| 1034 |
'url' => 'https://www.youtube.com/watch?v=n8TeEeHpxs4' |
| 1035 |
), |
| 1036 |
array( |
| 1037 |
'title' => __('Chat With Your GSC Data', 'mxchat'), |
| 1038 |
'description' => __('Find content gaps, quick win keywords, and SEO opportunities by chatting with your Google Search Console data using the Admin Assistant add-on.', 'mxchat'), |
| 1039 |
'url' => 'https://www.youtube.com/watch?v=ytgMou_7SZA&t=2s' |
| 1040 |
), |
| 1041 |
array( |
| 1042 |
'title' => __('AI Theme Generator', 'mxchat'), |
| 1043 |
'description' => __('Learn how to instantly restyle your chatbot using plain English prompts with real-time previews.', 'mxchat'), |
| 1044 |
'url' => 'https://www.youtube.com/watch?v=rSQDW2qbtRU&t' |
| 1045 |
), |
| 1046 |
array( |
| 1047 |
'title' => __('MxChat Forms', 'mxchat'), |
| 1048 |
'description' => __('Create and manage smart forms that automatically trigger during chat conversations.', 'mxchat'), |
| 1049 |
'url' => 'https://www.youtube.com/watch?v=3MrWy5dRalA' |
| 1050 |
), |
| 1051 |
array( |
| 1052 |
'title' => __('Admin Assistant Add-on', 'mxchat'), |
| 1053 |
'description' => __('Bring a ChatGPT-like experience directly inside your WordPress dashboard.', 'mxchat'), |
| 1054 |
'url' => 'https://youtu.be/AdEA1k-UCFM' |
| 1055 |
), |
| 1056 |
array( |
| 1057 |
'title' => __('Chat Themes', 'mxchat'), |
| 1058 |
'description' => __('Customize appearance with real-time previews to match your brand.', 'mxchat'), |
| 1059 |
'url' => 'https://youtu.be/MfbB9mZi6ag' |
| 1060 |
), |
| 1061 |
array( |
| 1062 |
'title' => __('WooCommerce Integration', 'mxchat'), |
| 1063 |
'description' => __('Provide product recommendations and shopping assistance to customers.', 'mxchat'), |
| 1064 |
'url' => 'https://www.youtube.com/watch?v=WsqAppHRGdA' |
| 1065 |
), |
| 1066 |
array( |
| 1067 |
'title' => __('Knowledge Base Setup', 'mxchat'), |
| 1068 |
'description' => __('Set up your knowledge base using PDFs, sitemaps, and manual entries.', 'mxchat'), |
| 1069 |
'url' => 'https://www.youtube.com/watch?v=8Ztjs66-VTo' |
| 1070 |
), |
| 1071 |
array( |
| 1072 |
'title' => __('Document Chat', 'mxchat'), |
| 1073 |
'description' => __('Chat with PDF and Word documents for enhanced document analysis.', 'mxchat'), |
| 1074 |
'url' => 'https://www.youtube.com/watch?v=j_c45WWCTG0' |
| 1075 |
), |
| 1076 |
array( |
| 1077 |
'title' => __('Perplexity Integration', 'mxchat'), |
| 1078 |
'description' => __('Enable real-time web search capabilities for your chatbot.', 'mxchat'), |
| 1079 |
'url' => 'https://youtu.be/wpKkbt24-bo' |
| 1080 |
), |
| 1081 |
array( |
| 1082 |
'title' => __('Brave Search Intent', 'mxchat'), |
| 1083 |
'description' => __('Leverage Brave Search for improved query understanding.', 'mxchat'), |
| 1084 |
'url' => 'https://www.youtube.com/watch?v=7vDL5H7vToc' |
| 1085 |
), |
| 1086 |
array( |
| 1087 |
'title' => __('Loops Email Capture', 'mxchat'), |
| 1088 |
'description' => __('Set up email capture with Loops to grow your mailing list.', 'mxchat'), |
| 1089 |
'url' => 'https://www.youtube.com/watch?v=CNgm5TYDyTc' |
| 1090 |
), |
| 1091 |
array( |
| 1092 |
'title' => __('AI Agent Testing', 'mxchat'), |
| 1093 |
'description' => __('Evaluate and improve your chatbot\'s performance and accuracy.', 'mxchat'), |
| 1094 |
'url' => 'https://www.youtube.com/watch?v=A0jowbpyX54' |
| 1095 |
), |
| 1096 |
); |
| 1097 |
|
| 1098 |
foreach ($tutorials as $tutorial): ?> |
| 1099 |
<div class="mxch-tutorial-card"> |
| 1100 |
<div class="mxch-tutorial-content"> |
| 1101 |
<h3 class="mxch-tutorial-title"><?php echo esc_html($tutorial['title']); ?></h3> |
| 1102 |
<p class="mxch-tutorial-description"><?php echo esc_html($tutorial['description']); ?></p> |
| 1103 |
<a href="<?php echo esc_url($tutorial['url']); ?>" target="_blank" rel="noopener" class="mxch-tutorial-link"> |
| 1104 |
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="5 3 19 12 5 21 5 3"/></svg> |
| 1105 |
<?php esc_html_e('Watch Tutorial', 'mxchat'); ?> |
| 1106 |
</a> |
| 1107 |
</div> |
| 1108 |
</div> |
| 1109 |
<?php endforeach; ?> |
| 1110 |
</div> |
| 1111 |
</div> |
| 1112 |
|
| 1113 |
<!-- ===================================================== |
| 1114 |
TESTING SECTION |
| 1115 |
===================================================== --> |
| 1116 |
<div id="testing" class="mxch-section"> |
| 1117 |
<div class="mxch-content-header"> |
| 1118 |
<h1 class="mxch-content-title"><?php esc_html_e('Testing', 'mxchat'); ?></h1> |
| 1119 |
<p class="mxch-content-subtitle"><?php esc_html_e('Test your chatbot and inspect debug data in real time.', 'mxchat'); ?></p> |
| 1120 |
</div> |
| 1121 |
|
| 1122 |
<div class="mxch-testing-layout"> |
| 1123 |
<!-- Left Column: Debug Panel --> |
| 1124 |
<div class="mxch-testing-debug-panel"> |
| 1125 |
<!-- Quick Actions --> |
| 1126 |
<div class="mxch-card"> |
| 1127 |
<div class="mxch-card-body"> |
| 1128 |
<h3 class="mxch-testing-section-title"><?php esc_html_e('Quick Actions', 'mxchat'); ?></h3> |
| 1129 |
<div class="mxch-testing-actions-row"> |
| 1130 |
<button type="button" class="mxch-testing-btn mxch-testing-btn-danger" id="mxch-testing-clear-session"> |
| 1131 |
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 6h18"/><path d="M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6"/><path d="M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"/></svg> |
| 1132 |
<?php esc_html_e('Clear Chat Session', 'mxchat'); ?> |
| 1133 |
</button> |
| 1134 |
<button type="button" class="mxch-testing-btn mxch-testing-btn-secondary" id="mxch-testing-clear-debug"> |
| 1135 |
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2v20M2 12h20"/></svg> |
| 1136 |
<?php esc_html_e('Clear Debug Log', 'mxchat'); ?> |
| 1137 |
</button> |
| 1138 |
</div> |
| 1139 |
</div> |
| 1140 |
</div> |
| 1141 |
|
| 1142 |
<!-- Last Query Analysis --> |
| 1143 |
<div class="mxch-card"> |
| 1144 |
<div class="mxch-card-body"> |
| 1145 |
<h3 class="mxch-testing-section-title"><?php esc_html_e('Last Query Analysis', 'mxchat'); ?></h3> |
| 1146 |
|
| 1147 |
<div class="mxch-testing-field"> |
| 1148 |
<label><?php esc_html_e('Similarity Threshold', 'mxchat'); ?></label> |
| 1149 |
<span id="mxch-testing-threshold"><?php esc_html_e('Loading...', 'mxchat'); ?></span> |
| 1150 |
</div> |
| 1151 |
|
| 1152 |
<div class="mxch-testing-field"> |
| 1153 |
<label><?php esc_html_e('User Query', 'mxchat'); ?></label> |
| 1154 |
<div id="mxch-testing-last-query" class="mxch-testing-query-display"><?php esc_html_e('Waiting for next query...', 'mxchat'); ?></div> |
| 1155 |
</div> |
| 1156 |
|
| 1157 |
<div class="mxch-testing-field"> |
| 1158 |
<label><?php esc_html_e('Approved URLs for Citations', 'mxchat'); ?></label> |
| 1159 |
<div id="mxch-testing-approved-urls" class="mxch-testing-results"> |
| 1160 |
<div class="mxch-testing-no-data"><?php esc_html_e('No URL data yet', 'mxchat'); ?></div> |
| 1161 |
</div> |
| 1162 |
</div> |
| 1163 |
|
| 1164 |
<div class="mxch-testing-field"> |
| 1165 |
<label><?php esc_html_e('Document Matches', 'mxchat'); ?></label> |
| 1166 |
<div id="mxch-testing-similarity-scores" class="mxch-testing-results"> |
| 1167 |
<div class="mxch-testing-no-data"><?php esc_html_e('No query data yet', 'mxchat'); ?></div> |
| 1168 |
</div> |
| 1169 |
</div> |
| 1170 |
|
| 1171 |
<div class="mxch-testing-field"> |
| 1172 |
<label><?php esc_html_e('Actions Triggered', 'mxchat'); ?></label> |
| 1173 |
<div id="mxch-testing-action-scores" class="mxch-testing-results"> |
| 1174 |
<div class="mxch-testing-no-data"><?php esc_html_e('No action data yet', 'mxchat'); ?></div> |
| 1175 |
</div> |
| 1176 |
</div> |
| 1177 |
</div> |
| 1178 |
</div> |
| 1179 |
|
| 1180 |
<!-- System Information --> |
| 1181 |
<div class="mxch-card"> |
| 1182 |
<div class="mxch-card-body"> |
| 1183 |
<h3 class="mxch-testing-section-title"><?php esc_html_e('System Information', 'mxchat'); ?></h3> |
| 1184 |
|
| 1185 |
<div class="mxch-testing-field"> |
| 1186 |
<label><?php esc_html_e('System Prompt', 'mxchat'); ?></label> |
| 1187 |
<div id="mxch-testing-system-prompt" class="mxch-testing-system-prompt"><?php esc_html_e('Loading...', 'mxchat'); ?></div> |
| 1188 |
</div> |
| 1189 |
|
| 1190 |
<div class="mxch-testing-field"> |
| 1191 |
<label><?php esc_html_e('Knowledge Base', 'mxchat'); ?></label> |
| 1192 |
<span id="mxch-testing-kb-status"><?php esc_html_e('Checking...', 'mxchat'); ?></span> |
| 1193 |
</div> |
| 1194 |
</div> |
| 1195 |
</div> |
| 1196 |
|
| 1197 |
<!-- Debug Log --> |
| 1198 |
<div class="mxch-card"> |
| 1199 |
<div class="mxch-card-body"> |
| 1200 |
<h3 class="mxch-testing-section-title"><?php esc_html_e('Debug Log', 'mxchat'); ?></h3> |
| 1201 |
<div id="mxch-testing-debug-console" class="mxch-testing-debug-console"> |
| 1202 |
<div class="mxch-testing-debug-entry"><?php esc_html_e('Debug panel ready - send a message to begin...', 'mxchat'); ?></div> |
| 1203 |
</div> |
| 1204 |
</div> |
| 1205 |
</div> |
| 1206 |
</div> |
| 1207 |
|
| 1208 |
<!-- Right Column: Chatbot Replica --> |
| 1209 |
<div class="mxch-testing-chatbot-column"> |
| 1210 |
<div class="mxch-testing-chatbot-scope"> |
| 1211 |
<?php |
| 1212 |
// Render the chatbot inline for testing |
| 1213 |
echo do_shortcode('[mxchat_chatbot floating="no" bot_id="testing"]'); |
| 1214 |
?> |
| 1215 |
</div> |
| 1216 |
</div> |
| 1217 |
</div> |
| 1218 |
</div> |
| 1219 |
|
| 1220 |
</main> |
| 1221 |
</div> |
| 1222 |
|
| 1223 |
<script> |
| 1224 |
document.addEventListener('DOMContentLoaded', function() { |
| 1225 |
// Sidebar navigation |
| 1226 |
const navLinks = document.querySelectorAll('.mxch-nav-link, .mxch-nav-sub-link'); |
| 1227 |
const sections = document.querySelectorAll('.mxch-section'); |
| 1228 |
const navItems = document.querySelectorAll('.mxch-nav-item'); |
| 1229 |
|
| 1230 |
function showSection(target) { |
| 1231 |
// Show target section |
| 1232 |
sections.forEach(section => { |
| 1233 |
section.classList.remove('active'); |
| 1234 |
if (section.id === target) { |
| 1235 |
section.classList.add('active'); |
| 1236 |
} |
| 1237 |
}); |
| 1238 |
|
| 1239 |
// Scroll content area to top |
| 1240 |
const contentArea = document.querySelector('.mxch-content'); |
| 1241 |
if (contentArea) { |
| 1242 |
contentArea.scrollTop = 0; |
| 1243 |
} |
| 1244 |
} |
| 1245 |
|
| 1246 |
function setActiveNav(clickedLink) { |
| 1247 |
// Remove active from all links |
| 1248 |
navLinks.forEach(l => l.classList.remove('active')); |
| 1249 |
|
| 1250 |
// Add active to clicked link |
| 1251 |
clickedLink.classList.add('active'); |
| 1252 |
|
| 1253 |
// If clicking a sub-link, also highlight parent |
| 1254 |
if (clickedLink.classList.contains('mxch-nav-sub-link')) { |
| 1255 |
const parent = clickedLink.closest('.mxch-nav-item'); |
| 1256 |
if (parent) { |
| 1257 |
parent.querySelector('.mxch-nav-link').classList.add('active'); |
| 1258 |
} |
| 1259 |
} |
| 1260 |
} |
| 1261 |
|
| 1262 |
navLinks.forEach(link => { |
| 1263 |
link.addEventListener('click', function(e) { |
| 1264 |
e.preventDefault(); |
| 1265 |
e.stopPropagation(); |
| 1266 |
const target = this.dataset.target; |
| 1267 |
const parentItem = this.closest('.mxch-nav-item'); |
| 1268 |
const hasSubmenu = parentItem && parentItem.querySelector('.mxch-nav-sub'); |
| 1269 |
|
| 1270 |
// If this is a parent nav link WITH children (expandable menu) |
| 1271 |
if (this.classList.contains('mxch-nav-link') && hasSubmenu) { |
| 1272 |
const wasExpanded = parentItem.classList.contains('expanded'); |
| 1273 |
|
| 1274 |
// Collapse all other expandable items |
| 1275 |
navItems.forEach(item => { |
| 1276 |
if (item !== parentItem && item.querySelector('.mxch-nav-sub')) { |
| 1277 |
item.classList.remove('expanded'); |
| 1278 |
} |
| 1279 |
}); |
| 1280 |
|
| 1281 |
// Toggle this item |
| 1282 |
parentItem.classList.toggle('expanded'); |
| 1283 |
|
| 1284 |
// If expanding, show the first sub-item's content and mark it active |
| 1285 |
if (!wasExpanded) { |
| 1286 |
const firstSubLink = parentItem.querySelector('.mxch-nav-sub-link'); |
| 1287 |
if (firstSubLink) { |
| 1288 |
const firstTarget = firstSubLink.dataset.target; |
| 1289 |
showSection(firstTarget); |
| 1290 |
setActiveNav(firstSubLink); |
| 1291 |
// Also mark parent as active |
| 1292 |
this.classList.add('active'); |
| 1293 |
history.replaceState(null, null, '#' + firstTarget); |
| 1294 |
} |
| 1295 |
} |
| 1296 |
} |
| 1297 |
// If this is a nav link WITHOUT children (like API Keys, Tutorials) |
| 1298 |
else if (this.classList.contains('mxch-nav-link') && !hasSubmenu && target) { |
| 1299 |
// Collapse all expandable items |
| 1300 |
navItems.forEach(item => { |
| 1301 |
if (item.querySelector('.mxch-nav-sub')) { |
| 1302 |
item.classList.remove('expanded'); |
| 1303 |
} |
| 1304 |
}); |
| 1305 |
|
| 1306 |
// Show the section |
| 1307 |
showSection(target); |
| 1308 |
setActiveNav(this); |
| 1309 |
history.replaceState(null, null, '#' + target); |
| 1310 |
} |
| 1311 |
// If this is a sub-link |
| 1312 |
else if (this.classList.contains('mxch-nav-sub-link') && target) { |
| 1313 |
// Ensure parent stays expanded |
| 1314 |
if (parentItem) { |
| 1315 |
parentItem.classList.add('expanded'); |
| 1316 |
} |
| 1317 |
showSection(target); |
| 1318 |
setActiveNav(this); |
| 1319 |
history.replaceState(null, null, '#' + target); |
| 1320 |
} |
| 1321 |
}); |
| 1322 |
}); |
| 1323 |
|
| 1324 |
// Handle initial hash |
| 1325 |
const hash = window.location.hash.slice(1); |
| 1326 |
if (hash) { |
| 1327 |
const targetLink = document.querySelector('[data-target="' + hash + '"]'); |
| 1328 |
if (targetLink) { |
| 1329 |
// Expand parent if it's a sub-link |
| 1330 |
const parentItem = targetLink.closest('.mxch-nav-item'); |
| 1331 |
if (parentItem && targetLink.classList.contains('mxch-nav-sub-link')) { |
| 1332 |
parentItem.classList.add('expanded'); |
| 1333 |
} |
| 1334 |
showSection(hash); |
| 1335 |
setActiveNav(targetLink); |
| 1336 |
} |
| 1337 |
} |
| 1338 |
|
| 1339 |
// Rate limit accordion |
| 1340 |
const rateLimitHeaders = document.querySelectorAll('.mxch-rate-limit-header'); |
| 1341 |
rateLimitHeaders.forEach(header => { |
| 1342 |
header.addEventListener('click', function(e) { |
| 1343 |
e.preventDefault(); |
| 1344 |
e.stopPropagation(); |
| 1345 |
const item = this.closest('.mxch-rate-limit-item'); |
| 1346 |
item.classList.toggle('expanded'); |
| 1347 |
}); |
| 1348 |
}); |
| 1349 |
|
| 1350 |
// ===================================================== |
| 1351 |
// Mobile Menu Functionality |
| 1352 |
// ===================================================== |
| 1353 |
const mobileMenuBtn = document.querySelector('.mxch-mobile-menu-btn'); |
| 1354 |
const mobileMenuClose = document.querySelector('.mxch-mobile-menu-close'); |
| 1355 |
const mobileMenu = document.querySelector('.mxch-mobile-menu'); |
| 1356 |
const mobileOverlay = document.querySelector('.mxch-mobile-overlay'); |
| 1357 |
const mobileNavLinks = document.querySelectorAll('.mxch-mobile-nav-link, .mxch-mobile-nav-sub-link'); |
| 1358 |
|
| 1359 |
function openMobileMenu() { |
| 1360 |
mobileMenu.classList.add('open'); |
| 1361 |
mobileOverlay.classList.add('open'); |
| 1362 |
document.body.style.overflow = 'hidden'; |
| 1363 |
} |
| 1364 |
|
| 1365 |
function closeMobileMenu() { |
| 1366 |
mobileMenu.classList.remove('open'); |
| 1367 |
mobileOverlay.classList.remove('open'); |
| 1368 |
document.body.style.overflow = ''; |
| 1369 |
} |
| 1370 |
|
| 1371 |
if (mobileMenuBtn) { |
| 1372 |
mobileMenuBtn.addEventListener('click', openMobileMenu); |
| 1373 |
} |
| 1374 |
|
| 1375 |
if (mobileMenuClose) { |
| 1376 |
mobileMenuClose.addEventListener('click', closeMobileMenu); |
| 1377 |
} |
| 1378 |
|
| 1379 |
if (mobileOverlay) { |
| 1380 |
mobileOverlay.addEventListener('click', closeMobileMenu); |
| 1381 |
} |
| 1382 |
|
| 1383 |
// Mobile navigation links |
| 1384 |
mobileNavLinks.forEach(link => { |
| 1385 |
link.addEventListener('click', function(e) { |
| 1386 |
e.preventDefault(); |
| 1387 |
e.stopPropagation(); |
| 1388 |
|
| 1389 |
const target = this.dataset.target; |
| 1390 |
const parentId = this.dataset.parent; |
| 1391 |
|
| 1392 |
// If this is an expandable parent link |
| 1393 |
if (parentId && !target) { |
| 1394 |
const subNav = document.querySelector('.mxch-mobile-nav-sub[data-parent="' + parentId + '"]'); |
| 1395 |
if (subNav) { |
| 1396 |
const isExpanded = subNav.classList.contains('expanded'); |
| 1397 |
// Collapse all sub navs |
| 1398 |
document.querySelectorAll('.mxch-mobile-nav-sub').forEach(nav => { |
| 1399 |
nav.classList.remove('expanded'); |
| 1400 |
}); |
| 1401 |
document.querySelectorAll('.mxch-mobile-nav-link').forEach(l => { |
| 1402 |
l.classList.remove('expanded'); |
| 1403 |
}); |
| 1404 |
// Toggle this one |
| 1405 |
if (!isExpanded) { |
| 1406 |
subNav.classList.add('expanded'); |
| 1407 |
this.classList.add('expanded'); |
| 1408 |
} |
| 1409 |
} |
| 1410 |
} |
| 1411 |
// If this is a direct link or sub-link with a target |
| 1412 |
else if (target) { |
| 1413 |
// Update mobile nav active state |
| 1414 |
document.querySelectorAll('.mxch-mobile-nav-link, .mxch-mobile-nav-sub-link').forEach(l => { |
| 1415 |
l.classList.remove('active'); |
| 1416 |
}); |
| 1417 |
this.classList.add('active'); |
| 1418 |
|
| 1419 |
// Also update desktop sidebar nav |
| 1420 |
const desktopLink = document.querySelector('.mxch-sidebar [data-target="' + target + '"]'); |
| 1421 |
if (desktopLink) { |
| 1422 |
setActiveNav(desktopLink); |
| 1423 |
const parentItem = desktopLink.closest('.mxch-nav-item'); |
| 1424 |
if (parentItem && desktopLink.classList.contains('mxch-nav-sub-link')) { |
| 1425 |
parentItem.classList.add('expanded'); |
| 1426 |
} |
| 1427 |
} |
| 1428 |
|
| 1429 |
// Show section and close menu |
| 1430 |
showSection(target); |
| 1431 |
history.replaceState(null, null, '#' + target); |
| 1432 |
closeMobileMenu(); |
| 1433 |
} |
| 1434 |
}); |
| 1435 |
}); |
| 1436 |
|
| 1437 |
// Close mobile menu on escape key |
| 1438 |
document.addEventListener('keydown', function(e) { |
| 1439 |
if (e.key === 'Escape' && mobileMenu && mobileMenu.classList.contains('open')) { |
| 1440 |
closeMobileMenu(); |
| 1441 |
} |
| 1442 |
}); |
| 1443 |
}); |
| 1444 |
</script> |
| 1445 |
<?php |
| 1446 |
} |
| 1447 |
|
| 1448 |
/** |
| 1449 |
* Helper function to render a field with consistent wrapper |
| 1450 |
*/ |
| 1451 |
function mxchat_render_field_wrapper($id, $label, $callback, $description = '') { |
| 1452 |
?> |
| 1453 |
<div class="mxch-field"> |
| 1454 |
<label class="mxch-field-label"><?php echo esc_html($label); ?></label> |
| 1455 |
<div class="mxch-field-control"> |
| 1456 |
<?php $callback(); ?> |
| 1457 |
</div> |
| 1458 |
<?php if ($description): ?> |
| 1459 |
<p class="mxch-field-description"><?php echo esc_html($description); ?></p> |
| 1460 |
<?php endif; ?> |
| 1461 |
</div> |
| 1462 |
<?php |
| 1463 |
} |
| 1464 |
|
| 1465 |
/** |
| 1466 |
* Render rate limits as collapsible accordion |
| 1467 |
*/ |
| 1468 |
function mxchat_render_rate_limits_accordion($admin_instance) { |
| 1469 |
$all_options = get_option('mxchat_options', []); |
| 1470 |
$rate_limits = array('1', '3', '5', '10', '15', '20', '50', '100', 'unlimited'); |
| 1471 |
$timeframes = array( |
| 1472 |
'hourly' => __('Per Hour', 'mxchat'), |
| 1473 |
'daily' => __('Per Day', 'mxchat'), |
| 1474 |
'weekly' => __('Per Week', 'mxchat'), |
| 1475 |
'monthly' => __('Per Month', 'mxchat') |
| 1476 |
); |
| 1477 |
|
| 1478 |
$roles = wp_roles()->get_names(); |
| 1479 |
$roles['logged_out'] = __('Logged Out Users', 'mxchat'); |
| 1480 |
|
| 1481 |
echo '<div class="mxch-rate-limits">'; |
| 1482 |
|
| 1483 |
foreach ($roles as $role_id => $role_name) { |
| 1484 |
$default_limit = ($role_id === 'logged_out') ? '10' : '100'; |
| 1485 |
$default_timeframe = 'daily'; |
| 1486 |
$default_message = __('Rate limit exceeded. Please try again later.', 'mxchat'); |
| 1487 |
|
| 1488 |
$selected_limit = isset($all_options['rate_limits'][$role_id]['limit']) |
| 1489 |
? $all_options['rate_limits'][$role_id]['limit'] |
| 1490 |
: $default_limit; |
| 1491 |
|
| 1492 |
$selected_timeframe = isset($all_options['rate_limits'][$role_id]['timeframe']) |
| 1493 |
? $all_options['rate_limits'][$role_id]['timeframe'] |
| 1494 |
: $default_timeframe; |
| 1495 |
|
| 1496 |
$custom_message = isset($all_options['rate_limits'][$role_id]['message']) |
| 1497 |
? $all_options['rate_limits'][$role_id]['message'] |
| 1498 |
: $default_message; |
| 1499 |
|
| 1500 |
$timeframe_label = isset($timeframes[$selected_timeframe]) ? $timeframes[$selected_timeframe] : $selected_timeframe; |
| 1501 |
?> |
| 1502 |
<div class="mxch-rate-limit-item"> |
| 1503 |
<div class="mxch-rate-limit-header"> |
| 1504 |
<span class="mxch-rate-limit-role"><?php echo esc_html($role_name); ?></span> |
| 1505 |
<div class="mxch-rate-limit-summary"> |
| 1506 |
<span class="mxch-rate-limit-badge"><?php echo esc_html($selected_limit . ' / ' . $timeframe_label); ?></span> |
| 1507 |
<svg class="mxch-rate-limit-arrow" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"></polyline></svg> |
| 1508 |
</div> |
| 1509 |
</div> |
| 1510 |
<div class="mxch-rate-limit-body mxchat-autosave-section"> |
| 1511 |
<div class="mxch-rate-limit-controls"> |
| 1512 |
<div class="mxch-field"> |
| 1513 |
<label class="mxch-field-label" for="rate_limits_<?php echo esc_attr($role_id); ?>_limit"><?php esc_html_e('Limit', 'mxchat'); ?></label> |
| 1514 |
<select id="rate_limits_<?php echo esc_attr($role_id); ?>_limit" |
| 1515 |
name="mxchat_options[rate_limits][<?php echo esc_attr($role_id); ?>][limit]" |
| 1516 |
class="mxch-select mxchat-autosave-field"> |
| 1517 |
<?php foreach ($rate_limits as $limit): ?> |
| 1518 |
<option value="<?php echo esc_attr($limit); ?>" <?php selected($selected_limit, $limit); ?>><?php echo esc_html($limit); ?></option> |
| 1519 |
<?php endforeach; ?> |
| 1520 |
</select> |
| 1521 |
</div> |
| 1522 |
<div class="mxch-field"> |
| 1523 |
<label class="mxch-field-label" for="rate_limits_<?php echo esc_attr($role_id); ?>_timeframe"><?php esc_html_e('Timeframe', 'mxchat'); ?></label> |
| 1524 |
<select id="rate_limits_<?php echo esc_attr($role_id); ?>_timeframe" |
| 1525 |
name="mxchat_options[rate_limits][<?php echo esc_attr($role_id); ?>][timeframe]" |
| 1526 |
class="mxch-select mxchat-autosave-field"> |
| 1527 |
<?php foreach ($timeframes as $value => $label): ?> |
| 1528 |
<option value="<?php echo esc_attr($value); ?>" <?php selected($selected_timeframe, $value); ?>><?php echo esc_html($label); ?></option> |
| 1529 |
<?php endforeach; ?> |
| 1530 |
</select> |
| 1531 |
</div> |
| 1532 |
</div> |
| 1533 |
<div class="mxch-field"> |
| 1534 |
<label class="mxch-field-label" for="rate_limits_<?php echo esc_attr($role_id); ?>_message"><?php esc_html_e('Custom Message', 'mxchat'); ?></label> |
| 1535 |
<textarea id="rate_limits_<?php echo esc_attr($role_id); ?>_message" |
| 1536 |
name="mxchat_options[rate_limits][<?php echo esc_attr($role_id); ?>][message]" |
| 1537 |
class="mxch-textarea mxchat-autosave-field" |
| 1538 |
rows="2" |
| 1539 |
placeholder="<?php esc_attr_e('Message shown when rate limit is reached', 'mxchat'); ?>"><?php echo esc_textarea($custom_message); ?></textarea> |
| 1540 |
</div> |
| 1541 |
</div> |
| 1542 |
</div> |
| 1543 |
<?php |
| 1544 |
} |
| 1545 |
|
| 1546 |
echo '</div>'; |
| 1547 |
} |
| 1548 |
|