PluginProbe
Easy Elements for Elementor – Addons & Website Templates / 1.4.5
Easy Elements for Elementor – Addons & Website Templates v1.4.5
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.4.5, at assets/js/admin.js

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