PluginProbe
King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder / 51.1.78
King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder v51.1.78
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 51.1.46 51.1.47 51.1.49 All 37 releases
king-addons / includes / admin / layouts / wishlist-page.php

wishlist-page.php in King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder 51.1.78, at includes/admin/layouts/wishlist-page.php

476 lines 26.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Wishlist admin settings page - V3 Premium style inspired design.
4 *
5 * @package King_Addons
6 */
7
8 use King_Addons\Wishlist\Wishlist_Settings;
9
10 if (!defined('ABSPATH')) {
11 exit;
12 }
13
14 // Theme mode is per-user
15 $theme_mode = get_user_meta(get_current_user_id(), 'king_addons_theme_mode', true);
16 $allowed_theme_modes = ['dark', 'light', 'auto'];
17 if (!in_array($theme_mode, $allowed_theme_modes, true)) {
18 $theme_mode = 'dark';
19 }
20
21 $settings = Wishlist_Settings::get_settings();
22 $pages = get_pages(['sort_column' => 'post_title', 'sort_order' => 'ASC']);
23 $columns = Wishlist_Settings::get_column_options();
24 $is_pro = function_exists('king_addons_freemius') && king_addons_freemius()->can_use_premium_code__premium_only();
25
26 // Enqueue the shared CSS
27 $css_url = KING_ADDONS_URL . 'includes/admin/layouts/shared/admin-v3-styles.css';
28 $css_path = KING_ADDONS_PATH . 'includes/admin/layouts/shared/admin-v3-styles.css';
29 $css_version = file_exists($css_path) ? filemtime($css_path) : KING_ADDONS_VERSION;
30 ?>
31
32 <link rel="stylesheet" href="<?php echo esc_url($css_url); ?>?v=<?php echo esc_attr($css_version); ?>">
33
34 <script>
35 document.body.classList.add('ka-admin-v3');
36 (function() {
37 const mode = '<?php echo esc_js($theme_mode); ?>';
38 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
39 const isDark = mode === 'auto' ? !!(mql && mql.matches) : mode === 'dark';
40 document.body.classList.toggle('ka-v3-dark', isDark);
41 document.documentElement.classList.toggle('ka-v3-dark', isDark);
42 })();
43 </script>
44
45 <div class="ka-admin-wrap">
46 <!-- Header -->
47 <div class="ka-admin-header">
48 <div class="ka-admin-header-left">
49 <div class="ka-admin-header-icon pink">
50 <span class="dashicons dashicons-heart"></span>
51 </div>
52 <div>
53 <h1 class="ka-admin-title"><?php esc_html_e('Wishlist', 'king-addons'); ?></h1>
54 <p class="ka-admin-subtitle"><?php esc_html_e('Configure WooCommerce wishlist functionality.', 'king-addons'); ?></p>
55 </div>
56 </div>
57 <div class="ka-admin-header-actions">
58 <span class="ka-status <?php echo !empty($settings['enabled']) ? 'ka-status-enabled' : 'ka-status-disabled'; ?>">
59 <span class="ka-status-dot"></span>
60 <?php echo !empty($settings['enabled']) ? esc_html__('Enabled', 'king-addons') : esc_html__('Disabled', 'king-addons'); ?>
61 </span>
62 <div class="ka-v3-segmented" id="ka-v3-theme-segment" role="radiogroup" aria-label="<?php echo esc_attr(esc_html__('Theme', 'king-addons')); ?>" data-active="<?php echo esc_attr($theme_mode); ?>">
63 <span class="ka-v3-segmented-indicator" aria-hidden="true"></span>
64 <button type="button" class="ka-v3-segmented-btn" data-theme="light" aria-pressed="<?php echo $theme_mode === 'light' ? 'true' : 'false'; ?>">
65 <span class="ka-v3-segmented-icon" aria-hidden="true">☀︎</span>
66 <?php esc_html_e('Light', 'king-addons'); ?>
67 </button>
68 <button type="button" class="ka-v3-segmented-btn" data-theme="dark" aria-pressed="<?php echo $theme_mode === 'dark' ? 'true' : 'false'; ?>">
69 <span class="ka-v3-segmented-icon" aria-hidden="true"></span>
70 <?php esc_html_e('Dark', 'king-addons'); ?>
71 </button>
72 <button type="button" class="ka-v3-segmented-btn" data-theme="auto" aria-pressed="<?php echo $theme_mode === 'auto' ? 'true' : 'false'; ?>">
73 <span class="ka-v3-segmented-icon" aria-hidden="true"></span>
74 <?php esc_html_e('Auto', 'king-addons'); ?>
75 </button>
76 </div>
77 <a href="<?php echo esc_url(admin_url('admin.php?page=king-addons-wishlist-analytics')); ?>" class="ka-btn ka-btn-pink">
78 <span class="dashicons dashicons-chart-bar"></span>
79 <?php esc_html_e('Analytics', 'king-addons'); ?>
80 </a>
81 </div>
82 </div>
83
84 <!-- Tabs Navigation -->
85 <div class="ka-tabs">
86 <button type="button" class="ka-tab active" data-tab="general"><?php esc_html_e('General', 'king-addons'); ?></button>
87 <button type="button" class="ka-tab" data-tab="buttons"><?php esc_html_e('Buttons & Icons', 'king-addons'); ?></button>
88 <button type="button" class="ka-tab" data-tab="page"><?php esc_html_e('Wishlist Page', 'king-addons'); ?></button>
89 <button type="button" class="ka-tab" data-tab="performance"><?php esc_html_e('Performance', 'king-addons'); ?></button>
90 <button type="button" class="ka-tab" data-tab="pro"><?php esc_html_e('Pro Features', 'king-addons'); ?><?php if (!$is_pro) : ?><span class="ka-pro-badge">PRO</span><?php endif; ?></button>
91 </div>
92
93 <form method="post" action="options.php" id="king-addons-wishlist-form">
94 <?php settings_fields('king_addons_wishlist'); ?>
95
96 <!-- General Tab -->
97 <div class="ka-tab-content active" data-tab="general">
98 <div class="ka-card">
99 <div class="ka-card-header">
100 <span class="dashicons dashicons-admin-settings pink"></span>
101 <h2><?php esc_html_e('General Settings', 'king-addons'); ?></h2>
102 </div>
103 <div class="ka-card-body">
104 <div class="ka-row">
105 <div class="ka-row-label"><?php esc_html_e('Enable Wishlist', 'king-addons'); ?></div>
106 <div class="ka-row-field">
107 <label class="ka-toggle">
108 <input type="checkbox" name="king_addons_wishlist_settings[enabled]" value="1" <?php checked(!empty($settings['enabled'])); ?> />
109 <span class="ka-toggle-slider"></span>
110 <span class="ka-toggle-label"><?php esc_html_e('Turn on wishlist functionality', 'king-addons'); ?></span>
111 </label>
112 </div>
113 </div>
114 <div class="ka-row">
115 <div class="ka-row-label"><?php esc_html_e('Wishlist Page', 'king-addons'); ?></div>
116 <div class="ka-row-field">
117 <select name="king_addons_wishlist_settings[wishlist_page_id]">
118 <option value="0"><?php esc_html_e('— Select page —', 'king-addons'); ?></option>
119 <?php foreach ($pages as $page) : ?>
120 <option value="<?php echo esc_attr($page->ID); ?>" <?php selected(intval($settings['wishlist_page_id']), $page->ID); ?>>
121 <?php echo esc_html($page->post_title); ?>
122 </option>
123 <?php endforeach; ?>
124 </select>
125 <p class="ka-row-desc"><?php esc_html_e('Choose the page that displays the wishlist or use the shortcode [ka_wishlist_page].', 'king-addons'); ?></p>
126 </div>
127 </div>
128 <div class="ka-row">
129 <div class="ka-row-label"><?php esc_html_e('Allow Guests', 'king-addons'); ?></div>
130 <div class="ka-row-field">
131 <label class="ka-toggle">
132 <input type="checkbox" name="king_addons_wishlist_settings[allow_guests]" value="1" <?php checked(!empty($settings['allow_guests'])); ?> />
133 <span class="ka-toggle-slider"></span>
134 <span class="ka-toggle-label"><?php esc_html_e('Guests can use wishlist with session', 'king-addons'); ?></span>
135 </label>
136 </div>
137 </div>
138 <div class="ka-row">
139 <div class="ka-row-label"><?php esc_html_e('Guest Notice', 'king-addons'); ?></div>
140 <div class="ka-row-field">
141 <textarea name="king_addons_wishlist_settings[guest_block_text]" rows="2" style="max-width:100%"><?php echo esc_textarea($settings['guest_block_text']); ?></textarea>
142 <p class="ka-row-desc"><?php esc_html_e('Message shown to guests when wishlist is disabled for them.', 'king-addons'); ?></p>
143 </div>
144 </div>
145 </div>
146 </div>
147 </div>
148
149 <!-- Buttons Tab -->
150 <div class="ka-tab-content" data-tab="buttons">
151 <div class="ka-card">
152 <div class="ka-card-header">
153 <span class="dashicons dashicons-button pink"></span>
154 <h2><?php esc_html_e('Button Settings', 'king-addons'); ?></h2>
155 </div>
156 <div class="ka-card-body">
157 <div class="ka-row">
158 <div class="ka-row-label"><?php esc_html_e('Default Text', 'king-addons'); ?></div>
159 <div class="ka-row-field">
160 <input type="text" name="king_addons_wishlist_settings[button_add_text]" value="<?php echo esc_attr($settings['button_add_text']); ?>" />
161 </div>
162 </div>
163 <div class="ka-row">
164 <div class="ka-row-label"><?php esc_html_e('Added Text', 'king-addons'); ?></div>
165 <div class="ka-row-field">
166 <input type="text" name="king_addons_wishlist_settings[button_added_text]" value="<?php echo esc_attr($settings['button_added_text']); ?>" />
167 </div>
168 </div>
169 <div class="ka-row">
170 <div class="ka-row-label"><?php esc_html_e('Display Mode', 'king-addons'); ?></div>
171 <div class="ka-row-field">
172 <div class="ka-radio-group">
173 <label class="ka-radio-item">
174 <input type="radio" name="king_addons_wishlist_settings[button_display_mode]" value="icon_text" <?php checked($settings['button_display_mode'], 'icon_text'); ?> />
175 <?php esc_html_e('Icon with text', 'king-addons'); ?>
176 </label>
177 <label class="ka-radio-item">
178 <input type="radio" name="king_addons_wishlist_settings[button_display_mode]" value="icon" <?php checked($settings['button_display_mode'], 'icon'); ?> />
179 <?php esc_html_e('Icon only', 'king-addons'); ?>
180 </label>
181 </div>
182 </div>
183 </div>
184 <div class="ka-row">
185 <div class="ka-row-label"><?php esc_html_e('Icon Class', 'king-addons'); ?></div>
186 <div class="ka-row-field">
187 <input type="text" name="king_addons_wishlist_settings[icon_choice]" value="<?php echo esc_attr($settings['icon_choice']); ?>" />
188 <p class="ka-row-desc"><?php esc_html_e('Elementor or FontAwesome class, e.g. eicon-heart', 'king-addons'); ?></p>
189 </div>
190 </div>
191 <div class="ka-row">
192 <div class="ka-row-label"><?php esc_html_e('Position', 'king-addons'); ?></div>
193 <div class="ka-row-field">
194 <select name="king_addons_wishlist_settings[button_position]">
195 <option value="before_add_to_cart" <?php selected($settings['button_position'], 'before_add_to_cart'); ?>><?php esc_html_e('Before Add to Cart', 'king-addons'); ?></option>
196 <option value="after_add_to_cart" <?php selected($settings['button_position'], 'after_add_to_cart'); ?>><?php esc_html_e('After Add to Cart', 'king-addons'); ?></option>
197 </select>
198 </div>
199 </div>
200 <div class="ka-row">
201 <div class="ka-row-label"><?php esc_html_e('Show in Archives', 'king-addons'); ?></div>
202 <div class="ka-row-field">
203 <label class="ka-toggle">
204 <input type="checkbox" name="king_addons_wishlist_settings[show_in_archives]" value="1" <?php checked(!empty($settings['show_in_archives'])); ?> />
205 <span class="ka-toggle-slider"></span>
206 <span class="ka-toggle-label"><?php esc_html_e('Display in product loops', 'king-addons'); ?></span>
207 </label>
208 </div>
209 </div>
210 </div>
211 </div>
212 </div>
213
214 <!-- Page Tab -->
215 <div class="ka-tab-content" data-tab="page">
216 <div class="ka-card">
217 <div class="ka-card-header">
218 <span class="dashicons dashicons-editor-table pink"></span>
219 <h2><?php esc_html_e('Table Columns', 'king-addons'); ?></h2>
220 </div>
221 <div class="ka-card-body">
222 <div class="ka-row">
223 <div class="ka-row-label"><?php esc_html_e('Columns', 'king-addons'); ?></div>
224 <div class="ka-row-field">
225 <p class="ka-row-desc" style="margin-top:0;margin-bottom:12px"><?php esc_html_e('Drag to reorder. Check/uncheck to show/hide.', 'king-addons'); ?></p>
226 <ul id="ka-wishlist-columns" class="ka-sortable-list">
227 <?php foreach ($settings['wishlist_columns'] as $saved_key) : if (isset($columns[$saved_key])) : ?>
228 <li class="ka-sortable-item" data-column="<?php echo esc_attr($saved_key); ?>">
229 <span class="dashicons dashicons-menu ka-sortable-handle"></span>
230 <label>
231 <input type="checkbox" name="king_addons_wishlist_settings[wishlist_columns][]" value="<?php echo esc_attr($saved_key); ?>" checked />
232 <?php echo esc_html($columns[$saved_key]); ?>
233 </label>
234 </li>
235 <?php endif; endforeach; ?>
236 <?php foreach ($columns as $column_key => $label) : if (!in_array($column_key, $settings['wishlist_columns'], true)) : ?>
237 <li class="ka-sortable-item" data-column="<?php echo esc_attr($column_key); ?>">
238 <span class="dashicons dashicons-menu ka-sortable-handle"></span>
239 <label>
240 <input type="checkbox" name="king_addons_wishlist_settings[wishlist_columns][]" value="<?php echo esc_attr($column_key); ?>" />
241 <?php echo esc_html($label); ?>
242 </label>
243 </li>
244 <?php endif; endforeach; ?>
245 </ul>
246 </div>
247 </div>
248 </div>
249 </div>
250 </div>
251
252 <!-- Performance Tab -->
253 <div class="ka-tab-content" data-tab="performance">
254 <div class="ka-card">
255 <div class="ka-card-header">
256 <span class="dashicons dashicons-performance pink"></span>
257 <h2><?php esc_html_e('Performance', 'king-addons'); ?></h2>
258 </div>
259 <div class="ka-card-body">
260 <div class="ka-row">
261 <div class="ka-row-label"><?php esc_html_e('Frontend Cache', 'king-addons'); ?></div>
262 <div class="ka-row-field">
263 <label class="ka-toggle">
264 <input type="checkbox" name="king_addons_wishlist_settings[cache_enabled]" value="1" <?php checked(!empty($settings['cache_enabled'])); ?> />
265 <span class="ka-toggle-slider"></span>
266 <span class="ka-toggle-label"><?php esc_html_e('Cache wishlist fragments', 'king-addons'); ?></span>
267 </label>
268 <p class="ka-row-desc"><?php esc_html_e('Basic HTML cache. Disable if counts appear stale.', 'king-addons'); ?></p>
269 </div>
270 </div>
271 <div class="ka-row">
272 <div class="ka-row-label"><?php esc_html_e('Cache Lifetime', 'king-addons'); ?></div>
273 <div class="ka-row-field">
274 <input type="number" min="0" step="30" name="king_addons_wishlist_settings[cache_ttl]" value="<?php echo esc_attr(intval($settings['cache_ttl'])); ?>" style="max-width:120px" />
275 <span style="color:#86868b;margin-left:8px"><?php esc_html_e('seconds', 'king-addons'); ?></span>
276 </div>
277 </div>
278 </div>
279 </div>
280 </div>
281
282 <!-- Pro Tab -->
283 <div class="ka-tab-content" data-tab="pro">
284 <?php if (!$is_pro) : ?>
285 <div class="ka-upgrade-card">
286 <h3><?php esc_html_e('Upgrade to Pro', 'king-addons'); ?></h3>
287 <p><?php esc_html_e('Unlock powerful wishlist features for your WooCommerce store.', 'king-addons'); ?></p>
288 <ul>
289 <li><?php esc_html_e('Multiple wishlists with visibility control', 'king-addons'); ?></li>
290 <li><?php esc_html_e('Shareable links and social buttons', 'king-addons'); ?></li>
291 <li><?php esc_html_e('Email triggers for price drops and restocks', 'king-addons'); ?></li>
292 <li><?php esc_html_e('Wishlist analytics and CSV export', 'king-addons'); ?></li>
293 <li><?php esc_html_e('Product notes and advanced design controls', 'king-addons'); ?></li>
294 </ul>
295 <a href="https://kingaddons.com/pricing/?utm_source=kng-wishlist-admin&utm_medium=plugin&utm_campaign=kng" target="_blank" class="ka-btn ka-btn-pink">
296 <?php esc_html_e('View Pro Plans', 'king-addons'); ?>
297 </a>
298 </div>
299 <?php else :
300 $email_settings = class_exists('King_Addons\Wishlist\Wishlist_Email_Notifications')
301 ? \King_Addons\Wishlist\Wishlist_Email_Notifications::get_settings()
302 : [];
303 ?>
304 <div class="ka-card">
305 <div class="ka-card-header">
306 <span class="dashicons dashicons-email-alt pink"></span>
307 <h2><?php esc_html_e('Email Notifications', 'king-addons'); ?></h2>
308 </div>
309 <div class="ka-card-body">
310 <div class="ka-row">
311 <div class="ka-row-label"><?php esc_html_e('Price Drops', 'king-addons'); ?></div>
312 <div class="ka-row-field">
313 <label class="ka-toggle">
314 <input type="checkbox" name="king_addons_wishlist_email_settings[enable_price_drop]" value="1" <?php checked(!empty($email_settings['enable_price_drop'])); ?> />
315 <span class="ka-toggle-slider"></span>
316 <span class="ka-toggle-label"><?php esc_html_e('Notify on price reduction', 'king-addons'); ?></span>
317 </label>
318 </div>
319 </div>
320 <div class="ka-row">
321 <div class="ka-row-label"><?php esc_html_e('Back in Stock', 'king-addons'); ?></div>
322 <div class="ka-row-field">
323 <label class="ka-toggle">
324 <input type="checkbox" name="king_addons_wishlist_email_settings[enable_back_in_stock]" value="1" <?php checked(!empty($email_settings['enable_back_in_stock'])); ?> />
325 <span class="ka-toggle-slider"></span>
326 <span class="ka-toggle-label"><?php esc_html_e('Notify when product returns', 'king-addons'); ?></span>
327 </label>
328 </div>
329 </div>
330 <div class="ka-row">
331 <div class="ka-row-label"><?php esc_html_e('Weekly Digest', 'king-addons'); ?></div>
332 <div class="ka-row-field">
333 <label class="ka-toggle">
334 <input type="checkbox" name="king_addons_wishlist_email_settings[enable_digest]" value="1" <?php checked(!empty($email_settings['enable_digest'])); ?> />
335 <span class="ka-toggle-slider"></span>
336 <span class="ka-toggle-label"><?php esc_html_e('Send weekly wishlist summary', 'king-addons'); ?></span>
337 </label>
338 </div>
339 </div>
340 <div class="ka-row">
341 <div class="ka-row-label"><?php esc_html_e('Price Threshold', 'king-addons'); ?></div>
342 <div class="ka-row-field">
343 <input type="number" min="1" max="50" name="king_addons_wishlist_email_settings[price_threshold]" value="<?php echo esc_attr($email_settings['price_threshold'] ?? 5); ?>" style="max-width:80px" />
344 <span style="color:#86868b;margin-left:8px">%</span>
345 <p class="ka-row-desc"><?php esc_html_e('Minimum % drop to trigger notification', 'king-addons'); ?></p>
346 </div>
347 </div>
348 <div class="ka-row">
349 <div class="ka-row-label"><?php esc_html_e('Daily Limit', 'king-addons'); ?></div>
350 <div class="ka-row-field">
351 <input type="number" min="1" max="10" name="king_addons_wishlist_email_settings[daily_email_limit]" value="<?php echo esc_attr($email_settings['daily_email_limit'] ?? 3); ?>" style="max-width:80px" />
352 <span style="color:#86868b;margin-left:8px"><?php esc_html_e('emails/user/day', 'king-addons'); ?></span>
353 </div>
354 </div>
355 </div>
356 </div>
357 <?php endif; ?>
358 </div>
359
360 <div class="ka-card">
361 <div class="ka-submit">
362 <button type="submit" class="ka-btn ka-btn-pink">
363 <?php esc_html_e('Save Settings', 'king-addons'); ?>
364 </button>
365 </div>
366 </div>
367 </form>
368 </div>
369
370 <script>
371 (function($) {
372 'use strict';
373
374 $(document).ready(function() {
375 const ajaxUrl = '<?php echo esc_url(admin_url('admin-ajax.php')); ?>';
376 const nonce = '<?php echo esc_js(wp_create_nonce('king_addons_dashboard_ui')); ?>';
377
378 // Theme segmented control (dashboard-style)
379 const $themeSegment = $('#ka-v3-theme-segment');
380 const $themeSegmentButtons = $themeSegment.find('.ka-v3-segmented-btn');
381 const themeMql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
382 let themeMode = ($themeSegment.attr('data-active') || 'dark').toString();
383 let themeMqlHandler = null;
384
385 function saveUISetting(key, value) {
386 $.post(ajaxUrl, {
387 action: 'king_addons_save_dashboard_ui',
388 nonce: nonce,
389 key: key,
390 value: value
391 });
392 }
393
394 function updateSegment(mode) {
395 $themeSegment.attr('data-active', mode);
396 $themeSegmentButtons.each(function() {
397 const theme = $(this).data('theme');
398 $(this).attr('aria-pressed', theme === mode ? 'true' : 'false');
399 });
400 }
401
402 function applyThemeClass(isDark) {
403 $('body').toggleClass('ka-v3-dark', isDark);
404 document.documentElement.classList.toggle('ka-v3-dark', isDark);
405 }
406
407 function setThemeMode(mode, save) {
408 themeMode = mode;
409 updateSegment(mode);
410
411 if (themeMqlHandler && themeMql) {
412 if (themeMql.removeEventListener) {
413 themeMql.removeEventListener('change', themeMqlHandler);
414 } else if (themeMql.removeListener) {
415 themeMql.removeListener(themeMqlHandler);
416 }
417 themeMqlHandler = null;
418 }
419
420 if (mode === 'auto') {
421 applyThemeClass(!!(themeMql && themeMql.matches));
422 themeMqlHandler = function(e) {
423 if (themeMode !== 'auto') {
424 return;
425 }
426 applyThemeClass(!!e.matches);
427 };
428 if (themeMql) {
429 if (themeMql.addEventListener) {
430 themeMql.addEventListener('change', themeMqlHandler);
431 } else if (themeMql.addListener) {
432 themeMql.addListener(themeMqlHandler);
433 }
434 }
435 } else {
436 applyThemeClass(mode === 'dark');
437 }
438
439 if (save) {
440 saveUISetting('theme_mode', mode);
441 }
442 }
443
444 $themeSegment.on('click', '.ka-v3-segmented-btn', function(e) {
445 e.preventDefault();
446 const mode = ($(this).data('theme') || 'dark').toString();
447 setThemeMode(mode, true);
448 });
449
450 // Ensure mode applies for Auto (listener + system state)
451 setThemeMode(themeMode, false);
452
453 // Tab navigation
454 $('.ka-tab').on('click', function() {
455 const target = $(this).data('tab');
456 $('.ka-tab').removeClass('active');
457 $(this).addClass('active');
458 $('.ka-tab-content').removeClass('active');
459 $(`.ka-tab-content[data-tab="${target}"]`).addClass('active');
460 });
461
462 // Sortable columns
463 if ($.fn.sortable) {
464 $('#ka-wishlist-columns').sortable({
465 handle: '.ka-sortable-handle',
466 placeholder: 'ui-sortable-placeholder',
467 axis: 'y',
468 cursor: 'move',
469 tolerance: 'pointer'
470 });
471 }
472 });
473 })(jQuery);
474 </script>
475 <?php wp_enqueue_script('jquery-ui-sortable'); ?>
476