PluginProbe ʕ •ᴥ•ʔ
NitroPack – Performance, Page Speed & Cache Plugin for Core Web Vitals, CDN & Image Optimization / 1.5.1
NitroPack – Performance, Page Speed & Cache Plugin for Core Web Vitals, CDN & Image Optimization v1.5.1
1.19.8 1.19.7 1.19.6 1.19.5 trunk 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.12.0 1.13.0 1.14.0 1.15.0 1.15.1 1.15.2 1.15.3 1.16.0 1.16.1 1.16.2 1.16.3 1.16.4 1.16.5 1.16.6 1.16.7 1.16.8 1.17.0 1.17.6 1.17.7 1.17.8 1.17.9 1.18.0 1.18.1 1.18.2 1.18.3 1.18.4 1.18.5 1.18.6 1.18.7 1.18.8 1.18.9 1.19.0 1.19.1 1.19.2 1.19.3 1.19.4 1.3.19 1.3.20 1.4.0 1.4.1 1.5.0 1.5.1 1.5.10 1.5.11 1.5.12 1.5.13 1.5.14 1.5.15 1.5.16 1.5.17 1.5.18 1.5.19 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.7.0 1.7.1 1.8.0 1.8.1 1.8.3 1.9.0 1.9.1 1.9.2
nitropack / view / dashboard.php
nitropack / view Last commit date
images 6 years ago javascript 5 years ago stylesheet 5 years ago admin.php 5 years ago connect.php 5 years ago dashboard.php 5 years ago diag.php 5 years ago help.php 6 years ago
dashboard.php
651 lines
1 <div>
2 <div class="row">
3 <div class="col-md-12">
4 <?php nitropack_display_admin_notices(); ?>
5 </div>
6 </div>
7 <div class="row">
8 <div class="col-md-6 mb-3">
9 <div class="card-overlay-blurrable np-widget" id="optimizations-widget">
10 <div class="card card-d-item">
11 <div class="card-body">
12 <h5 class="card-title">Optimized Pages<span id="pending-optimizations-section" class="pull-right" style="display:none;font-size: 12px;color: #28a745">Processing <span id="pending-optimizations-count">X</span> page(s) in the background&nbsp;&nbsp;<i class="fa fa-spinner fa-spin"></i></span></h5>
13 <div class="row mt-4" data-hideable>
14 <div id="optimized-pages"><span data-optimized-pages-total>0</span></div>
15 <div id="last-cache-purge" class="text-secondary">Last cache purge: <span data-last-cache-purge>Never</span></div>
16 <div id="last-cache-purge-reason" class="text-secondary">Reason: <span data-purge-reason>Unknown</span></div>
17 </div>
18 <div class="row mt-4 optimizations-hidden" data-hideable>
19 <div class="optimizations-subcount"><span data-optimized-pages-mobile>0</span> mobile pages</div>
20 <div class="optimizations-subcount"><span data-optimized-pages-tablet>0</span> tablet pages</div>
21 <div class="optimizations-subcount"><span data-optimized-pages-desktop>0</span> desktop pages</div>
22 </div>
23 <div class="row mt-5 justify-content-center">
24 <button id="optimizations-purge-cache" class="btn btn-light btn-outline-secondary btn-widget-optimizations">Purge Cache</button>
25 </div>
26 </div>
27 </div>
28 </div>
29 </div>
30 <div class="col-md-6 mb-3">
31 <div class="card-overlay-blurrable np-widget" id="plan-details-widget">
32 <div class="card card-d-item">
33 <div class="card-body">
34 <h5 class="card-title">Plan</h5>
35 <div class="mt-3">
36 <h5 class="font-weight-lighter"><span data-plan-title>Unknown</span> <a target="_blank" href="https://nitropack.io/user/billing" class="btn btn-primary btn-sm ml-3">Manage plan</a></h5>
37 </div>
38 <ul class="list-group list-group-flush" id="plan-quotas">
39 <li class="list-group-item px-0 d-flex justify-content-between align-items-center">Next Reset <span data-next-reset>No ETA</span></li>
40 <li class="list-group-item px-0 d-flex justify-content-between align-items-center">Next Billing <span data-next-billing>No ETA</span></li>
41 </ul>
42 <p class="mb-0 mt-2"><i class="fa fa-info-circle text-primary" aria-hidden="true"></i> You will be notified if you approach the plan resource limit</p>
43 </div>
44 </div>
45 </div>
46 </div>
47 <div class="col-md-6 mb-3">
48 <div class="card-overlay-blurrable np-widget" id="quicksetup-widget">
49 <div class="card card-d-item">
50 <div class="card-body">
51 <h5 class="card-title">Optimization Mode</h5>
52 <p><small>Slide to change your settings. This will update the level of optimization.</small></p>
53
54 <div id="range-container">
55 <div id="labels"></div>
56 <div id="range-element">
57 <div id="divisors"></div>
58 <input id="range" type="range" min="1" max="5" step="1" value="0" />
59 </div>
60 </div>
61
62 <div id="description">
63 <div class="text dummy">
64 <h6 class="text-success">Dummy</h6>
65 <p><small></small></p>
66 </div>
67 <div class="text standard">
68 <h6 class="text-info">Standard</h6>
69 <p><small>A pre-defined configuration without much regard for a high score. Enough to get you up and running.</small></p>
70 </div>
71 <div class="text medium">
72 <h6 class="text-success">Medium</h6>
73 <p><small>Well-balanced and suitable for most cases.</small></p>
74 </div>
75 <div class="text strong">
76 <h6 class="text-warning">Strong</h6>
77 <p><small>Includes advanced features like automatic image lazy loading and font definition modification. May cause issues in some cases.</small></p>
78 </div>
79 <div class="text ludicrous">
80 <h6 class="text-danger">Ludicrous</h6>
81 <p><small>A pre-defined configuration aiming to achieve the highest possible score. In some cases, it may cause issues with your site.</small></p>
82 </div>
83 <div class="text custom">
84 <h6>Manual</h6>
85 <p><small>Use your own settings. <a id="manual-settings-url" href="javascript:void(0);" target="_blank">Click here</a> to configure them.</small></p>
86 </div>
87 </div>
88 </div>
89 </div>
90 </div>
91 </div>
92 <div class="col-md-6 mb-3">
93 <div class="card-overlay-blurrable np-widget" id="settings-widget">
94 <div class="card card-d-item">
95 <div class="card-body">
96 <h5 class="card-title">Settings</h5>
97 <ul class="list-group list-group-flush">
98 <li class="list-group-item px-0 d-flex justify-content-between align-items-center">
99 <span>Cache Warmup</br>
100 <small>Learn more about this feature <a href="https://help.nitropack.io/en/articles/3534265-cache-warmup" target="_blank" rel="noreferrer noopener">here</a></small>
101 </span>
102 <span id="loading-warmup-status">
103 Loading cache warmup status&nbsp;&nbsp;<i class="fa fa-refresh fa-spin" style="color: var(--blue);"></i>
104 </span>
105 <span id="warmup-toggle" style="display: none;">
106 <label id="warmup-status-slider" class="switch">
107 <input type="checkbox" id="warmup-status">
108 <span class="slider"></span>
109 </label>
110 </span>
111 </li>
112 <li class="list-group-item px-0 d-flex justify-content-between align-items-center">
113 <span id="detecting-compression" style="display: none;">Testing current compression status&nbsp;&nbsp;<a href="javascript:void(0);"><i class="fa fa-refresh fa-spin" style="color: var(--blue);"></i></a></span>
114 <span id="detected-compression">HTML Compression&nbsp;&nbsp;<a href="javascript:void(0);" id="compression-test-btn" data-toggle="tooltip" data-placement="top" title="Automatically detect whether compression is needed"><i class="fa fa-refresh" style="color: var(--blue);"></i></a></span>
115 <span>
116 <label class="switch">
117 <input type="checkbox" id="compression-status" <?php echo (int)$enableCompression === 1 ? "checked" : ""; ?>>
118 <span class="slider"></span>
119 </label>
120 </span>
121 </li>
122 <li class="list-group-item px-0 d-flex justify-content-between align-items-center">
123 <span>
124 <a href="javascript:void(0);" class="btn btn-danger text-white" id="disconnect-btn"><i class="fa fa-power-off text-white"></i>&nbsp;&nbsp;Disconnect</a>
125 </span>
126 </li>
127 </ul>
128 <p class="mb-0 mt-2"><i class="fa fa-info-circle text-primary" aria-hidden="true"></i> You can further configure how NitroPack's optimization behaves through your account at <a href="https://nitropack.io/" target="_blank">https://nitropack.io/&nbsp;&nbsp;<i class="fa fa-external-link"></i></a>.</p>
129 </div>
130 </div>
131 </div>
132 </div>
133 <div class="col-md-6 mb-3">
134 <div class="card-overlay-blurrable np-widget" id="automations-widget">
135 <div class="card card-d-item">
136 <div class="card-body">
137 <h5 class="card-title">Automated Behavior</h5>
138 <ul class="list-group list-group-flush">
139 <li class="list-group-item px-0 d-flex justify-content-between align-items-center">
140 <span>Purge affected cache when content is updated or published</span>
141 <span id="auto-purge-toggle">
142 <label id="auto-purge-status-slider" class="switch">
143 <input type="checkbox" id="auto-purge-status" <?php if ($autoCachePurge) echo "checked"; ?>>
144 <span class="slider"></span>
145 </label>
146 </span>
147 </li>
148 <li class="list-group-item px-0 d-flex justify-content-between align-items-center">
149 <span>Select what post/page types get optimized</span>
150 <span id="cacheable-post-types-btn">
151 <a href="javascript:void(0);" class="btn btn-light btn-outline-secondary" data-toggle="modal" data-target="#cacheable-post-types-modal"><i class="fa fa-cog"></i></a>
152 </span>
153 </li>
154 </ul>
155 </div>
156 </div>
157 </div>
158 </div>
159 </div>
160 </div>
161
162 <!-- Post Types Modal -->
163 <div class="modal" id="cacheable-post-types-modal" tabindex="-1" role="dialog" aria-labelledby="cacheable-post-types-title" aria-hidden="true" data-backdrop="false">
164 <div class="modal-dialog modal-dialog-centered" role="document">
165 <div class="modal-content">
166 <div class="modal-header">
167 <h5 class="modal-title" id="cacheable-post-types-title">Configure page types that can be optimized</h5>
168 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
169 <span aria-hidden="true">&times;</span>
170 </button>
171 </div>
172 <div class="modal-body nitropack-scrollable-modal-body">
173 <ul class="list-group list-group-flush">
174 <?php foreach ($objectTypes as $objectType) {?>
175 <li class="list-group-item px-0 d-flex justify-content-between align-items-center border-0">
176 <span><?php echo $objectType->label; ?></span>
177 <span id="post-type-<?php echo $objectType->name; ?>-toggle">
178 <label id="post-type-<?php echo $objectType->name; ?>-status-slider" class="switch">
179 <input class="cacheable-post-type" name="<?php echo $objectType->name; ?>" type="checkbox" id="post-type-post-status" <?php if (in_array($objectType->name, $cacheableObjectTypes)) echo 'checked'; ?>>
180 <span class="slider"></span>
181 </label>
182 </span>
183 </li>
184 <?php if (!empty($objectType->taxonomies)) {?>
185 <?php foreach ($objectType->taxonomies as $taxonomyType) {?>
186 <li class="list-group-item px-0 d-flex justify-content-between align-items-center list-group-item-indented border-0">
187 <span><?php echo $taxonomyType->label; ?></span>
188 <span id="post-type-<?php echo $taxonomyType->name; ?>-toggle">
189 <label id="post-type-<?php echo $taxonomyType->name; ?>-status-slider" class="switch">
190 <input class="cacheable-post-type" name="<?php echo $taxonomyType->name; ?>" type="checkbox" id="post-type-post-status" <?php if (in_array($taxonomyType->name, $cacheableObjectTypes)) echo 'checked'; ?>>
191 <span class="slider"></span>
192 </label>
193 </span>
194 </li>
195 <?php }?>
196 <?php }?>
197 <?php }?>
198 </ul>
199 </div>
200 <div class="modal-footer">
201 <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
202 <button type="button" class="btn btn-primary" id="save-cacheable-post-types">Save changes&nbsp;&nbsp;<i class="fa fa-spinner fa-spin d-none"></i></button>
203 </div>
204 </div>
205 </div>
206 </div>
207 <script>
208 ($ => {
209 var getOptimizationsTimeout = null;
210
211 $(window).on("load",function() {
212 $("#optimizations-widget").cardOverlay("loading", {message: "Loading optimizations data"});
213 $("#plan-details-widget").cardOverlay("loading", {message: "Loading plan data"});
214 $("#quicksetup-widget").cardOverlay("loading", {message: "Loading settings"});
215 getOptimizations();
216 getPlan();
217 getQuickSetup();
218
219 <?php if ($checkedCompression != 1) { ?>
220 autoDetectCompression();
221 <?php } ?>
222 });
223
224 $(document).on('click', '[data-hideable]', function(e) {
225 e.preventDefault();
226
227 $('[data-hideable]').removeClass('optimizations-hidden');
228
229 $(this).addClass('optimizations-hidden');
230 });
231
232 $(document).on('click', '#optimizations-invalidate-cache', function(e) {
233 e.preventDefault();
234 //Overlay.loading("Invalidating cache...");
235
236 invalidateEvent = new Event("cache.invalidate.request");
237 window.dispatchEvent(invalidateEvent);
238 });
239
240 $(document).on('click', '#optimizations-purge-cache', function(e) {
241 e.preventDefault();
242 //Overlay.loading("Purging cache...");
243
244 purgeEvent = new Event("cache.purge.request");
245 window.dispatchEvent(purgeEvent);
246 });
247
248 $("#btn-run-warmup").on("click", function(e) {
249 runWarmup();
250 })
251
252 $("#btn-stop-warmup").on("click", function(e) {
253 disableWarmup();
254 })
255
256 var estimateWarmup = (id, retry) => {
257 id = id || null;
258 retry = retry || 0;
259 if (!id) {
260 $("#settings-widget").cardOverlay("loading", {message: "Estimating optimizations usage"});
261 //$("#estimation-spinner").show();
262 //$("#warmup-status-slider").hide();
263
264 $.post(ajaxurl, {
265 action: 'nitropack_estimate_warmup'
266 }, function(response) {
267 var resp = JSON.parse(response);
268 if (resp.type == "success") {
269 setTimeout( (function(id){
270 estimateWarmup(id);
271 })(resp.res), 1000 );
272 } else {
273 $("#settings-widget").cardOverlay("error", {message: "Warmup estimation failed", timeout: 3000});
274 }
275 });
276 } else {
277 $.post(ajaxurl, {
278 action: 'nitropack_estimate_warmup',
279 estId: id
280 }, function(response) {
281 var resp = JSON.parse(response);
282 if (resp.type == "success") {
283 if (isNaN(resp.res) || resp.res == -1) { // Still calculating
284 if (retry >= 10) {
285 $("#settings-widget").cardOverlay("error", {message: "Warmup estimation failed. Please try again or contact support if the issue persists.", dismissable: true});
286 } else {
287 setTimeout( (function(id, retry){
288 estimateWarmup(id, retry);
289 })(id, retry+1), 1000 );
290 }
291 } else {
292 if (resp.res == 0) {
293 $("#settings-widget").cardOverlay("notify", {message: "We could not find any links for warming up on your home page", timeout: 3000});
294 } else {
295 var confirmHtml = '<p>Enabling cache warmup will use ' + resp.res + ' page optimizations. Would you like to continue?</p>';
296 confirmHtml += '<p><a href="javascript:void(0);" onclick="rejectWarmup()" class="btn btn-default btn-sm">No</a>&nbsp;&nbsp;<a href="javascript:void(0);" onclick="confirmWarmup()" class="btn btn-success btn-sm">Yes</p></a>';
297 $("#settings-widget").cardOverlay("notify", {message: confirmHtml});
298 }
299 }
300 } else {
301 $("#settings-widget").cardOverlay("error", {message: "Warmup estimation failed", timeout: 3000});
302 }
303 });
304 }
305 }
306
307 window.confirmWarmup = function() {
308 $("#settings-widget").cardOverlay("loading", {message: "Enabling warmup"});
309 enableWarmup();
310 }
311
312 window.rejectWarmup = function() {
313 $("#settings-widget").cardOverlay("clear");
314 }
315
316 var enableWarmup = () => {
317 jQuery.post(ajaxurl, {
318 action: 'nitropack_enable_warmup'
319 }, function(response) {
320 var resp = JSON.parse(response);
321 if (resp.type == "success") {
322 $("#settings-widget").cardOverlay("clear");
323 $("#warmup-status").attr("checked", true);
324 } else {
325 setTimeout(enableWarmup, 1000);
326 }
327 });
328 }
329
330 var disableWarmup = () => {
331 jQuery.post(ajaxurl, {
332 action: 'nitropack_disable_warmup'
333 }, function(response) {
334 var resp = JSON.parse(response);
335 if (resp.type == "success") {
336 // Success notification
337 } else {
338 // Error notification
339 }
340 });
341 }
342
343 var runWarmup = () => {
344 jQuery.post(ajaxurl, {
345 action: 'nitropack_run_warmup'
346 }, function(response) {
347 var resp = JSON.parse(response);
348 if (resp.type == "success") {
349 // Success notification
350 } else {
351 // Error notification
352 }
353 });
354 }
355
356 var getOptimizations = _ => {
357 $.ajax({
358 url: '<?php echo $optimizationDetailsUrl; ?>',
359 type: 'GET',
360 dataType: 'json',
361 success: function(data) {
362 $('[data-last-cache-purge]').text(data.last_cache_purge.timeAgo);
363 if (data.last_cache_purge.reason) {
364 $('[data-purge-reason]').text(data.last_cache_purge.reason);
365 $('#last-cache-purge-reason').show();
366 } else {
367 $('#last-cache-purge-reason').hide();
368 }
369
370 if (data.pending_count) {
371 $("#pending-optimizations-count").text(data.pending_count);
372 $("#pending-optimizations-section").show();
373 } else {
374 $("#pending-optimizations-section").hide();
375 }
376
377 $('[data-optimized-pages-desktop]').text(data.optimized_pages.desktop);
378 $('[data-optimized-pages-mobile]').text(data.optimized_pages.mobile);
379 $('[data-optimized-pages-tablet]').text(data.optimized_pages.tablet);
380 $('[data-optimized-pages-total]').text(data.optimized_pages.total);
381
382 $("#optimizations-widget").cardOverlay("clear");
383 },
384 error: function() {
385 //Overlay.error("An unexpected error has occurred.", 10000, true);
386 },
387 complete: function() {
388 if (!getOptimizationsTimeout) {
389 getOptimizationsTimeout = setTimeout(function() {getOptimizationsTimeout = null; getOptimizations();}, 60000);
390 }
391 }
392 })
393 }
394
395 var getPlan = _ => {
396 $.ajax({
397 url: '<?php echo $planDetailsUrl; ?>',
398 type: 'GET',
399 dataType: 'json',
400 success: function(data) {
401 $('[data-plan-title]').text(data.plan_title);
402 $('[data-next-billing]').text(data.next_billing ? data.next_billing : 'N/A');
403 $('[data-next-reset]').text(data.next_reset ? data.next_reset : 'N/A');
404
405 for (prop in data) {
406 if (prop.indexOf("show_") === 0) continue;
407 if (prop.indexOf("label_") === 0) continue;
408 if (prop.indexOf("max_") === 0) continue;
409 if (
410 typeof data["show_" + prop] != "undefined" &&
411 data["show_" + prop] &&
412 typeof data["label_" + prop] != "undefined" &&
413 typeof data["max_" + prop] != "undefined"
414 ) {
415 let propertyLabel = data["label_" + prop];
416 let propertyValue = data[prop];
417 let propertyLimit = data["max_" + prop];
418 $("#plan-quotas").append('<li class="list-group-item px-0 d-flex justify-content-between align-items-center">' + propertyLabel + ' <span><span data-optimizations>' + propertyValue + '</span> out of <span data-max-optimizations>' + propertyLimit + '</span></span></li>');
419 }
420 }
421
422 $("#plan-details-widget").cardOverlay("clear");
423 },
424 error: function() {
425 $("#plan-details-widget").cardOverlay("error", {message: "Error while fetching plan data"});
426 }
427 })
428 }
429
430 var getQuickSetup = _ => {
431 $.ajax({
432 url: '<?php echo $quickSetupUrl; ?>',
433 type: 'GET',
434 dataType: 'json',
435 success: function(data) {
436 $('#range').val(data.optimization_level);
437 $('#manual-settings-url').attr('href', data.manual_settings_url);
438
439 document.getElementById('range').oninput(false);
440 $("#quicksetup-widget").cardOverlay("clear");
441 },
442 error: function() {
443 $("#plan-details-widget").cardOverlay("error", {message: "Error while fetching the optimization level settings"});
444 }
445 })
446 }
447
448 window.addEventListener("cache.invalidate.success", getOptimizations);
449 window.addEventListener("cache.purge.success", getOptimizations);
450
451
452 var autoDetectCompression = function() {
453 $("#settings-widget").cardOverlay("loading", {message: "Testing current compression status"});
454
455 $.post(ajaxurl, {
456 action: 'nitropack_test_compression_ajax'
457 }, function(response) {
458 var resp = JSON.parse(response);
459 if (resp.status == "success") {
460 if (resp.hasCompression) { // compression already enabled
461 $("#compression-status").attr("checked", false);
462 $("#settings-widget").cardOverlay("success", {message: "Compression is already enabled on your server! There is no need to enable it in NitroPack.", timeout: 3000});
463 } else { // no compression - enable ours
464 $("#compression-status").attr("checked", true);
465 $("#settings-widget").cardOverlay("success", {message: "No compression was detected! We will now enable it in NitroPack.", timeout: 3000});
466 }
467 Notification.success('Compression settings saved');
468 } else {
469 $("#settings-widget").cardOverlay("error", {message: "Could not determine compression status automatically. Please configure it manually.", timeout: 3000});
470 }
471 });
472 }
473
474 $("#compression-status").on("click", function(e) {
475 $.post(ajaxurl, {
476 action: 'nitropack_set_compression_ajax',
477 data: {
478 compressionStatus: $(this).is(":checked") ? 1 : 0
479 }
480 }, function(response) {
481 Notification.success('Compression settings saved');
482 });
483 });
484
485 $("#auto-purge-status").on("click", function(e) {
486 $.post(ajaxurl, {
487 action: 'nitropack_set_auto_cache_purge_ajax',
488 autoCachePurgeStatus: $(this).is(":checked") ? 1 : 0
489 }, function(response) {
490 Notification.success('Automatic cache purge settings saved');
491 });
492 });
493
494 $("#save-cacheable-post-types").on("click", function(e) {
495 $(this).find("i").removeClass("d-none");
496 $.ajax({
497 url: ajaxurl,
498 type: "POST",
499 data: {
500 action: 'nitropack_set_cacheable_post_types',
501 cacheableObjectTypes: $('.cacheable-post-type:checked').map(function(i, el){ return el.name; }).toArray()
502 },
503 success: function() {
504 Notification.success('Changes saved');
505 },
506 error: function() {
507 Notification.error('There was an error while saving the changes. Please try again.');
508 },
509 complete: function() {
510 $("#save-cacheable-post-types i").addClass("d-none");
511 $("#cacheable-post-types-modal").modal("hide");
512 }
513 });
514 });
515
516 $(document).on('click', "#compression-test-btn", e => {
517 e.preventDefault();
518
519 autoDetectCompression();
520 });
521
522 window.confirmDisconnect = function() {
523 $("#settings-widget").cardOverlay("loading", {message: "Disconnecting..."});
524 $.ajax({
525 url: ajaxurl,
526 type: "POST",
527 data: {
528 action: "nitropack_disconnect"
529 },
530 complete: function() {
531 location.reload();
532 }
533 });
534 }
535
536 window.rejectDisconnect = function() {
537 $("#settings-widget").cardOverlay("clear");
538 }
539
540 $(document).on('click', "#disconnect-btn", e => {
541 e.preventDefault();
542
543 var confirmHtml = '<p>This will disconnect the plugin and NitroPack.io will stop working. Are you sure that you wish to continue?</p>';
544 confirmHtml += '<p><a href="javascript:void(0);" onclick="rejectDisconnect()" class="btn btn-default btn-sm">No</a>&nbsp;&nbsp;<a href="javascript:void(0);" onclick="confirmDisconnect()" class="btn btn-success btn-sm">Yes</p></a>';
545 $("#settings-widget").cardOverlay("notify", {message: confirmHtml});
546 });
547
548 $("#warmup-status-slider").on("click", function(e) {
549 e.preventDefault();
550 var isEnabled = $("#warmup-status").is(":checked");
551 if (isEnabled) {
552 disableWarmup();
553 $("#warmup-status").attr("checked", false);
554 } else {
555 estimateWarmup();
556 }
557 });
558
559 var loadWarmupStatus = function() {
560 $.ajax({
561 url: ajaxurl,
562 type: "POST",
563 data: {
564 action: "nitropack_warmup_stats"
565 },
566 dataType: "json",
567 success: function(resp) {
568 if (resp.type == "success") {
569 $("#warmup-status").attr("checked", !!resp.stats.status);
570 $("#loading-warmup-status").hide();
571 $("#warmup-toggle").show();
572 } else {
573 setTimeout(loadWarmupStatus, 500);
574 }
575 }
576 });
577 }
578 loadWarmupStatus();
579 })(jQuery);
580
581 (_ => {
582 const classIndex = {
583 1: 'range-success',
584 2: 'range-warning',
585 3: 'range-danger',
586 4: 'range-ludicrous',
587 5: 'range-manual',
588 }
589
590 const atTimeout = (_ => {
591 var timeout;
592
593 return (callback, time) => {
594 clearTimeout(timeout);
595 timeout = setTimeout(callback, time)
596 };
597 })();
598
599 const saveSetting = function(value) {
600 return new Promise((resolve, reject) => {
601 var xhr = new XMLHttpRequest();
602
603 xhr.open("POST", '<?php echo $quickSetupSaveUrl; ?>', true);
604
605 //Send the proper header information along with the request
606 xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
607
608 xhr.onreadystatechange = function() { // Call a function when the state changes.
609 if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {
610 resolve();
611 }
612 }
613
614 xhr.send("setting=" + value);
615 });
616 }
617
618 document.getElementById('range').oninput = function() {
619 var children = document.getElementById('description').children;
620 var shown = parseInt(this.value);
621
622 for (var i = 0; i < children.length; i++) {
623 children.item(i).classList.toggle('hidden', i != shown);
624 }
625
626 document.getElementById('range').classList.remove('range-success', 'range-warning', 'range-danger', 'range-ludicrous', 'range-manual');
627
628 if (classIndex[shown]) {
629 document.getElementById('range').classList.add(classIndex[shown]);
630 }
631
632 atTimeout(async function() {
633 await saveSetting(shown);
634 }, 500);
635 };
636
637 var min = parseInt(document.getElementById('range').min);
638 var max = parseInt(document.getElementById('range').max);
639 for (var i = min; i <= max; i++) {
640 let divisor = document.createElement('div');
641 divisor.classList.add("divisor");
642 document.getElementById('divisors').appendChild(divisor);
643
644 let label = document.createElement('div');
645 label.textContent = document.getElementById('description').children.item(i).getElementsByTagName('h6').item(0).textContent;
646 label.classList.add("label");
647 document.getElementById('labels').appendChild(label);
648 }
649 })();
650 </script>
651