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 / Site_Preloader / 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/Site_Preloader/templates/admin-page.php

320 lines 12.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Site Preloader Admin Page Template.
4 *
5 * Apple-inspired admin UI for Site Preloader settings.
6 *
7 * @package King_Addons
8 * @since 1.0.0
9 *
10 * @var array $settings Current settings.
11 * @var bool $is_pro Whether Pro version is active.
12 * @var array $presets Available presets.
13 * @var array $rules Current display rules.
14 * @var string $current_tab Current active tab.
15 */
16
17 if (!defined('ABSPATH')) {
18 exit;
19 }
20
21 $tabs = [
22 'dashboard' => __('Dashboard', 'king-addons'),
23 'settings' => __('Settings', 'king-addons'),
24 'templates' => __('Templates', 'king-addons'),
25 'rules' => __('Rules', 'king-addons'),
26 'advanced' => __('Advanced', 'king-addons'),
27 'import-export' => __('Import / Export', 'king-addons'),
28 ];
29
30 // Show success/error messages
31 $updated = isset($_GET['updated']) && $_GET['updated'] === 'true';
32 $imported = isset($_GET['imported']) && $_GET['imported'] === 'true';
33 $reset = isset($_GET['reset']) && $_GET['reset'] === 'true';
34 $error = isset($_GET['error']) ? sanitize_key($_GET['error']) : '';
35
36 // Theme mode is per-user
37 $theme_mode = get_user_meta(get_current_user_id(), 'king_addons_theme_mode', true);
38 $allowed_theme_modes = ['dark', 'light', 'auto'];
39 if (!in_array($theme_mode, $allowed_theme_modes, true)) {
40 $theme_mode = 'dark';
41 }
42 ?>
43
44 <script>
45 (function() {
46 const mode = '<?php echo esc_js($theme_mode); ?>';
47 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
48 const isDark = mode === 'auto' ? !!(mql && mql.matches) : mode === 'dark';
49 document.documentElement.classList.toggle('ka-v3-dark', isDark);
50 document.body.classList.add('ka-admin-v3');
51 document.body.classList.toggle('ka-v3-dark', isDark);
52 })();
53
54 // Theme segmented control (dashboard-style)
55 (function() {
56 const ajaxUrl = '<?php echo esc_url(admin_url('admin-ajax.php')); ?>';
57 const nonce = '<?php echo esc_js(wp_create_nonce('king_addons_dashboard_ui')); ?>';
58 const segment = document.getElementById('ka-v3-theme-segment');
59 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
60 let mode = (segment && segment.getAttribute('data-active') ? segment.getAttribute('data-active') : 'dark').toString();
61 let mqlHandler = null;
62
63 function saveUISetting(key, value) {
64 const body = new URLSearchParams();
65 body.set('action', 'king_addons_save_dashboard_ui');
66 body.set('nonce', nonce);
67 body.set('key', key);
68 body.set('value', value);
69 fetch(ajaxUrl, {
70 method: 'POST',
71 headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },
72 body: body.toString()
73 });
74 }
75
76 function updateSegment(activeMode) {
77 if (!segment) {
78 return;
79 }
80 segment.setAttribute('data-active', activeMode);
81 segment.querySelectorAll('.ka-v3-segmented-btn').forEach((btn) => {
82 const theme = btn.getAttribute('data-theme');
83 btn.setAttribute('aria-pressed', theme === activeMode ? 'true' : 'false');
84 });
85 }
86
87 function applyTheme(isDark) {
88 document.body.classList.toggle('ka-v3-dark', isDark);
89 document.documentElement.classList.toggle('ka-v3-dark', isDark);
90 }
91
92 function setThemeMode(nextMode, save) {
93 mode = nextMode;
94 updateSegment(nextMode);
95
96 if (mqlHandler && mql) {
97 if (mql.removeEventListener) {
98 mql.removeEventListener('change', mqlHandler);
99 } else if (mql.removeListener) {
100 mql.removeListener(mqlHandler);
101 }
102 mqlHandler = null;
103 }
104
105 if (nextMode === 'auto') {
106 applyTheme(!!(mql && mql.matches));
107 mqlHandler = (e) => {
108 if (mode !== 'auto') {
109 return;
110 }
111 applyTheme(!!e.matches);
112 };
113 if (mql) {
114 if (mql.addEventListener) {
115 mql.addEventListener('change', mqlHandler);
116 } else if (mql.addListener) {
117 mql.addListener(mqlHandler);
118 }
119 }
120 } else {
121 applyTheme(nextMode === 'dark');
122 }
123
124 if (save) {
125 saveUISetting('theme_mode', nextMode);
126 }
127 }
128
129 window.kaV3ToggleDark = function() {
130 const isDark = document.body.classList.contains('ka-v3-dark');
131 setThemeMode(isDark ? 'light' : 'dark', true);
132 };
133
134 if (segment) {
135 segment.addEventListener('click', function(e) {
136 const btn = e.target.closest('.ka-v3-segmented-btn');
137 if (!btn) return;
138 e.preventDefault();
139 setThemeMode((btn.getAttribute('data-theme') || 'dark').toString(), true);
140 });
141 }
142
143 if (segment) {
144 setThemeMode(mode, false);
145 }
146 })();
147
148 // Tab switching
149 function kaPreloaderSwitchTab(tabId) {
150 // Update URL
151 const url = new URL(window.location.href);
152 url.searchParams.set('tab', tabId);
153 window.history.replaceState({}, '', url);
154
155 // Switch tabs
156 document.querySelectorAll('.ka-tab').forEach(tab => {
157 tab.classList.toggle('active', tab.dataset.tab === tabId);
158 });
159 document.querySelectorAll('.ka-tab-content').forEach(content => {
160 content.classList.toggle('active', content.dataset.tab === tabId);
161 });
162 }
163
164 // Preview functions
165 function kaPreloaderOpenPreview() {
166 document.getElementById('ka-preloader-preview-modal').style.display = 'flex';
167 document.body.style.overflow = 'hidden';
168 kaPreloaderUpdatePreview();
169 }
170
171 function kaPreloaderClosePreview() {
172 document.getElementById('ka-preloader-preview-modal').style.display = 'none';
173 document.body.style.overflow = '';
174 }
175
176 function kaPreloaderUpdatePreview() {
177 // This will be implemented in admin.js
178 }
179
180 // Template selection
181 function kaPreloaderSelectTemplate(templateId) {
182 // Update hidden input
183 const hiddenInput = document.getElementById('ka-selected-template');
184 if (hiddenInput) {
185 hiddenInput.value = templateId;
186 }
187
188 // Update active state
189 document.querySelectorAll('.ka-preloader-template-card').forEach(card => {
190 card.classList.toggle('active', card.dataset.template === templateId);
191 });
192 }
193 </script>
194
195 <div class="ka-admin-wrap ka-preloader-admin">
196 <!-- Header -->
197 <div class="ka-admin-header">
198 <div class="ka-admin-header-left">
199 <div class="ka-admin-header-icon orange">
200 <span class="dashicons dashicons-visibility"></span>
201 </div>
202 <div>
203 <h1 class="ka-admin-title"><?php esc_html_e('Site Preloader', 'king-addons'); ?></h1>
204 <p class="ka-admin-subtitle"><?php esc_html_e('Create beautiful loading animations for your website', 'king-addons'); ?></p>
205 </div>
206 </div>
207 <div class="ka-admin-header-actions">
208 <span class="ka-status <?php echo !empty($settings['enabled']) ? 'ka-status-enabled' : 'ka-status-disabled'; ?>">
209 <span class="ka-status-dot"></span>
210 <?php echo !empty($settings['enabled']) ? esc_html__('Enabled', 'king-addons') : esc_html__('Disabled', 'king-addons'); ?>
211 </span>
212 <div class="ka-v3-segmented" id="ka-v3-theme-segment" role="radiogroup" aria-label="Theme" data-active="<?php echo esc_attr($theme_mode); ?>">
213 <span class="ka-v3-segmented-indicator" aria-hidden="true"></span>
214 <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>
215 <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>
216 <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>
217 </div>
218 </div>
219 </div>
220
221 <!-- Success/Error Messages -->
222 <?php if ($updated): ?>
223 <div class="ka-notice ka-notice-success">
224 <span class="dashicons dashicons-yes-alt"></span>
225 <?php esc_html_e('Settings saved successfully!', 'king-addons'); ?>
226 </div>
227 <?php endif; ?>
228
229 <?php if ($imported): ?>
230 <div class="ka-notice ka-notice-success">
231 <span class="dashicons dashicons-yes-alt"></span>
232 <?php esc_html_e('Settings imported successfully!', 'king-addons'); ?>
233 </div>
234 <?php endif; ?>
235
236 <?php if ($reset): ?>
237 <div class="ka-notice ka-notice-success">
238 <span class="dashicons dashicons-yes-alt"></span>
239 <?php esc_html_e('Settings reset to defaults!', 'king-addons'); ?>
240 </div>
241 <?php endif; ?>
242
243 <?php if ($error): ?>
244 <div class="ka-notice ka-notice-error">
245 <span class="dashicons dashicons-warning"></span>
246 <?php
247 switch ($error) {
248 case 'no-file':
249 esc_html_e('Please select a file to import.', 'king-addons');
250 break;
251 case 'invalid-json':
252 esc_html_e('Invalid JSON file. Please check the file and try again.', 'king-addons');
253 break;
254 default:
255 esc_html_e('An error occurred. Please try again.', 'king-addons');
256 }
257 ?>
258 </div>
259 <?php endif; ?>
260
261 <!-- Tabs -->
262 <div class="ka-tabs">
263 <?php foreach ($tabs as $tab_id => $tab_label): ?>
264 <button type="button"
265 class="ka-tab <?php echo $current_tab === $tab_id ? 'active' : ''; ?>"
266 data-tab="<?php echo esc_attr($tab_id); ?>"
267 onclick="kaPreloaderSwitchTab('<?php echo esc_attr($tab_id); ?>')">
268 <?php echo esc_html($tab_label); ?>
269 </button>
270 <?php endforeach; ?>
271 </div>
272
273 <!-- Tab Content: Dashboard -->
274 <div class="ka-tab-content <?php echo $current_tab === 'dashboard' ? 'active' : ''; ?>" data-tab="dashboard">
275 <?php include __DIR__ . '/partials/tab-dashboard.php'; ?>
276 </div>
277
278 <!-- Tab Content: Settings -->
279 <div class="ka-tab-content <?php echo $current_tab === 'settings' ? 'active' : ''; ?>" data-tab="settings">
280 <?php include __DIR__ . '/partials/tab-settings.php'; ?>
281 </div>
282
283 <!-- Tab Content: Templates -->
284 <div class="ka-tab-content <?php echo $current_tab === 'templates' ? 'active' : ''; ?>" data-tab="templates">
285 <?php include __DIR__ . '/partials/tab-templates.php'; ?>
286 </div>
287
288 <!-- Tab Content: Rules -->
289 <div class="ka-tab-content <?php echo $current_tab === 'rules' ? 'active' : ''; ?>" data-tab="rules">
290 <?php include __DIR__ . '/partials/tab-rules.php'; ?>
291 </div>
292
293 <!-- Tab Content: Advanced -->
294 <div class="ka-tab-content <?php echo $current_tab === 'advanced' ? 'active' : ''; ?>" data-tab="advanced">
295 <?php include __DIR__ . '/partials/tab-advanced.php'; ?>
296 </div>
297
298 <!-- Tab Content: Import/Export -->
299 <div class="ka-tab-content <?php echo $current_tab === 'import-export' ? 'active' : ''; ?>" data-tab="import-export">
300 <?php include __DIR__ . '/partials/tab-import-export.php'; ?>
301 </div>
302 </div>
303
304 <!-- Live Preview Modal -->
305 <div id="ka-preloader-preview-modal" class="ka-preloader-preview-modal" style="display: none;">
306 <div class="ka-preloader-preview-modal__backdrop" onclick="kaPreloaderClosePreview()"></div>
307 <div class="ka-preloader-preview-modal__content">
308 <button type="button" class="ka-preloader-preview-modal__close" onclick="kaPreloaderClosePreview()">
309 <span class="dashicons dashicons-no-alt"></span>
310 </button>
311 <div class="ka-preloader-preview-modal__frame">
312 <div id="ka-preloader-preview-container"></div>
313 </div>
314 <div class="ka-preloader-preview-modal__info">
315 <span class="ka-preloader-preview-modal__label"><?php esc_html_e('Preview Mode', 'king-addons'); ?></span>
316 <span class="ka-preloader-preview-modal__hint"><?php esc_html_e('Click anywhere to close', 'king-addons'); ?></span>
317 </div>
318 </div>
319 </div>
320