PluginProbe
Easy Elements for Elementor – Addons & Website Templates / 1.5.0
Easy Elements for Elementor – Addons & Website Templates v1.5.0
1.5.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.6 1.4.7 1.4.8 1.4.5 1.4.4 1.4.3 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 All 47 releases
easy-elements / assets / js / admin.js

admin.js in Easy Elements for Elementor – Addons & Website Templates 1.5.0, at assets/js/admin.js

1,281 lines 53.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 (function($) {
2 'use strict';
3
4 var EasyElementsAdmin = {
5
6 init: function() {
7 this.initWidgetToggles();
8 this.initSearchFunctionality();
9 this.initBulkActions();
10 this.initAllExtensions();
11 this.easyEltab();
12 this.easyElFilter();
13 this.easyelVideoPopuo();
14 this.easyelFaq();
15 this.initSettings();
16 this.EasyelWidgetGroupEnable();
17 },
18
19 initWidgetToggles: function() {
20
21 $('.widget-toggle-checkbox').on('change', function () {
22
23 var checkbox = $(this);
24 var mainWrap = $('.easyel-plugin-main-settings-page');
25 var indicator = mainWrap.find('.easyel-saving-indicator');
26
27 var widgetKey = checkbox.data('widget-key');
28 var status = checkbox.is(':checked') ? '1' : '0';
29
30 if (!widgetKey) return;
31
32 indicator.text('Saving...');
33 mainWrap.addClass('is-saving');
34
35 $.ajax({
36 url: ajaxurl,
37 type: 'POST',
38 data: {
39 action: 'easy_elements_save_widget_setting',
40 widget_key: widgetKey,
41 status: status,
42 nonce: easyElementsData.widget_settings_nonce
43 },
44
45 success: function (response) {
46
47 if (response.success) {
48
49 indicator.text('Saved');
50
51 setTimeout(function () {
52 mainWrap.removeClass('is-saving');
53 indicator.text('Saving...');
54 }, 500 );
55
56 } else {
57 // Pro-locked items never reach this branch in
58 // normal use (click is intercepted at the
59 // upgrade-modal handler). On any other save
60 // failure just revert silently.
61 checkbox.prop('checked', !checkbox.is(':checked'));
62 mainWrap.removeClass('is-saving');
63 }
64 },
65
66 error: function () {
67 mainWrap.removeClass('is-saving');
68 checkbox.prop('checked', !checkbox.is(':checked'));
69 }
70 });
71 });
72
73
74
75
76 },
77
78 initSearchFunctionality: function() {
79
80 function hideEmptyGroups() {
81 $('.easyel-widgets-grid').each(function () {
82 var wrapper = $(this);
83 var items = wrapper.find('.easy-widget-item');
84
85 var visibleItems = items.filter(function () {
86 return $(this).css('display') !== 'none';
87 }).length;
88
89 var headingGroup = wrapper.prev('.easyel-widget-heading-group');
90
91 if (visibleItems === 0) {
92 headingGroup.hide();
93 wrapper.hide();
94 } else {
95 headingGroup.show();
96 wrapper.show();
97 }
98 });
99 }
100
101 $('#element-search').on('input', function() {
102 var searchTerm = $(this).val().toLowerCase();
103
104 $('.easy-widget-item').each(function() {
105 var widgetTitle = $(this).find('.widget-header strong').text().toLowerCase();
106 var widgetDesc = $(this).find('.widget-description').text().toLowerCase();
107
108 if (widgetTitle.includes(searchTerm) || widgetDesc.includes(searchTerm)) {
109 $(this).show();
110 } else {
111 $(this).hide();
112 }
113 });
114
115 hideEmptyGroups();
116 });
117
118 hideEmptyGroups();
119 },
120
121
122 initBulkActions: function() {
123 $('#activate-all-btn').on('click', function() {
124 var currentTab = $('.easyel-nav-tab-active').data('tab');
125 EasyElementsAdmin.performBulkAction('activate_all', currentTab);
126 });
127
128 $('#deactivate-all-btn').on('click', function() {
129 EasyElementsAdmin.performBulkAction('deactivate_all');
130 });
131 },
132
133 performBulkAction: function(action) {
134
135 var currentTab = $('.easyel-nav-tab-active').data('tab');
136 var currentFilter = $('.easyel-action-btn.active').data('filter');
137 var btn = action === 'activate_all' ? $('#activate-all-btn') : $('#deactivate-all-btn');
138 var originalText = btn.text();
139
140 let mainWrap = $('.easyel-plugin-main-settings-page');
141 let indicator = mainWrap.find('.easyel-saving-indicator');
142
143 btn.prop('disabled', true).text(easyElementsData.strings.processing);
144
145 indicator.text('Saving...');
146 mainWrap.addClass('is-saving');
147
148 $.post(ajaxurl, {
149 action: 'easy_elements_bulk_action',
150 bulk_action: action,
151 tab: currentTab,
152 filter: currentFilter,
153 nonce: easyElementsData.bulk_action_nonce
154 })
155 .done(function(response) {
156
157 if (response.success) {
158
159 $('.widget-toggle-checkbox').each(function() {
160 var $checkbox = $(this);
161 let item = $checkbox.closest('.easy-widget-item');
162
163 if ($checkbox.data('tab') !== currentTab) {
164 return;
165 }
166
167 let isProWidget = item.hasClass('easyel-pro-widget');
168
169 if (currentFilter === 'easyel_free' && isProWidget) {
170 return;
171 }
172
173 if (currentFilter === 'easyel_pro' && !isProWidget) {
174 return;
175 }
176
177 // Pro-only widgets aren't registered when the
178 // premium add-on is inactive, so a bulk "activate"
179 // request to the server is rejected for them. Mirror
180 // that here: leave them unchecked rather than
181 // pretending the bulk action affected them.
182 if (isProWidget && !response.data.is_pro_active) {
183 $checkbox.prop('checked', false);
184 } else {
185 $checkbox.prop('checked', action === 'activate_all');
186 }
187
188 });
189
190 $('.easyel-group-toggle-widget').each(function() {
191 let groupCheckbox = $(this);
192 let groupSlug = groupCheckbox.data('group');
193 let groupWrapper = $('.easyel-widgets-grid[data-group="' + groupSlug + '"]');
194
195 let allChecked = true;
196 groupWrapper.find('.widget-toggle-checkbox').each(function() {
197 if (!$(this).prop('checked') && !$(this).closest('.easyel-widget-item').hasClass('easyel-pro-enable')) {
198 allChecked = false;
199 return false;
200 }
201 });
202
203 groupCheckbox.prop('checked', allChecked);
204 groupCheckbox.closest('.easyel-toggle-switch-widget').find('.easyel-enable-all-widget').text(allChecked ? 'Disable All' : 'Enable All');
205 });
206
207 indicator.text('Saved');
208
209 setTimeout(function() {
210 mainWrap.removeClass('is-saving');
211 indicator.text('Saving...');
212 }, 700);
213 }
214 })
215 .fail(function() {
216 // Error fallback
217 mainWrap.removeClass('is-saving');
218 })
219 .always(function() {
220 btn.prop('disabled', false).text(originalText);
221 });
222 },
223
224 EasyelWidgetGroupEnable: function() {
225
226 function EasyupdateEnableAllText2(groupCheckbox, groupWrapper) {
227 let allChecked = true;
228 let availableWidgets = groupWrapper.find('.widget-toggle-checkbox').not(':disabled').closest('.easy-widget-item').not('.easyel-pro-enable');
229
230 if (availableWidgets.length === 0) {
231 allChecked = false;
232 } else {
233 availableWidgets.each(function() {
234 let checkbox = $(this).find('.widget-toggle-checkbox');
235 if (!checkbox.prop('checked')) {
236 allChecked = false;
237 return false;
238 }
239 });
240 }
241
242 let textSpan = groupCheckbox.closest('.easyel-toggle-switch-widget').find('.easyel-enable-all-widget');
243
244 textSpan.text(allChecked ? 'Disable All' : 'Enable All');
245 groupCheckbox.prop('checked', allChecked);
246 }
247
248 let groupTabEnable = $(".easyel-tab-panel.widget");
249
250 groupTabEnable.find('.easyel-group-toggle-widget').each(function() {
251 let groupCheckbox = $(this);
252 let groupSlug = groupCheckbox.data('group');
253 let groupWrapper = $('.easyel-widgets-grid[data-group="' + groupSlug + '"]');
254
255 EasyupdateEnableAllText2(groupCheckbox, groupWrapper);
256 });
257
258 groupTabEnable.on('change', '.easyel-group-toggle-widget', function () {
259
260 let groupCheckbox = $(this);
261 let groupSlug = groupCheckbox.data('group');
262 let groupWrapper = $('.easyel-widgets-grid[data-group="' + groupSlug + '"]');
263 let hiddenField = $('input.easyel-group-hidden[name="easy_element_group_' + groupSlug + '"]');
264
265 let status = groupCheckbox.is(':checked') ? 1 : 0;
266
267 groupWrapper.find('.widget-toggle-checkbox').each(function () {
268
269 let checkbox = $(this);
270 let widgetItem = checkbox.closest('.easy-widget-item');
271
272 if (widgetItem.hasClass('easyel-pro-enable')) return;
273 checkbox.prop('checked', status === 1);
274 });
275
276
277 hiddenField.val(status);
278
279 EasyupdateEnableAllText2( groupCheckbox, groupWrapper );
280
281 let keys = [];
282 groupWrapper.find('.widget-toggle-checkbox').each(function() { keys.push($(this).data('key')); });
283 if (keys.length) {
284 $.post(ajaxurl, {
285 action: 'easy_elements_bulk_group_action',
286 group: groupSlug,
287 status: status,
288 nonce: easyElementsData.bulk_action_nonce
289 });
290 }
291 });
292 },
293
294 initAllExtensions: function() {
295 let $extensionsTab = $('.easyel-tab-panel.extensions');
296
297 // On page load: hide settings icon for unchecked extensions
298 $('.easyel-extension-toggle').each(function () {
299 var $item = $(this).closest('.easyel-extension-item');
300 var $gear = $item.find('.dashicons-admin-generic');
301 if ($gear.length) {
302 if (!$(this).is(':checked')) {
303 $gear.hide();
304 }
305 }
306 });
307
308 $('.easyel-extension-toggle').on('change', function () {
309 let checkbox = $(this);
310 let key = checkbox.data('key');
311 let tab = checkbox.data('tab');
312 let status = checkbox.is(':checked') ? 1 : 0;
313
314 // Show/hide settings icon based on toggle
315 let $item = checkbox.closest('.easyel-extension-item');
316 let $gear = $item.find('.dashicons-admin-generic');
317 if ($gear.length) {
318 status ? $gear.show() : $gear.hide();
319 }
320
321 let mainWrap = $('.easyel-plugin-main-settings-page');
322 let indicator = mainWrap.find('.easyel-saving-indicator');
323
324 indicator.text('Saving...');
325 mainWrap.addClass('is-saving');
326
327 const featureWidgetMap = {
328 enable_megamenu_builder: 'mega_menu_widget'
329 };
330
331
332 $.post(ajaxurl, {
333 action: 'easy_elements_save_global_extensions',
334 tab: tab,
335 key: key,
336 status: status,
337 nonce: easyElementsData.widget_settings_nonce
338 })
339 .done(function(response) {
340 if (response.success) {
341 indicator.text('Saved');
342
343 if (featureWidgetMap[key]) {
344 const widgetKey = featureWidgetMap[key];
345 const widgetEl = $('.easy-widget-item[data-widget-key="' + widgetKey + '"]');
346
347 if (status === 0) {
348
349 widgetEl.slideUp(200, function () {
350 $(this).remove();
351 });
352 } else {
353 indicator.text('Reloading…');
354
355 setTimeout(function () {
356 location.reload();
357 }, 300);
358 }
359 }
360
361
362 } else {
363 // Pro-locked items never reach this branch in
364 // normal use (click is intercepted at the
365 // upgrade-modal handler). On any other save
366 // failure just revert silently.
367 checkbox.prop('checked', !checkbox.is(':checked'));
368 mainWrap.removeClass('is-saving');
369 return;
370 }
371
372 setTimeout(function() {
373 mainWrap.removeClass('is-saving');
374 indicator.text('Saving...');
375 }, 500);
376 })
377 .fail(function () {
378 mainWrap.removeClass('is-saving');
379 checkbox.prop('checked', !checkbox.is(':checked'));
380 });
381 });
382
383 function EasyupdateEnableAllText(groupCheckbox) {
384 let status = groupCheckbox.is(':checked') ? 1 : 0;
385 let label = groupCheckbox.closest('.easyel-toggle-switch-extension');
386 let textSpan = label.find('.easyel-enable-all');
387 let groupSlug = groupCheckbox.data('group');
388 let groupWrapper = $('.easyel-extension-wrapper[data-group="' + groupSlug + '"]');
389
390 let totalItems = groupWrapper.find('.easyel-extension-item').length;
391 let proItems = groupWrapper.find('.easyel-extension-item.easyel-pro-enable').length;
392
393 if (totalItems > 0 && totalItems === proItems) {
394 groupCheckbox.prop('disabled', true);
395 label.css({'opacity': '1','border':'none', 'cursor': 'not-allowed'});
396
397 return;
398 }
399
400 if (status === 1) {
401 textSpan.text('Disable All');
402 } else {
403 textSpan.text('Enable All');
404 }
405 }
406
407 // Run when the Extensions tab initializes
408 $extensionsTab.find('.easyel-group-toggle').each(function() {
409 EasyupdateEnableAllText($(this));
410 });
411
412 $extensionsTab.on('change', '.easyel-group-toggle', function () {
413 let groupCheckbox = $(this);
414 let groupSlug = groupCheckbox.data('group');
415 let groupWrapper = $('.easyel-extension-wrapper[data-group="' + groupSlug + '"]');
416 let hiddenField = $('input.easyel-group-hidden[name="easy_element_group_' + groupSlug + '"]');
417
418 let status = groupCheckbox.is(':checked') ? 1 : 0;
419
420 EasyupdateEnableAllText(groupCheckbox);
421
422
423 groupWrapper.find('.easyel-extension-toggle').each(function () {
424 let checkbox = $(this);
425 if (checkbox.closest('.easyel-extension-item').hasClass('easyel-pro-enable')) return;
426 checkbox.prop('checked', status === 1);
427
428 // Show/hide settings icon
429 let $gear = checkbox.closest('.easyel-extension-item').find('.dashicons-admin-generic');
430 if ($gear.length) {
431 status ? $gear.show() : $gear.hide();
432 }
433 });
434
435 hiddenField.val(status);
436
437 let mainWrap = $('.easyel-plugin-main-settings-page');
438 let indicator = mainWrap.find('.easyel-saving-indicator');
439
440 indicator.text('Saving...');
441 mainWrap.addClass('is-saving');
442
443 let keys = [];
444 groupWrapper.find('.easyel-extension-toggle').each(function() { keys.push($(this).data('key')); });
445 if (keys.length) {
446 $.post(ajaxurl, {
447 action: 'easy_elements_save_global_extensions_bulk',
448 tab: 'extensions',
449 keys: keys,
450 status: status,
451 group: groupSlug,
452 nonce: easyElementsData.widget_settings_nonce
453 }).done(function(response) {
454 if (response.success) {
455 indicator.text('Saved');
456 } else {
457 indicator.text('Failed');
458 }
459
460 setTimeout(function() {
461 mainWrap.removeClass('is-saving');
462 indicator.text('Saving...');
463 }, 500 );
464 })
465 .fail(function() {
466 indicator.text('Failed');
467 setTimeout(function() {
468 mainWrap.removeClass('is-saving');
469 indicator.text('Saving...');
470 }, 700);
471 });
472 }
473 else {
474 setTimeout(function() {
475 mainWrap.removeClass('is-saving');
476 indicator.text('Saving...');
477 }, 500);
478 }
479 });
480 },
481
482 easyEltab: function() {
483 $('#toplevel_page_easy-elements-dashboard ul.wp-submenu a').on('click', function (e) {
484 const href = $(this).attr('href');
485 const isDashboardPage = window.location.href.includes('page=easy-elements-dashboard');
486
487 if (isDashboardPage && href.includes('#')) {
488 e.preventDefault();
489
490 let tab = 'overview';
491 if (href.includes('#widget')) tab = 'widget';
492 if (href.includes('#extensions')) tab = 'extensions';
493 if (href.includes('#activate_license')) tab = 'activate_license';
494
495 activateTab(tab);
496 history.replaceState(null, null, '#' + tab);
497 }
498 });
499
500 let hash = window.location.hash.substring(1);
501 if (hash) activateTab(hash);
502 else activateTab('overview');
503
504 $('.easyel-nav-tab').click(function (e) {
505 const tab = $(this).data('tab');
506
507 // No data-tab → treat as a real link (e.g. Starter Templates page).
508 if (!tab) return;
509
510 e.preventDefault();
511 activateTab(tab);
512 history.replaceState(null, null, '#' + tab);
513 });
514
515 function activateTab(tab) {
516 $('.easyel-nav-tab').removeClass('easyel-nav-tab-active');
517 $('.easyel-nav-tab[data-tab="' + tab + '"]').addClass('easyel-nav-tab-active');
518 $('.easyel-tab-panel').hide();
519 $('#tab-' + tab).show();
520 $('#toplevel_page_easy-elements-dashboard ul.wp-submenu li').removeClass('current');
521 $('#toplevel_page_easy-elements-dashboard ul.wp-submenu a[href*="#' + tab + '"]').parent().addClass('current');
522 }
523 },
524
525 easyElFilter: function() {
526 $(".easyel-action-btn").on("click", function() {
527 var filter = $(this).data("filter");
528 $(".easyel-action-btn").removeClass("active");
529 $(this).addClass("active");
530
531 $(".easy-widget-item,.easyel-extension-item").each(function() {
532 var $widget = $(this);
533
534 if (filter === "easyel_all") $widget.show();
535 else if (filter === "easyel_free") {
536 if ($widget.hasClass("easyel-pro-widget")) $widget.hide();
537 else $widget.show();
538 } else if (filter === "easyel_pro") {
539 if ($widget.hasClass("easyel-pro-widget")) $widget.show();
540 else $widget.hide();
541 }
542 });
543 });
544 },
545
546 easyelVideoPopuo: function() {
547 if ($(".easyel-video-popup").length ) {
548 var $popup = $('#easyel-popup-video-area'),
549 $videoContainer = $popup.find('.easyel-popup-video');
550
551 $('.easyel-video-popup').on('click', function(e){
552 e.preventDefault();
553 var videoId = $(this).attr('href').split('v=')[1].split('&')[0];
554 $videoContainer.html('<iframe src="https://www.youtube.com/embed/' + videoId + '?autoplay=1" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>');
555 $popup.fadeIn();
556 });
557
558 $popup.on('click', '.easyel-popup-close, #easyel-popup-video-area', function(e){
559 if($(e.target).is('.easyel-popup-close') || $(e.target).is('#easyel-popup-video-area')){
560 $popup.fadeOut();
561 $videoContainer.html('');
562 }
563 });
564 };
565 },
566
567 easyelFaq: function() {
568 if ($(".easyel-faq-item").length ) {
569 $(".easyel-faq-item.active").find(".easyel-faq-item-content").show();
570 $(".easyel-faq-item-heading").click(function(){
571 var faqItem = $(this).closest(".easyel-faq-item");
572 var content = faqItem.children(".easyel-faq-item-content");
573
574 if(faqItem.hasClass("active")){
575 faqItem.removeClass("active");
576 content.slideUp(300);
577 } else {
578 $(".easyel-faq-item.active").removeClass("active").children(".easyel-faq-item-content").slideUp(300);
579 faqItem.addClass("active");
580 content.slideDown(300);
581 }
582 });
583 };
584 },
585
586 easyel_notify: function(message, type = 'success', duration = 3000) {
587 const toast = document.createElement('div');
588 toast.className = `easyel-toast ${type}`;
589 toast.innerText = message;
590
591 document.body.appendChild(toast);
592
593 // Show animation
594 setTimeout(() => toast.classList.add('show'), 50);
595
596 // Auto remove after duration
597 setTimeout(() => {
598 toast.classList.remove('show');
599 setTimeout(() => toast.remove(), 300);
600 }, duration);
601 },
602
603 initSettings: function() {
604 $('#easyel-settings-save').click(function (e) {
605 e.preventDefault();
606
607 let dataArr = $('#easyel-settings-form').serializeArray();
608 let settings = {};
609
610 dataArr.forEach(field => {
611 let name = field.name;
612 let value = field.value;
613
614 // Detect nested name e.g. fb_config[page_id]
615 if (name.includes('[')) {
616 let mainKey = name.split('[')[0]; // fb_config
617 let subKey = name.match(/\[(.*?)\]/)[1]; // page_id
618
619 if (!settings[mainKey]) settings[mainKey] = {}; // init object
620 settings[mainKey][subKey] = value; // assign value
621 } else {
622 // simple field (no nested)
623 settings[name] = value;
624 }
625 });
626
627 $.ajax({
628 url: ajaxurl,
629 type: "POST",
630 data: {
631 action: "easyel_save_user_data",
632 security: easyElementsData.nonce,
633 settings: settings
634 },
635 beforeSend: function () {
636 $('#easyel-settings-save')
637 .text("Saving...")
638 .prop("disabled", true);
639 },
640 success: function(res){
641 $('#easyel-settings-save')
642 .text('Save Settings')
643 .prop('disabled', false);
644
645 if(res.success){
646 EasyElementsAdmin.easyel_notify(res.data.message, 'success');
647 } else {
648 EasyElementsAdmin.easyel_notify('Error saving settings.', 'error');
649 }
650 },
651 error: function(){
652 EasyElementsAdmin.easyel_notify('AJAX error!', 'error');
653 $('#easyel-settings-save').text('Save Settings').prop('disabled', false);
654 }
655 });
656
657 });
658 },
659 };
660
661 $(document).ready(function() {
662 EasyElementsAdmin.init();
663 });
664
665 window.EasyElementsAdmin = EasyElementsAdmin;
666
667 $(document).ready(function ($) {
668
669 function hideEmptyGroups() {
670
671 $('.easyel-widgets-grid').each(function () {
672 var wrapper = $(this);
673
674 var items = wrapper.find('.easy-widget-item');
675
676 var visibleItems = items.filter(function () {
677 return $(this).css('display') !== 'none';
678 }).length;
679
680 var headingGroup = wrapper.prev('.easyel-widget-heading-group');
681
682 if (visibleItems === 0) {
683 headingGroup.hide();
684 } else {
685 headingGroup.show();
686 }
687 });
688 }
689
690 hideEmptyGroups();
691
692 $(document).on('click', '.easyel-action-btn', function () {
693 setTimeout(hideEmptyGroups, 50);
694 });
695
696 });
697
698
699 $(document).ready(function() {
700
701 $('.easyel-scroll-smoother-popup-setting').on('click', function(e) {
702 e.preventDefault();
703
704 $('.easyel-smooth-scroll-popup').addClass('active');
705 $('html').addClass('popup-opened');
706 });
707
708 $('.easyel-smooth-scroll-popup-close-icon').on('click', function(e) {
709 e.preventDefault();
710 $('.easyel-smooth-scroll-popup').removeClass('active');
711 $('html').removeClass('popup-opened');
712 });
713
714 if ( $('.easyel-smooth-scroll-color').length > 0 ) {
715 $('.easyel-smooth-scroll-color').wpColorPicker();
716 }
717
718 });
719
720 $(document).ready(function() {
721
722 $('.easyel-readingprogress-bar-popup-setting').on('click', function(e) {
723 e.preventDefault();
724
725 $('.easyel-reading-progressbar-popup').addClass('active');
726 $('html').addClass('popup-opened');
727 });
728
729 $('.easyel-reading-progressbar-popup-close-icon').on('click', function(e) {
730 e.preventDefault();
731 $('.easyel-reading-progressbar-popup').removeClass('active');
732 $('html').removeClass('popup-opened');
733 });
734 });
735
736 $(document).ready(function() {
737 var scrollTopColorInitialized = false;
738
739 $('.easyel-scroll-top-popup-setting').on('click', function(e) {
740 e.preventDefault();
741 $('.easyel-scroll-top-popup').addClass('active');
742 $('html').addClass('popup-opened');
743
744 // Init color pickers inside popup on first open
745 if (!scrollTopColorInitialized) {
746 scrollTopColorInitialized = true;
747 $('.easyel-scroll-top-popup .easyel-color-picker').each(function() {
748 var $input = $(this);
749 // Destroy existing wpColorPicker if any
750 if ($input.closest('.wp-picker-container').length) {
751 $input.closest('.wp-picker-container').replaceWith($input);
752 }
753 $input.wpColorPicker({
754 change: function(event, ui) {
755 $(event.target).val(ui.color.toString());
756 $('.scroll_top_popup_item_save').prop('disabled', false).val('Save Changes');
757 },
758 clear: function() {
759 $('.scroll_top_popup_item_save').prop('disabled', false).val('Save Changes');
760 }
761 });
762 });
763 }
764 });
765
766 $('.easyel-scroll-top-popup-close-icon').on('click', function(e) {
767 e.preventDefault();
768 $('.easyel-scroll-top-popup').removeClass('active');
769 $('html').removeClass('popup-opened');
770 });
771
772 // Icon type toggle — show/hide custom icon / image fields
773 $(document).on('change', '#scroll_top_icon_select', function() {
774 var val = $(this).val();
775 $('.easyel-scroll-top-custom-icon-row').toggle(val === 'custom_icon');
776 $('.easyel-scroll-top-custom-image-row').toggle(val === 'custom_image');
777 });
778
779 // Image upload via WP media
780 $(document).on('click', '.easyel-scroll-top-upload-btn', function(e) {
781 e.preventDefault();
782 var frame = wp.media({
783 title: 'Select Scroll Top Image',
784 multiple: false,
785 library: { type: 'image' }
786 });
787 frame.on('select', function() {
788 var attachment = frame.state().get('selection').first().toJSON();
789 $('#scroll_top_custom_image').val(attachment.url);
790 $('.easyel-scroll-top-image-preview').attr('src', attachment.url).show();
791 $('.easyel-scroll-top-remove-btn').show();
792 $('.scroll_top_popup_item_save').prop('disabled', false).val('Save Changes');
793 });
794 frame.open();
795 });
796
797 // Remove image
798 $(document).on('click', '.easyel-scroll-top-remove-btn', function(e) {
799 e.preventDefault();
800 $('#scroll_top_custom_image').val('');
801 $('.easyel-scroll-top-image-preview').attr('src', '').hide();
802 $(this).hide();
803 $('.scroll_top_popup_item_save').prop('disabled', false).val('Save Changes');
804 });
805 });
806
807 function easyelDisplayMessage(message, type = 'success') {
808 let messageBox = $('#easyel-message-box');
809
810 if (type === 'success') {
811 messageBox.html('<p class="easyel-saved-success-message">' + message + '</p>').fadeIn().delay(1500).fadeOut();
812 }
813 }
814
815 $(document).ready(function($){
816
817 var $form = $('.easyel-smooth-scroll-settings-main-wrapper');
818 var $saveButton = $('.smooth_scroll_popup_item_save');
819
820 $saveButton.prop('disabled', true);
821
822 $form.on('input change', 'input, select', function() {
823 $saveButton.prop('disabled', false).val('Save Changes');
824 });
825
826 if ( $('.easyel-smooth-scroll-color').length > 0 ) {
827
828 $('.easyel-smooth-scroll-color').wpColorPicker({
829 change: function(event, ui) {
830 $saveButton.prop('disabled', false).val('Save Changes');
831 },
832 clear: function() {
833 $saveButton.prop('disabled', false).val('Save Changes');
834 }
835 });
836 }
837
838 $(document).on('click', '.smooth_scroll_popup_item_save', function(event){
839 event.preventDefault();
840
841 var saveButton = $(this);
842
843 saveButton.prop('disabled', true).val('Saving...');
844
845 var settings = {
846 smooth_scroll_speed: $('input[name="smooth_scroll_speed"]').val(),
847 smooth_scroll_normalize: $('input[name="smooth_scroll_normalize"]').is(':checked') ? 1 : 0,
848 smooth_scroll_enable_mobile: $('input[name="smooth_scroll_enable_mobile"]').is(':checked') ? 1 : 0,
849 smooth_scroll_disable_editor_mode: $('input[name="smooth_scroll_disable_editor_mode"]').is(':checked') ? 1 : 0,
850 enable_smooth_scroller: $('input[data-key="enable_smooth_scroller"]').is(':checked') ? 1 : 0,
851 smooth_scroll_width: $('input[name="smooth_scroll_width"]').val(),
852 smooth_scroll_normal_color: $('input[name="smooth_scroll_normal_color"]').val(),
853 smooth_scroll_highlight_color: $('input[name="smooth_scroll_highlight_color"]').val(),
854 };
855
856 // AJAX call
857 $.ajax({
858 url: ajaxurl,
859 type: 'POST',
860 dataType: 'json',
861 data: {
862 action: 'save_smooth_scroll_settings',
863 nonce: easyElementsData.nonce,
864 settings: settings
865 },
866 success: function(response){
867 if(response.success){
868 easyelDisplayMessage('All settings saved', 'success');
869 saveButton.val('Saved All Data').prop('disabled', true);
870 } else {
871 easyelDisplayMessage('Error saving settings', 'error');
872 saveButton.val('Save Changes').prop('disabled', false);
873 }
874 },
875 error: function(jqXHR, textStatus, errorThrown){
876 console.log('AJAX error:', textStatus, errorThrown);
877 easyelDisplayMessage('AJAX error: ' + textStatus, 'error');
878 saveButton.val('Save Changes').prop('disabled', false);
879 }
880 });
881 });
882 });
883
884 $(document).ready(function($){
885
886 var $form = $('.easyel-reading-progressbar-settings-main-wrapper');
887 var $saveButton = $('.reading_progressbar_popup_item_save');
888
889 $saveButton.prop('disabled', true);
890
891 // Enable save button on input/change
892 $form.on('input change', 'input, select', function() {
893 $saveButton.prop('disabled', false).val('Save Changes');
894 });
895
896 // Initialize color picker safely
897 if ( typeof wp !== 'undefined' && wp.colorPicker ) {
898 if ( $('.easyel-color-picker').length ) {
899 $('.easyel-color-picker').wpColorPicker();
900 }
901 }
902
903 // Save via AJAX
904 $(document).on('click', '.reading_progressbar_popup_item_save', function(event){
905 event.preventDefault();
906
907 var saveButton = $(this);
908 saveButton.prop('disabled', true).val('Saving...');
909
910 var settings = {
911 reading_progressbar_position: $('select[name="reading_progressbar_position"]').val(),
912 reading_progressbar_display: $('input[name="reading_progressbar_display[]"]:checked').map(function(){ return this.value; }).get(),
913 reading_progressbar_color: $('input[name="reading_progressbar_color"]').val(),
914 reading_progressbar_height: $('input[name="reading_progressbar_height"]').val(),
915 reading_progressbar_specific_page: $('select[name="reading_progressbar_specific_page[]"]').map(function(){ return $(this).val(); }).get(),
916 };
917
918 $.ajax({
919 url: ajaxurl,
920 type: 'POST',
921 dataType: 'json',
922 data: {
923 action: 'save_reading_progressbar_settings',
924 nonce: easyElementsData.nonce,
925 settings: settings
926 },
927 success: function(response){
928 if(response.success){
929 easyelDisplayMessage('Settings Saved', 'success');
930 saveButton.val('Saved All Data').prop('disabled', true);
931 } else {
932 easyelDisplayMessage('Error saving settings', 'error');
933 saveButton.val('Save Changes').prop('disabled', false);
934 }
935 },
936 error: function(jqXHR, textStatus, errorThrown){
937 console.log('AJAX error:', textStatus, errorThrown);
938 easyelDisplayMessage('AJAX error: ' + textStatus, 'error');
939 saveButton.val('Save Changes').prop('disabled', false);
940 }
941 });
942 });
943 });
944
945 // open close popup modal
946
947 function easyelAdminToggleOpenProModal() {
948 $('#easyel-admin-toggle-pro-upgrade-modal').addClass('active');
949 $('body').addClass('easyel-admin-toggle-modal-open');
950 }
951
952 function easyelAdminToggleCloseProModal() {
953 $('#easyel-admin-toggle-pro-upgrade-modal').removeClass('active');
954 $('body').removeClass('easyel-admin-toggle-modal-open');
955 }
956
957 /**
958 * Pro-locked items (widgets and extensions) — clicking the toggle
959 * area opens the upgrade modal instead of flipping the checkbox.
960 * Capture-phase + stopImmediatePropagation so the click never
961 * reaches the input's native toggle or the regular change handler
962 * that would otherwise fire an AJAX save.
963 */
964 document.addEventListener(
965 'click',
966 function (e) {
967 var trigger = e.target && e.target.closest
968 ? e.target.closest('.easyel-pro-enable .easyel-widget-card-switcher')
969 : null;
970 if ( ! trigger ) {
971 return;
972 }
973 e.preventDefault();
974 e.stopImmediatePropagation();
975 easyelAdminToggleOpenProModal();
976 },
977 true
978 );
979
980 // Close modal
981 $(document).on(
982 'click',
983 '.easyel-admin-toggle-pro-modal-close, \
984 .easyel-admin-toggle-pro-modal-cancel, \
985 .easyel-admin-toggle-pro-modal-overlay',
986 function () {
987 easyelAdminToggleCloseProModal();
988 }
989 );
990
991 // reading progressbar popup color js (exclude scroll-top + preloader popups — initialized separately)
992 if ( $('.easyel-color-picker').not('.easyel-scroll-top-popup .easyel-color-picker').not('.easyel-preloader-popup .easyel-color-picker').length ) {
993 $('.easyel-color-picker').not('.easyel-scroll-top-popup .easyel-color-picker').not('.easyel-preloader-popup .easyel-color-picker').wpColorPicker();
994 }
995
996 if( $('.easyel-readingprogress-barselect2').length ) {
997 $('.easyel-readingprogress-barselect2').select2({
998 width: '100%',
999 placeholder: 'Select a page',
1000 multiple: true,
1001 });
1002 }
1003
1004 if ( $('.easyel-color-picker').not('.easyel-scroll-top-popup .easyel-color-picker').not('.easyel-preloader-popup .easyel-color-picker').length ) {
1005 $('.easyel-color-picker').not('.easyel-scroll-top-popup .easyel-color-picker').not('.easyel-preloader-popup .easyel-color-picker').wpColorPicker({
1006 change: function (event, ui) {
1007 var color = ui.color.toString();
1008
1009 $(event.target).val(color);
1010
1011 $('.reading_progressbar_popup_item_save')
1012 .prop('disabled', false)
1013 .val('Save Changes');
1014 },
1015 clear: function () {
1016 $('.reading_progressbar_popup_item_save')
1017 .prop('disabled', false)
1018 .val('Save Changes');
1019 }
1020 });
1021 }
1022
1023 // Scroll Top settings save
1024 $(document).ready(function($){
1025
1026 var $popup = $('.easyel-scroll-top-popup');
1027 var $scrollTopSave = $('.scroll_top_popup_item_save');
1028
1029 $scrollTopSave.prop('disabled', true);
1030
1031 $popup.on('input change', 'input, select', function() {
1032 $scrollTopSave.prop('disabled', false).val('Save Changes');
1033 });
1034
1035 $(document).on('click', '.scroll_top_popup_item_save', function(event){
1036 event.preventDefault();
1037
1038 var saveButton = $(this);
1039 saveButton.prop('disabled', true).val('Saving...');
1040
1041 // Get color values from wpColorPicker hidden inputs
1042 var bgColor = $popup.find('input[name="scroll_top_bg_color"]').val();
1043 var iconColor = $popup.find('input[name="scroll_top_icon_color"]').val();
1044
1045 var settings = {
1046 scroll_top_icon: $popup.find('select[name="scroll_top_icon"]').val(),
1047 scroll_top_position: $popup.find('select[name="scroll_top_position"]').val(),
1048 scroll_top_bg_color: bgColor || '#333333',
1049 scroll_top_icon_color: iconColor || '#ffffff',
1050 scroll_top_size: $popup.find('input[name="scroll_top_size"]').val() || '45',
1051 scroll_top_radius: $popup.find('input[name="scroll_top_radius"]').val() || '50',
1052 scroll_top_offset: $popup.find('input[name="scroll_top_offset"]').val() || '300',
1053 scroll_top_border_width: $popup.find('input[name="scroll_top_border_width"]').val() || '0',
1054 scroll_top_border_color: $popup.find('input[name="scroll_top_border_color"]').val() || '#cccccc',
1055 scroll_top_hover_bg_color: $popup.find('input[name="scroll_top_hover_bg_color"]').val() || '#000000',
1056 scroll_top_hover_icon_color: $popup.find('input[name="scroll_top_hover_icon_color"]').val() || '#ffffff',
1057 scroll_top_hover_border_color: $popup.find('input[name="scroll_top_hover_border_color"]').val() || '#cccccc',
1058 scroll_top_custom_icon: $popup.find('input[name="scroll_top_custom_icon"]').val() || '',
1059 scroll_top_custom_image: $popup.find('input[name="scroll_top_custom_image"]').val() || '',
1060 };
1061
1062 $.ajax({
1063 url: ajaxurl,
1064 type: 'POST',
1065 dataType: 'json',
1066 data: {
1067 action: 'save_scroll_top_settings',
1068 nonce: easyElementsData.nonce,
1069 settings: settings
1070 },
1071 success: function(response){
1072 if(response.success){
1073 easyelDisplayMessage('Settings Saved', 'success');
1074 saveButton.val('Saved All Data').prop('disabled', true);
1075 } else {
1076 easyelDisplayMessage('Error saving settings', 'error');
1077 saveButton.val('Save Changes').prop('disabled', false);
1078 }
1079 },
1080 error: function(jqXHR, textStatus, errorThrown){
1081 console.log('AJAX error:', textStatus, errorThrown);
1082 easyelDisplayMessage('AJAX error: ' + textStatus, 'error');
1083 saveButton.val('Save Changes').prop('disabled', false);
1084 }
1085 });
1086 });
1087 });
1088
1089 // Preloader: open popup + init color pickers + media uploader (mirrors Scroll Top extension pattern)
1090 $(document).ready(function() {
1091 var preloaderColorInitialized = false;
1092
1093 // Force the popup hidden on initial load so it never flashes before a click.
1094 $('.easyel-preloader-popup').removeClass('active').hide();
1095
1096 function easyelPreloaderToggleFields() {
1097 var $popup = $('.easyel-preloader-popup');
1098 var style = $popup.find('select[name="preloader_style"]').val();
1099
1100 var hasSecondary = (style === 'circle' || style === 'custom_logo');
1101 var isCustomLogo = (style === 'custom_logo');
1102
1103 $popup.find('.easyel-preloader-field-logo-only').toggle(isCustomLogo);
1104 $popup.find('.easyel-preloader-field-secondary-only').toggle(hasSecondary);
1105 }
1106
1107 $(document).on('click', '.easyel-preloader-popup-setting', function(e) {
1108 e.preventDefault();
1109 e.stopPropagation();
1110 $('.easyel-preloader-popup').show().addClass('active');
1111 $('html').addClass('popup-opened');
1112
1113 easyelPreloaderToggleFields();
1114
1115 if (!preloaderColorInitialized && typeof $.fn.wpColorPicker === 'function') {
1116 preloaderColorInitialized = true;
1117 $('.easyel-preloader-popup .easyel-color-picker').each(function() {
1118 var $input = $(this);
1119 if ($input.closest('.wp-picker-container').length) {
1120 return;
1121 }
1122 $input.wpColorPicker({
1123 change: function(event, ui) {
1124 $(event.target).val(ui.color.toString());
1125 $('.easyel_preloader_popup_item_save').prop('disabled', false).val('Save Changes');
1126 },
1127 clear: function() {
1128 $('.easyel_preloader_popup_item_save').prop('disabled', false).val('Save Changes');
1129 }
1130 });
1131 });
1132 }
1133 });
1134
1135 $(document).on('click', '.easyel-preloader-popup-close-icon', function(e) {
1136 e.preventDefault();
1137 var $popup = $('.easyel-preloader-popup');
1138 $popup.removeClass('active');
1139 $('html').removeClass('popup-opened');
1140 setTimeout(function() {
1141 if ( ! $popup.hasClass('active') ) {
1142 $popup.hide();
1143 }
1144 }, 300);
1145 });
1146
1147 // Style change toggles fields
1148 $(document).on('change', '.easyel-preloader-popup select[name="preloader_style"]', function() {
1149 easyelPreloaderToggleFields();
1150 });
1151
1152 // Logo upload via WP media
1153 $(document).on('click', '.easyel-preloader-upload-btn', function(e) {
1154 e.preventDefault();
1155 var frame = wp.media({
1156 title: 'Select Preloader Logo',
1157 multiple: false,
1158 library: { type: 'image' }
1159 });
1160 frame.on('select', function() {
1161 var attachment = frame.state().get('selection').first().toJSON();
1162 $('.easyel-preloader-logo-input').val(attachment.url);
1163 $('.easyel-preloader-remove-btn').show();
1164 $('.easyel_preloader_popup_item_save').prop('disabled', false).val('Save Changes');
1165 });
1166 frame.open();
1167 });
1168
1169 // Remove logo
1170 $(document).on('click', '.easyel-preloader-remove-btn', function(e) {
1171 e.preventDefault();
1172 $('.easyel-preloader-logo-input').val('');
1173 $(this).hide();
1174 $('.easyel_preloader_popup_item_save').prop('disabled', false).val('Save Changes');
1175 });
1176 });
1177
1178 // Preloader: AJAX save
1179 $(document).ready(function($){
1180
1181 var $popup = $('.easyel-preloader-popup');
1182
1183 function easyelPreloaderEnableSaveBtn() {
1184 $('.easyel_preloader_popup_item_save')
1185 .prop('disabled', false)
1186 .removeAttr('disabled')
1187 .val('Save Changes');
1188 }
1189
1190 function easyelPreloaderDisableSaveBtn() {
1191 $('.easyel_preloader_popup_item_save')
1192 .prop('disabled', true);
1193 }
1194
1195 // Initial state — disabled
1196 easyelPreloaderDisableSaveBtn();
1197
1198 // Native delegate for text/number/select/checkbox
1199 $popup.on('input change', 'input, select', easyelPreloaderEnableSaveBtn);
1200
1201 // Snapshot baseline color values; poll for color changes (wpColorPicker doesn't fire native events reliably).
1202 var preloaderColorBaseline = {};
1203 function easyelPreloaderCaptureColors() {
1204 $popup.find('.easyel-color-picker').each(function() {
1205 var $i = $(this);
1206 preloaderColorBaseline[ $i.attr('name') ] = $i.val();
1207 });
1208 }
1209
1210 // Capture baseline once popup opens (after wpColorPicker init has set initial values)
1211 $(document).on('click', '.easyel-preloader-popup-setting', function() {
1212 setTimeout(easyelPreloaderCaptureColors, 200);
1213 });
1214
1215 // Poll every 250ms while popup is open
1216 setInterval(function() {
1217 if ( ! $popup.hasClass('active') ) {
1218 return;
1219 }
1220 $popup.find('.easyel-color-picker').each(function() {
1221 var $i = $(this);
1222 var name = $i.attr('name');
1223 var current = $i.val();
1224 if ( preloaderColorBaseline[ name ] !== undefined && preloaderColorBaseline[ name ] !== current ) {
1225 preloaderColorBaseline[ name ] = current;
1226 easyelPreloaderEnableSaveBtn();
1227 }
1228 });
1229 }, 250);
1230
1231 $(document).on('click', '.easyel_preloader_popup_item_save', function(event){
1232 event.preventDefault();
1233
1234 var saveButton = $(this);
1235 saveButton.prop('disabled', true).val('Saving...');
1236
1237 var settings = {
1238 preloader_style: $popup.find('select[name="preloader_style"]').val() || 'circle',
1239 preloader_bg_color: $popup.find('input[name="preloader_bg_color"]').val() || '#ffffff',
1240 preloader_color: $popup.find('input[name="preloader_color"]').val() || '#5933ff',
1241 preloader_secondary_color: $popup.find('input[name="preloader_secondary_color"]').val() || '#e0e0e0',
1242 preloader_size: $popup.find('input[name="preloader_size"]').val() || '60',
1243 preloader_speed: $popup.find('input[name="preloader_speed"]').val() || '1',
1244 preloader_min_time: $popup.find('input[name="preloader_min_time"]').val() || '500',
1245 preloader_fadeout_time: $popup.find('input[name="preloader_fadeout_time"]').val() || '600',
1246 preloader_logo: $popup.find('input[name="preloader_logo"]').val() || '',
1247 preloader_logo_width: $popup.find('input[name="preloader_logo_width"]').val() || '36',
1248 preloader_logo_height: $popup.find('input[name="preloader_logo_height"]').val() || '36',
1249 preloader_disable_mobile: $popup.find('input[name="preloader_disable_mobile"]').is(':checked') ? 1 : 0
1250 };
1251
1252 $.ajax({
1253 url: ajaxurl,
1254 type: 'POST',
1255 dataType: 'json',
1256 data: {
1257 action: 'easyel_save_preloader_settings',
1258 nonce: easyElementsData.nonce,
1259 settings: settings
1260 },
1261 success: function(response){
1262 if (response.success) {
1263 easyelDisplayMessage('Settings Saved', 'success');
1264 saveButton.val('Saved All Data').prop('disabled', true);
1265 } else {
1266 easyelDisplayMessage('Error saving settings', 'error');
1267 saveButton.val('Save Changes').prop('disabled', false);
1268 }
1269 },
1270 error: function(jqXHR, textStatus, errorThrown){
1271 console.log('AJAX error:', textStatus, errorThrown);
1272 easyelDisplayMessage('AJAX error: ' + textStatus, 'error');
1273 saveButton.val('Save Changes').prop('disabled', false);
1274 }
1275 });
1276 });
1277 });
1278
1279
1280 })(jQuery);
1281