PluginProbe
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder / 51.1.44
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder v51.1.44
51.1.86 51.1.84 51.1.85 51.1.83 51.1.82 51.1.81 51.1.79 51.1.78 51.1.77 51.1.76 51.1.74 51.1.75 51.1.65 51.1.64 51.1.63 trunk 51.1.14 51.1.2 51.1.35 51.1.36 51.1.37 51.1.38 51.1.39 51.1.44 51.1.45 All 40 releases
king-addons / includes / extensions / Cookie_Consent / templates / admin-page.php

admin-page.php in King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder 51.1.44, at includes/extensions/Cookie_Consent/templates/admin-page.php

809 lines 49.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Cookie / Consent Bar admin page - V3 Apple-inspired Design.
4 *
5 * @var array<string, mixed> $options
6 * @var bool $is_premium
7 * @package King_Addons
8 */
9
10 if (!defined('ABSPATH')) {
11 exit;
12 }
13
14 // Enqueue shared V3 styles
15 wp_enqueue_style(
16 'king-addons-admin-v3',
17 KING_ADDONS_URL . 'includes/admin/layouts/shared/admin-v3-styles.css',
18 [],
19 KING_ADDONS_VERSION
20 );
21
22 // Enqueue WP color picker
23 wp_enqueue_style('wp-color-picker');
24 wp_enqueue_script('wp-color-picker');
25
26 $notices = [];
27 if (isset($_GET['updated'])) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
28 $notices[] = esc_html__('Settings saved.', 'king-addons');
29 }
30 if (isset($_GET['imported'])) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
31 $notices[] = esc_html__('Settings imported.', 'king-addons');
32 }
33 if (isset($_GET['logs_cleared'])) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
34 $notices[] = esc_html__('Logs cleared.', 'king-addons');
35 }
36
37 $categories = $options['categories'];
38 $empty_slots = $is_premium ? 2 : 1;
39 for ($i = 0; $i < $empty_slots; $i++) {
40 $categories[] = [
41 'key' => '',
42 'label' => '',
43 'description' => '',
44 'state' => 'off',
45 'display' => true,
46 ];
47 }
48
49 $script_rules = $options['scripts'];
50 if (count($script_rules) < 3) {
51 $script_rules = array_merge($script_rules, array_fill(0, 3 - count($script_rules), [
52 'handle' => '',
53 'category' => 'analytics',
54 'mode' => 'block',
55 ]));
56 }
57
58 // Theme mode is per-user
59 $theme_mode = get_user_meta(get_current_user_id(), 'king_addons_theme_mode', true);
60 $allowed_theme_modes = ['dark', 'light', 'auto'];
61 if (!in_array($theme_mode, $allowed_theme_modes, true)) {
62 $theme_mode = 'dark';
63 }
64 ?>
65 <script>
66 (function() {
67 const mode = '<?php echo esc_js($theme_mode); ?>';
68 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
69 const isDark = mode === 'auto' ? !!(mql && mql.matches) : mode === 'dark';
70 document.documentElement.classList.toggle('ka-v3-dark', isDark);
71 document.body && document.body.classList.add('ka-admin-v3');
72 document.body && document.body.classList.toggle('ka-v3-dark', isDark);
73 })();
74 </script>
75
76 <div class="ka-admin-wrap">
77 <!-- Header -->
78 <div class="ka-admin-header">
79 <div class="ka-admin-header-left">
80 <div class="ka-admin-header-icon">
81 <span class="dashicons dashicons-shield"></span>
82 </div>
83 <div>
84 <h1 class="ka-admin-title"><?php esc_html_e('Cookie Consent', 'king-addons'); ?></h1>
85 <p class="ka-admin-subtitle"><?php esc_html_e('GDPR & CCPA compliant consent management', 'king-addons'); ?></p>
86 </div>
87 </div>
88 <div class="ka-admin-header-actions">
89 <div class="ka-v3-segmented" id="ka-v3-theme-segment" role="radiogroup" aria-label="Theme" data-active="<?php echo esc_attr($theme_mode); ?>">
90 <span class="ka-v3-segmented-indicator" aria-hidden="true"></span>
91 <button type="button" class="ka-v3-segmented-btn" data-theme="light" aria-pressed="<?php echo $theme_mode === 'light' ? 'true' : 'false'; ?>"><?php esc_html_e('Light', 'king-addons'); ?></button>
92 <button type="button" class="ka-v3-segmented-btn" data-theme="dark" aria-pressed="<?php echo $theme_mode === 'dark' ? 'true' : 'false'; ?>"><?php esc_html_e('Dark', 'king-addons'); ?></button>
93 <button type="button" class="ka-v3-segmented-btn" data-theme="auto" aria-pressed="<?php echo $theme_mode === 'auto' ? 'true' : 'false'; ?>"><?php esc_html_e('Auto', 'king-addons'); ?></button>
94 </div>
95 <span class="ka-status <?php echo $options['enabled'] ? 'ka-status-enabled' : 'ka-status-disabled'; ?>">
96 <span class="ka-status-dot"></span>
97 <?php echo $options['enabled'] ? esc_html__('Enabled', 'king-addons') : esc_html__('Disabled', 'king-addons'); ?>
98 </span>
99 </div>
100 </div>
101
102 <!-- Notices -->
103 <?php foreach ($notices as $notice): ?>
104 <div class="ka-card" style="background: rgba(52, 199, 89, 0.1); border: 1px solid rgba(52, 199, 89, 0.3); margin-bottom: 20px;">
105 <div class="ka-card-body" style="padding: 16px 24px; display: flex; align-items: center; gap: 12px;">
106 <span class="dashicons dashicons-yes-alt" style="color: #34c759;"></span>
107 <span style="color: #34c759; font-weight: 500;"><?php echo esc_html($notice); ?></span>
108 </div>
109 </div>
110 <?php endforeach; ?>
111
112 <!-- Tabs -->
113 <div class="ka-tabs">
114 <button type="button" class="ka-tab active" data-tab="general"><?php esc_html_e('General', 'king-addons'); ?></button>
115 <button type="button" class="ka-tab" data-tab="content"><?php esc_html_e('Content', 'king-addons'); ?></button>
116 <button type="button" class="ka-tab" data-tab="categories"><?php esc_html_e('Categories', 'king-addons'); ?></button>
117 <button type="button" class="ka-tab" data-tab="design"><?php esc_html_e('Design', 'king-addons'); ?></button>
118 <button type="button" class="ka-tab" data-tab="scripts"><?php esc_html_e('Scripts', 'king-addons'); ?></button>
119 <button type="button" class="ka-tab" data-tab="behavior"><?php esc_html_e('Behavior', 'king-addons'); ?></button>
120 <button type="button" class="ka-tab" data-tab="advanced"><?php esc_html_e('Advanced', 'king-addons'); ?></button>
121 <button type="button" class="ka-tab" data-tab="logs">
122 <?php esc_html_e('Logs', 'king-addons'); ?>
123 <?php if (!$is_premium): ?><span class="ka-pro-badge">PRO</span><?php endif; ?>
124 </button>
125 </div>
126
127 <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
128 <?php wp_nonce_field('king_addons_cookie_consent_save'); ?>
129 <input type="hidden" name="action" value="king_addons_cookie_consent_save">
130
131 <!-- General Tab -->
132 <div class="ka-tab-content active" data-tab="general">
133 <div class="ka-card">
134 <div class="ka-card-header">
135 <span class="dashicons dashicons-admin-settings"></span>
136 <h2><?php esc_html_e('General Settings', 'king-addons'); ?></h2>
137 </div>
138 <div class="ka-card-body">
139 <div class="ka-row">
140 <div class="ka-row-label"><?php esc_html_e('Enable', 'king-addons'); ?></div>
141 <div class="ka-row-field">
142 <label class="ka-toggle">
143 <input type="checkbox" name="enabled" value="1" <?php checked($options['enabled']); ?>>
144 <span class="ka-toggle-slider"></span>
145 <span class="ka-toggle-label"><?php esc_html_e('Show consent banner', 'king-addons'); ?></span>
146 </label>
147 </div>
148 </div>
149 <div class="ka-row">
150 <div class="ka-row-label"><?php esc_html_e('Mode', 'king-addons'); ?></div>
151 <div class="ka-row-field">
152 <select name="mode">
153 <option value="gdpr" <?php selected($options['mode'], 'gdpr'); ?>><?php esc_html_e('GDPR (EU)', 'king-addons'); ?></option>
154 <option value="ccpa" <?php selected($options['mode'], 'ccpa'); ?>><?php esc_html_e('CCPA (California)', 'king-addons'); ?></option>
155 <option value="simple" <?php selected($options['mode'], 'simple'); ?>><?php esc_html_e('Simple banner', 'king-addons'); ?></option>
156 </select>
157 </div>
158 </div>
159 <div class="ka-row">
160 <div class="ka-row-label"><?php esc_html_e('Region', 'king-addons'); ?></div>
161 <div class="ka-row-field">
162 <select name="region_targeting" <?php disabled(!$is_premium && $options['region_targeting'] !== 'all'); ?>>
163 <option value="all" <?php selected($options['region_targeting'], 'all'); ?>><?php esc_html_e('All visitors', 'king-addons'); ?></option>
164 <option value="eu" <?php selected($options['region_targeting'], 'eu'); ?> <?php disabled(!$is_premium); ?>><?php esc_html_e('EU only', 'king-addons'); ?></option>
165 <option value="us" <?php selected($options['region_targeting'], 'us'); ?> <?php disabled(!$is_premium); ?>><?php esc_html_e('US only', 'king-addons'); ?></option>
166 <option value="custom" <?php selected($options['region_targeting'], 'custom'); ?> <?php disabled(!$is_premium); ?>><?php esc_html_e('Custom', 'king-addons'); ?></option>
167 </select>
168 <?php if (!$is_premium): ?>
169 <p class="ka-row-desc"><?php esc_html_e('Pro: Geo-targeting with cached lookup', 'king-addons'); ?></p>
170 <?php endif; ?>
171 </div>
172 </div>
173 <div class="ka-row">
174 <div class="ka-row-label"><?php esc_html_e('Consent Lifetime', 'king-addons'); ?></div>
175 <div class="ka-row-field">
176 <select name="consent_lifetime">
177 <option value="30" <?php selected($options['consent_lifetime'], '30'); ?>><?php esc_html_e('1 month', 'king-addons'); ?></option>
178 <option value="90" <?php selected($options['consent_lifetime'], '90'); ?>><?php esc_html_e('3 months', 'king-addons'); ?></option>
179 <option value="180" <?php selected($options['consent_lifetime'], '180'); ?>><?php esc_html_e('6 months', 'king-addons'); ?></option>
180 <option value="365" <?php selected($options['consent_lifetime'], '365'); ?>><?php esc_html_e('1 year', 'king-addons'); ?></option>
181 </select>
182 </div>
183 </div>
184 <div class="ka-row">
185 <div class="ka-row-label"><?php esc_html_e('Policy Version', 'king-addons'); ?></div>
186 <div class="ka-row-field">
187 <input type="text" name="policy_version" value="<?php echo esc_attr($options['policy_version']); ?>" style="max-width: 100px;">
188 <p class="ka-row-desc"><?php esc_html_e('Increase to re-show banner after policy update', 'king-addons'); ?></p>
189 </div>
190 </div>
191 </div>
192 </div>
193 </div>
194
195 <!-- Content Tab -->
196 <div class="ka-tab-content" data-tab="content">
197 <div class="ka-card">
198 <div class="ka-card-header">
199 <span class="dashicons dashicons-edit"></span>
200 <h2><?php esc_html_e('Banner Content', 'king-addons'); ?></h2>
201 </div>
202 <div class="ka-card-body">
203 <div class="ka-row">
204 <div class="ka-row-label"><?php esc_html_e('Template', 'king-addons'); ?></div>
205 <div class="ka-row-field">
206 <select name="template">
207 <option value="gdpr_minimal" <?php selected($options['template'], 'gdpr_minimal'); ?>><?php esc_html_e('GDPR Minimal', 'king-addons'); ?></option>
208 <option value="ccpa_minimal" <?php selected($options['template'], 'ccpa_minimal'); ?>><?php esc_html_e('CCPA Minimal', 'king-addons'); ?></option>
209 <option value="custom" <?php selected($options['template'], 'custom'); ?>><?php esc_html_e('Custom', 'king-addons'); ?></option>
210 </select>
211 </div>
212 </div>
213 <div class="ka-row">
214 <div class="ka-row-label"><?php esc_html_e('Title', 'king-addons'); ?></div>
215 <div class="ka-row-field">
216 <input type="text" name="content[title]" value="<?php echo esc_attr($options['content']['title']); ?>">
217 </div>
218 </div>
219 <div class="ka-row">
220 <div class="ka-row-label"><?php esc_html_e('Message', 'king-addons'); ?></div>
221 <div class="ka-row-field">
222 <textarea name="content[message]" rows="3" style="max-width: 100%;"><?php echo esc_textarea($options['content']['message']); ?></textarea>
223 </div>
224 </div>
225 <div class="ka-row">
226 <div class="ka-row-label"><?php esc_html_e('Privacy Link', 'king-addons'); ?></div>
227 <div class="ka-row-field">
228 <div class="ka-grid-2">
229 <div>
230 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('URL', 'king-addons'); ?></label>
231 <input type="url" name="content[privacy_url]" value="<?php echo esc_attr($options['content']['privacy_url']); ?>">
232 </div>
233 <div>
234 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Label', 'king-addons'); ?></label>
235 <input type="text" name="content[privacy_label]" value="<?php echo esc_attr($options['content']['privacy_label']); ?>">
236 </div>
237 </div>
238 </div>
239 </div>
240 <div class="ka-row">
241 <div class="ka-row-label"><?php esc_html_e('Cookie Policy', 'king-addons'); ?></div>
242 <div class="ka-row-field">
243 <div class="ka-grid-2">
244 <div>
245 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('URL', 'king-addons'); ?></label>
246 <input type="url" name="content[cookie_url]" value="<?php echo esc_attr($options['content']['cookie_url']); ?>">
247 </div>
248 <div>
249 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Label', 'king-addons'); ?></label>
250 <input type="text" name="content[cookie_label]" value="<?php echo esc_attr($options['content']['cookie_label']); ?>">
251 </div>
252 </div>
253 </div>
254 </div>
255 <div class="ka-row">
256 <div class="ka-row-label"><?php esc_html_e('Button Text', 'king-addons'); ?></div>
257 <div class="ka-row-field">
258 <div class="ka-grid-2">
259 <div>
260 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Accept', 'king-addons'); ?></label>
261 <input type="text" name="buttons[accept]" value="<?php echo esc_attr($options['buttons']['accept']); ?>">
262 </div>
263 <div>
264 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Reject', 'king-addons'); ?></label>
265 <input type="text" name="buttons[reject]" value="<?php echo esc_attr($options['buttons']['reject']); ?>">
266 </div>
267 <div>
268 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Settings', 'king-addons'); ?></label>
269 <input type="text" name="buttons[settings]" value="<?php echo esc_attr($options['buttons']['settings']); ?>">
270 </div>
271 <div>
272 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php esc_html_e('Save', 'king-addons'); ?></label>
273 <input type="text" name="buttons[save]" value="<?php echo esc_attr($options['buttons']['save']); ?>">
274 </div>
275 </div>
276 </div>
277 </div>
278 </div>
279 </div>
280 </div>
281
282 <!-- Categories Tab -->
283 <div class="ka-tab-content" data-tab="categories">
284 <div class="ka-card">
285 <div class="ka-card-header">
286 <span class="dashicons dashicons-category"></span>
287 <h2><?php esc_html_e('Cookie Categories', 'king-addons'); ?></h2>
288 </div>
289 <div class="ka-card-body">
290 <p class="ka-row-desc" style="margin: 0 0 20px;"><?php esc_html_e('Define consent categories. "Necessary" is always required.', 'king-addons'); ?></p>
291 <table class="ka-table">
292 <thead>
293 <tr>
294 <th style="width: 15%;"><?php esc_html_e('Key', 'king-addons'); ?></th>
295 <th style="width: 20%;"><?php esc_html_e('Label', 'king-addons'); ?></th>
296 <th><?php esc_html_e('Description', 'king-addons'); ?></th>
297 <th style="width: 15%;"><?php esc_html_e('Default', 'king-addons'); ?></th>
298 <th style="width: 10%;"><?php esc_html_e('Show', 'king-addons'); ?></th>
299 </tr>
300 </thead>
301 <tbody>
302 <?php foreach ($categories as $index => $category): ?>
303 <tr>
304 <td><input type="text" name="categories[<?php echo esc_attr($index); ?>][key]" value="<?php echo esc_attr($category['key']); ?>" <?php disabled($category['key'] === 'necessary'); ?>></td>
305 <td><input type="text" name="categories[<?php echo esc_attr($index); ?>][label]" value="<?php echo esc_attr($category['label']); ?>"></td>
306 <td><textarea name="categories[<?php echo esc_attr($index); ?>][description]" rows="2"><?php echo esc_textarea($category['description']); ?></textarea></td>
307 <td>
308 <select name="categories[<?php echo esc_attr($index); ?>][state]" <?php disabled($category['key'] === 'necessary'); ?>>
309 <option value="required" <?php selected($category['state'], 'required'); ?>><?php esc_html_e('Required', 'king-addons'); ?></option>
310 <option value="on" <?php selected($category['state'], 'on'); ?>><?php esc_html_e('On', 'king-addons'); ?></option>
311 <option value="off" <?php selected($category['state'], 'off'); ?>><?php esc_html_e('Off', 'king-addons'); ?></option>
312 </select>
313 </td>
314 <td style="text-align: center;"><input type="checkbox" name="categories[<?php echo esc_attr($index); ?>][display]" value="1" <?php checked($category['display']); ?>></td>
315 </tr>
316 <?php endforeach; ?>
317 </tbody>
318 </table>
319 </div>
320 </div>
321 </div>
322
323 <!-- Design Tab -->
324 <div class="ka-tab-content" data-tab="design">
325 <div class="ka-card">
326 <div class="ka-card-header">
327 <span class="dashicons dashicons-art pink"></span>
328 <h2><?php esc_html_e('Appearance', 'king-addons'); ?></h2>
329 </div>
330 <div class="ka-card-body">
331 <div class="ka-row">
332 <div class="ka-row-label"><?php esc_html_e('Layout', 'king-addons'); ?></div>
333 <div class="ka-row-field">
334 <select name="design[layout]">
335 <option value="bottom-bar" <?php selected($options['design']['layout'], 'bottom-bar'); ?>><?php esc_html_e('Bottom bar', 'king-addons'); ?></option>
336 <option value="top-bar" <?php selected($options['design']['layout'], 'top-bar'); ?>><?php esc_html_e('Top bar', 'king-addons'); ?></option>
337 <option value="bottom-left" <?php selected($options['design']['layout'], 'bottom-left'); ?>><?php esc_html_e('Bottom left', 'king-addons'); ?></option>
338 <option value="bottom-right" <?php selected($options['design']['layout'], 'bottom-right'); ?>><?php esc_html_e('Bottom right', 'king-addons'); ?></option>
339 <option value="modal" <?php selected($options['design']['layout'], 'modal'); ?> <?php disabled(!$is_premium); ?>><?php esc_html_e('Modal', 'king-addons'); ?><?php if (!$is_premium): ?> (Pro)<?php endif; ?></option>
340 </select>
341 </div>
342 </div>
343 <div class="ka-row">
344 <div class="ka-row-label"><?php esc_html_e('Preset', 'king-addons'); ?></div>
345 <div class="ka-row-field">
346 <select name="design[preset]">
347 <option value="light" <?php selected($options['design']['preset'], 'light'); ?>><?php esc_html_e('Light', 'king-addons'); ?></option>
348 <option value="dark" <?php selected($options['design']['preset'], 'dark'); ?>><?php esc_html_e('Dark', 'king-addons'); ?></option>
349 <option value="minimal" <?php selected($options['design']['preset'], 'minimal'); ?>><?php esc_html_e('Minimal', 'king-addons'); ?></option>
350 </select>
351 </div>
352 </div>
353 <div class="ka-row">
354 <div class="ka-row-label"><?php esc_html_e('Colors', 'king-addons'); ?></div>
355 <div class="ka-row-field">
356 <div class="ka-grid-2" style="gap: 16px;">
357 <?php foreach ($options['design']['colors'] as $color_key => $color_value): ?>
358 <div>
359 <label style="font-size: 12px; color: #86868b; display: block; margin-bottom: 6px;"><?php echo esc_html(ucwords(str_replace('_', ' ', $color_key))); ?></label>
360 <input type="text" class="ka-color-picker" name="design[colors][<?php echo esc_attr($color_key); ?>]" value="<?php echo esc_attr($color_value); ?>">
361 </div>
362 <?php endforeach; ?>
363 </div>
364 </div>
365 </div>
366 <div class="ka-row">
367 <div class="ka-row-label"><?php esc_html_e('Border Radius', 'king-addons'); ?></div>
368 <div class="ka-row-field">
369 <input type="number" min="0" name="design[border_radius]" value="<?php echo esc_attr($options['design']['border_radius']); ?>" style="max-width: 100px;">
370 <span style="color: #86868b; margin-left: 8px;">px</span>
371 </div>
372 </div>
373 <div class="ka-row">
374 <div class="ka-row-label"><?php esc_html_e('Shadow', 'king-addons'); ?></div>
375 <div class="ka-row-field">
376 <label class="ka-toggle">
377 <input type="checkbox" name="design[shadow]" value="1" <?php checked($options['design']['shadow']); ?>>
378 <span class="ka-toggle-slider"></span>
379 <span class="ka-toggle-label"><?php esc_html_e('Enable shadow', 'king-addons'); ?></span>
380 </label>
381 </div>
382 </div>
383 <div class="ka-row">
384 <div class="ka-row-label"><?php esc_html_e('Animation', 'king-addons'); ?></div>
385 <div class="ka-row-field">
386 <select name="design[animation]">
387 <option value="fade" <?php selected($options['design']['animation'], 'fade'); ?>><?php esc_html_e('Fade', 'king-addons'); ?></option>
388 <option value="slide-up" <?php selected($options['design']['animation'], 'slide-up'); ?>><?php esc_html_e('Slide up', 'king-addons'); ?></option>
389 <option value="slide-down" <?php selected($options['design']['animation'], 'slide-down'); ?>><?php esc_html_e('Slide down', 'king-addons'); ?></option>
390 </select>
391 </div>
392 </div>
393 </div>
394 </div>
395 </div>
396
397 <!-- Scripts Tab -->
398 <div class="ka-tab-content" data-tab="scripts">
399 <div class="ka-card">
400 <div class="ka-card-header">
401 <span class="dashicons dashicons-editor-code"></span>
402 <h2><?php esc_html_e('Script Blocking', 'king-addons'); ?></h2>
403 </div>
404 <div class="ka-card-body">
405 <p class="ka-row-desc" style="margin: 0 0 20px;"><?php esc_html_e('Block scripts until consent is granted. Free: up to 3 rules.', 'king-addons'); ?></p>
406 <table class="ka-table">
407 <thead>
408 <tr>
409 <th><?php esc_html_e('Script Handle', 'king-addons'); ?></th>
410 <th><?php esc_html_e('Category', 'king-addons'); ?></th>
411 <th><?php esc_html_e('Mode', 'king-addons'); ?></th>
412 </tr>
413 </thead>
414 <tbody>
415 <?php $row_index = 0; ?>
416 <?php foreach ($script_rules as $rule): ?>
417 <?php if (!$is_premium && $row_index >= 3) { break; } ?>
418 <tr>
419 <td><input type="text" name="scripts[<?php echo esc_attr($row_index); ?>][handle]" value="<?php echo esc_attr($rule['handle']); ?>" placeholder="google-analytics"></td>
420 <td>
421 <select name="scripts[<?php echo esc_attr($row_index); ?>][category]">
422 <option value="analytics" <?php selected($rule['category'], 'analytics'); ?>><?php esc_html_e('Analytics', 'king-addons'); ?></option>
423 <option value="marketing" <?php selected($rule['category'], 'marketing'); ?>><?php esc_html_e('Marketing', 'king-addons'); ?></option>
424 <option value="other" <?php selected($rule['category'], 'other'); ?>><?php esc_html_e('Other', 'king-addons'); ?></option>
425 </select>
426 </td>
427 <td>
428 <select name="scripts[<?php echo esc_attr($row_index); ?>][mode]">
429 <option value="block" <?php selected($rule['mode'], 'block'); ?>><?php esc_html_e('Block until accepted', 'king-addons'); ?></option>
430 <option value="allow" <?php selected($rule['mode'], 'allow'); ?>><?php esc_html_e('Load if accepted', 'king-addons'); ?></option>
431 </select>
432 </td>
433 </tr>
434 <?php $row_index++; ?>
435 <?php endforeach; ?>
436 </tbody>
437 </table>
438 </div>
439 </div>
440 </div>
441
442 <!-- Behavior Tab -->
443 <div class="ka-tab-content" data-tab="behavior">
444 <div class="ka-card">
445 <div class="ka-card-header">
446 <span class="dashicons dashicons-admin-page"></span>
447 <h2><?php esc_html_e('Behavior Settings', 'king-addons'); ?></h2>
448 </div>
449 <div class="ka-card-body">
450 <div class="ka-row">
451 <div class="ka-row-label"><?php esc_html_e('Show On', 'king-addons'); ?></div>
452 <div class="ka-row-field">
453 <select name="behavior[show_on]" <?php disabled(!$is_premium && $options['behavior']['show_on'] !== 'all'); ?>>
454 <option value="all" <?php selected($options['behavior']['show_on'], 'all'); ?>><?php esc_html_e('All pages', 'king-addons'); ?></option>
455 <option value="include" <?php selected($options['behavior']['show_on'], 'include'); ?> <?php disabled(!$is_premium); ?>><?php esc_html_e('Only specific pages', 'king-addons'); ?><?php if (!$is_premium): ?> (Pro)<?php endif; ?></option>
456 <option value="exclude" <?php selected($options['behavior']['show_on'], 'exclude'); ?> <?php disabled(!$is_premium); ?>><?php esc_html_e('All except', 'king-addons'); ?><?php if (!$is_premium): ?> (Pro)<?php endif; ?></option>
457 </select>
458 <?php if ($is_premium): ?>
459 <p class="ka-row-desc"><?php esc_html_e('Comma-separated page IDs', 'king-addons'); ?></p>
460 <textarea name="behavior[include_pages]" rows="2" style="max-width: 300px; margin-top: 8px;"><?php echo esc_textarea($options['behavior']['include_pages']); ?></textarea>
461 <textarea name="behavior[exclude_pages]" rows="2" style="max-width: 300px; margin-top: 4px;"><?php echo esc_textarea($options['behavior']['exclude_pages']); ?></textarea>
462 <?php else: ?>
463 <input type="hidden" name="behavior[include_pages]" value="<?php echo esc_attr($options['behavior']['include_pages']); ?>">
464 <input type="hidden" name="behavior[exclude_pages]" value="<?php echo esc_attr($options['behavior']['exclude_pages']); ?>">
465 <?php endif; ?>
466 </div>
467 </div>
468 <div class="ka-row">
469 <div class="ka-row-label"><?php esc_html_e('Resurface', 'king-addons'); ?></div>
470 <div class="ka-row-field">
471 <select name="behavior[resurface]">
472 <option value="version" <?php selected($options['behavior']['resurface'], 'version'); ?>><?php esc_html_e('On policy version change', 'king-addons'); ?></option>
473 <option value="never" <?php selected($options['behavior']['resurface'], 'never'); ?>><?php esc_html_e('Never', 'king-addons'); ?></option>
474 </select>
475 </div>
476 </div>
477 <div class="ka-row">
478 <div class="ka-row-label"><?php esc_html_e('Consent Triggers', 'king-addons'); ?></div>
479 <div class="ka-row-field">
480 <label class="ka-toggle" style="margin-bottom: 16px;">
481 <input type="checkbox" name="behavior[scroll_consent]" value="1" <?php checked($options['behavior']['scroll_consent']); ?> <?php disabled(!$is_premium); ?>>
482 <span class="ka-toggle-slider"></span>
483 <span class="ka-toggle-label"><?php esc_html_e('Scroll = consent', 'king-addons'); ?><?php if (!$is_premium): ?> <span class="ka-pro-badge">PRO</span><?php endif; ?></span>
484 </label>
485 <br>
486 <label class="ka-toggle">
487 <input type="checkbox" name="behavior[click_consent]" value="1" <?php checked($options['behavior']['click_consent']); ?> <?php disabled(!$is_premium); ?>>
488 <span class="ka-toggle-slider"></span>
489 <span class="ka-toggle-label"><?php esc_html_e('Click outside = consent', 'king-addons'); ?><?php if (!$is_premium): ?> <span class="ka-pro-badge">PRO</span><?php endif; ?></span>
490 </label>
491 </div>
492 </div>
493 </div>
494 </div>
495 </div>
496
497 <!-- Advanced Tab -->
498 <div class="ka-tab-content" data-tab="advanced">
499 <div class="ka-card">
500 <div class="ka-card-header">
501 <span class="dashicons dashicons-admin-tools"></span>
502 <h2><?php esc_html_e('Advanced Settings', 'king-addons'); ?></h2>
503 </div>
504 <div class="ka-card-body">
505 <div class="ka-row">
506 <div class="ka-row-label"><?php esc_html_e('Cookie Name', 'king-addons'); ?></div>
507 <div class="ka-row-field">
508 <input type="text" name="advanced[cookie_name]" value="<?php echo esc_attr($options['advanced']['cookie_name']); ?>" style="max-width: 200px;">
509 </div>
510 </div>
511 <div class="ka-row">
512 <div class="ka-row-label"><?php esc_html_e('Cookie Path', 'king-addons'); ?></div>
513 <div class="ka-row-field">
514 <input type="text" name="advanced[cookie_path]" value="<?php echo esc_attr($options['advanced']['cookie_path']); ?>" style="max-width: 100px;">
515 </div>
516 </div>
517 <div class="ka-row">
518 <div class="ka-row-label"><?php esc_html_e('SameSite', 'king-addons'); ?></div>
519 <div class="ka-row-field">
520 <select name="advanced[same_site]">
521 <option value="Lax" <?php selected($options['advanced']['same_site'], 'Lax'); ?>>Lax</option>
522 <option value="Strict" <?php selected($options['advanced']['same_site'], 'Strict'); ?>>Strict</option>
523 </select>
524 </div>
525 </div>
526 <div class="ka-row">
527 <div class="ka-row-label"><?php esc_html_e('Secure Only', 'king-addons'); ?></div>
528 <div class="ka-row-field">
529 <label class="ka-toggle">
530 <input type="checkbox" name="advanced[secure]" value="1" <?php checked($options['advanced']['secure']); ?>>
531 <span class="ka-toggle-slider"></span>
532 <span class="ka-toggle-label"><?php esc_html_e('HTTPS only', 'king-addons'); ?></span>
533 </label>
534 </div>
535 </div>
536 <div class="ka-row">
537 <div class="ka-row-label"><?php esc_html_e('Cookie Domain', 'king-addons'); ?></div>
538 <div class="ka-row-field">
539 <input type="text" name="advanced[cookie_domain]" value="<?php echo esc_attr($options['advanced']['cookie_domain']); ?>" placeholder="example.com" style="max-width: 200px;">
540 </div>
541 </div>
542 <div class="ka-row">
543 <div class="ka-row-label"><?php esc_html_e('Storage', 'king-addons'); ?></div>
544 <div class="ka-row-field">
545 <select name="advanced[storage]">
546 <option value="cookie" <?php selected($options['advanced']['storage'], 'cookie'); ?>><?php esc_html_e('Cookie', 'king-addons'); ?></option>
547 <option value="local" <?php selected($options['advanced']['storage'], 'local'); ?> <?php disabled(!$is_premium); ?>><?php esc_html_e('Local Storage', 'king-addons'); ?><?php if (!$is_premium): ?> (Pro)<?php endif; ?></option>
548 </select>
549 </div>
550 </div>
551 <div class="ka-row">
552 <div class="ka-row-label"><?php esc_html_e('Data Attributes', 'king-addons'); ?></div>
553 <div class="ka-row-field">
554 <label class="ka-toggle">
555 <input type="checkbox" name="data_attribute_support" value="1" <?php checked($options['data_attribute_support']); ?> <?php disabled(!$is_premium); ?>>
556 <span class="ka-toggle-slider"></span>
557 <span class="ka-toggle-label"><?php esc_html_e('Enable data-attribute activation', 'king-addons'); ?><?php if (!$is_premium): ?> <span class="ka-pro-badge">PRO</span><?php endif; ?></span>
558 </label>
559 </div>
560 </div>
561 </div>
562 </div>
563
564 <?php if ($is_premium): ?>
565 <div class="ka-card">
566 <div class="ka-card-header">
567 <span class="dashicons dashicons-migrate"></span>
568 <h2><?php esc_html_e('Import / Export', 'king-addons'); ?></h2>
569 </div>
570 <div class="ka-card-body">
571 <div class="ka-row">
572 <div class="ka-row-label"><?php esc_html_e('Export', 'king-addons'); ?></div>
573 <div class="ka-row-field">
574 <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" style="display: inline;">
575 <?php wp_nonce_field('king_addons_cookie_consent_export'); ?>
576 <input type="hidden" name="action" value="king_addons_cookie_consent_export">
577 <button type="submit" class="ka-btn ka-btn-secondary ka-btn-sm"><?php esc_html_e('Download JSON', 'king-addons'); ?></button>
578 </form>
579 </div>
580 </div>
581 <div class="ka-row">
582 <div class="ka-row-label"><?php esc_html_e('Import', 'king-addons'); ?></div>
583 <div class="ka-row-field">
584 <form method="post" enctype="multipart/form-data" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
585 <?php wp_nonce_field('king_addons_cookie_consent_import'); ?>
586 <input type="hidden" name="action" value="king_addons_cookie_consent_import">
587 <input type="file" name="king_addons_cookie_import" accept="application/json" style="margin-bottom: 12px;">
588 <br>
589 <button type="submit" class="ka-btn ka-btn-secondary ka-btn-sm"><?php esc_html_e('Import JSON', 'king-addons'); ?></button>
590 </form>
591 </div>
592 </div>
593 </div>
594 </div>
595 <?php endif; ?>
596 </div>
597
598 <!-- Logs Tab -->
599 <div class="ka-tab-content" data-tab="logs">
600 <?php if (!$is_premium): ?>
601 <div class="ka-pro-notice">
602 <h2><?php esc_html_e('Consent Analytics', 'king-addons'); ?></h2>
603 <p><?php esc_html_e('Upgrade to Pro to track consent rates and manage logs.', 'king-addons'); ?></p>
604 <a href="https://kingaddons.com/pricing/" target="_blank" class="ka-btn ka-btn-pink"><?php esc_html_e('Upgrade Now', 'king-addons'); ?></a>
605 </div>
606 <?php else: ?>
607 <div class="ka-card">
608 <div class="ka-card-header">
609 <span class="dashicons dashicons-chart-bar pink"></span>
610 <h2><?php esc_html_e('Consent Analytics', 'king-addons'); ?></h2>
611 </div>
612 <div class="ka-card-body">
613 <div class="ka-row">
614 <div class="ka-row-label"><?php esc_html_e('Enable Logs', 'king-addons'); ?></div>
615 <div class="ka-row-field">
616 <label class="ka-toggle">
617 <input type="checkbox" name="logs[enabled]" value="1" <?php checked($options['logs']['enabled']); ?>>
618 <span class="ka-toggle-slider"></span>
619 <span class="ka-toggle-label"><?php esc_html_e('Record consent events', 'king-addons'); ?></span>
620 </label>
621 </div>
622 </div>
623 <div class="ka-row">
624 <div class="ka-row-label"><?php esc_html_e('Retention', 'king-addons'); ?></div>
625 <div class="ka-row-field">
626 <input type="number" name="logs[retention]" value="<?php echo esc_attr($options['logs']['retention']); ?>" min="30" style="max-width: 100px;">
627 <span style="color: #86868b; margin-left: 8px;"><?php esc_html_e('days', 'king-addons'); ?></span>
628 </div>
629 </div>
630
631 <?php
632 global $wpdb;
633 $table = $wpdb->prefix . \King_Addons\Cookie_Consent::LOG_TABLE;
634 $totals = ['accept' => 0, 'reject' => 0, 'custom' => 0];
635 if ($wpdb->get_var($wpdb->prepare('SHOW TABLES LIKE %s', $table)) === $table) {
636 $rows = $wpdb->get_results("SELECT action, COUNT(*) as total FROM {$table} GROUP BY action", ARRAY_A);
637 foreach ((array) $rows as $row) {
638 $totals[$row['action']] = (int) $row['total'];
639 }
640 }
641 ?>
642
643 <div class="ka-stats-grid" style="margin-top: 20px;">
644 <div class="ka-stat-card">
645 <div class="ka-stat-label"><?php esc_html_e('Accepted', 'king-addons'); ?></div>
646 <div class="ka-stat-value good"><?php echo esc_html($totals['accept']); ?></div>
647 </div>
648 <div class="ka-stat-card">
649 <div class="ka-stat-label"><?php esc_html_e('Rejected', 'king-addons'); ?></div>
650 <div class="ka-stat-value"><?php echo esc_html($totals['reject']); ?></div>
651 </div>
652 <div class="ka-stat-card">
653 <div class="ka-stat-label"><?php esc_html_e('Customized', 'king-addons'); ?></div>
654 <div class="ka-stat-value"><?php echo esc_html($totals['custom']); ?></div>
655 </div>
656 </div>
657
658 <div class="ka-row">
659 <div class="ka-row-label"><?php esc_html_e('Clear Logs', 'king-addons'); ?></div>
660 <div class="ka-row-field">
661 <form method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>" style="display: flex; gap: 12px; align-items: center;">
662 <?php wp_nonce_field('king_addons_cookie_consent_clear_logs'); ?>
663 <input type="hidden" name="action" value="king_addons_cookie_consent_clear_logs">
664 <select name="retention" style="max-width: 200px;">
665 <option value="30"><?php esc_html_e('Older than 30 days', 'king-addons'); ?></option>
666 <option value="90"><?php esc_html_e('Older than 90 days', 'king-addons'); ?></option>
667 <option value="365"><?php esc_html_e('Older than 1 year', 'king-addons'); ?></option>
668 <option value="all"><?php esc_html_e('All logs', 'king-addons'); ?></option>
669 </select>
670 <button type="submit" class="ka-btn ka-btn-secondary ka-btn-sm"><?php esc_html_e('Clear', 'king-addons'); ?></button>
671 </form>
672 </div>
673 </div>
674 </div>
675 </div>
676 <?php endif; ?>
677 </div>
678
679 <!-- Submit -->
680 <div class="ka-card">
681 <div class="ka-submit">
682 <button type="submit" class="ka-btn ka-btn-primary"><?php esc_html_e('Save Settings', 'king-addons'); ?></button>
683 </div>
684 </div>
685 </form>
686 </div>
687
688 <script>
689 (function($) {
690 'use strict';
691
692 // Tab navigation
693 const tabs = document.querySelectorAll('.ka-tab');
694 const contents = document.querySelectorAll('.ka-tab-content');
695
696 tabs.forEach(tab => {
697 tab.addEventListener('click', function(e) {
698 e.preventDefault();
699 const target = this.dataset.tab;
700 tabs.forEach(t => t.classList.remove('active'));
701 contents.forEach(c => c.classList.remove('active'));
702 this.classList.add('active');
703 document.querySelector(`.ka-tab-content[data-tab="${target}"]`).classList.add('active');
704 });
705 });
706
707 // Color pickers
708 $(document).ready(function() {
709 if ($.fn.wpColorPicker) {
710 $('.ka-color-picker').wpColorPicker();
711 }
712 });
713 })(jQuery);
714
715 // Theme segmented control (dashboard-style)
716 (function() {
717 const ajaxUrl = '<?php echo esc_url(admin_url('admin-ajax.php')); ?>';
718 const nonce = '<?php echo esc_js(wp_create_nonce('king_addons_dashboard_ui')); ?>';
719 const segment = document.getElementById('ka-v3-theme-segment');
720 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
721 let mode = (segment && segment.getAttribute('data-active') ? segment.getAttribute('data-active') : 'dark').toString();
722 let mqlHandler = null;
723
724 function saveUISetting(key, value) {
725 const body = new URLSearchParams();
726 body.set('action', 'king_addons_save_dashboard_ui');
727 body.set('nonce', nonce);
728 body.set('key', key);
729 body.set('value', value);
730 fetch(ajaxUrl, {
731 method: 'POST',
732 headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
733 body: body.toString()
734 });
735 }
736
737 function updateSegment(activeMode) {
738 if (!segment) {
739 return;
740 }
741 segment.setAttribute('data-active', activeMode);
742 segment.querySelectorAll('.ka-v3-segmented-btn').forEach((btn) => {
743 const theme = btn.getAttribute('data-theme');
744 btn.setAttribute('aria-pressed', theme === activeMode ? 'true' : 'false');
745 });
746 }
747
748 function applyTheme(isDark) {
749 document.body.classList.toggle('ka-v3-dark', isDark);
750 document.documentElement.classList.toggle('ka-v3-dark', isDark);
751 }
752
753 function setThemeMode(nextMode, save) {
754 mode = nextMode;
755 updateSegment(nextMode);
756
757 if (mqlHandler && mql) {
758 if (mql.removeEventListener) {
759 mql.removeEventListener('change', mqlHandler);
760 } else if (mql.removeListener) {
761 mql.removeListener(mqlHandler);
762 }
763 mqlHandler = null;
764 }
765
766 if (nextMode === 'auto') {
767 applyTheme(!!(mql && mql.matches));
768 mqlHandler = (e) => {
769 if (mode !== 'auto') {
770 return;
771 }
772 applyTheme(!!e.matches);
773 };
774 if (mql) {
775 if (mql.addEventListener) {
776 mql.addEventListener('change', mqlHandler);
777 } else if (mql.addListener) {
778 mql.addListener(mqlHandler);
779 }
780 }
781 } else {
782 applyTheme(nextMode === 'dark');
783 }
784
785 if (save) {
786 saveUISetting('theme_mode', nextMode);
787 }
788 }
789
790 window.kaV3ToggleDark = function() {
791 const isDark = document.body.classList.contains('ka-v3-dark');
792 setThemeMode(isDark ? 'light' : 'dark', true);
793 };
794
795 if (segment) {
796 segment.addEventListener('click', function(e) {
797 const btn = e.target.closest('.ka-v3-segmented-btn');
798 if (!btn) return;
799 e.preventDefault();
800 setThemeMode((btn.getAttribute('data-theme') || 'dark').toString(), true);
801 });
802 }
803
804 if (segment) {
805 setThemeMode(mode, false);
806 }
807 })();
808 </script>
809