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

1,267 lines 52.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 $('.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 e.preventDefault();
506 activateTab(tab);
507 history.replaceState(null, null, '#' + tab);
508 });
509
510 function activateTab(tab) {
511 $('.easyel-nav-tab').removeClass('easyel-nav-tab-active');
512 $('.easyel-nav-tab[data-tab="' + tab + '"]').addClass('easyel-nav-tab-active');
513 $('.easyel-tab-panel').hide();
514 $('#tab-' + tab).show();
515 $('#toplevel_page_easy-elements-dashboard ul.wp-submenu li').removeClass('current');
516 $('#toplevel_page_easy-elements-dashboard ul.wp-submenu a[href*="#' + tab + '"]').parent().addClass('current');
517 }
518 },
519
520 easyElFilter: function() {
521 $(".easyel-action-btn").on("click", function() {
522 var filter = $(this).data("filter");
523 $(".easyel-action-btn").removeClass("active");
524 $(this).addClass("active");
525
526 $(".easy-widget-item,.easyel-extension-item").each(function() {
527 var $widget = $(this);
528
529 if (filter === "easyel_all") $widget.show();
530 else if (filter === "easyel_free") {
531 if ($widget.hasClass("easyel-pro-widget")) $widget.hide();
532 else $widget.show();
533 } else if (filter === "easyel_pro") {
534 if ($widget.hasClass("easyel-pro-widget")) $widget.show();
535 else $widget.hide();
536 }
537 });
538 });
539 },
540
541 easyelVideoPopuo: function() {
542 if ($(".easyel-video-popup").length ) {
543 var $popup = $('#easyel-popup-video-area'),
544 $videoContainer = $popup.find('.easyel-popup-video');
545
546 $('.easyel-video-popup').on('click', function(e){
547 e.preventDefault();
548 var videoId = $(this).attr('href').split('v=')[1].split('&')[0];
549 $videoContainer.html('<iframe src="https://www.youtube.com/embed/' + videoId + '?autoplay=1" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>');
550 $popup.fadeIn();
551 });
552
553 $popup.on('click', '.easyel-popup-close, #easyel-popup-video-area', function(e){
554 if($(e.target).is('.easyel-popup-close') || $(e.target).is('#easyel-popup-video-area')){
555 $popup.fadeOut();
556 $videoContainer.html('');
557 }
558 });
559 };
560 },
561
562 easyelFaq: function() {
563 if ($(".easyel-faq-item").length ) {
564 $(".easyel-faq-item.active").find(".easyel-faq-item-content").show();
565 $(".easyel-faq-item-heading").click(function(){
566 var faqItem = $(this).closest(".easyel-faq-item");
567 var content = faqItem.children(".easyel-faq-item-content");
568
569 if(faqItem.hasClass("active")){
570 faqItem.removeClass("active");
571 content.slideUp(300);
572 } else {
573 $(".easyel-faq-item.active").removeClass("active").children(".easyel-faq-item-content").slideUp(300);
574 faqItem.addClass("active");
575 content.slideDown(300);
576 }
577 });
578 };
579 },
580
581 easyel_notify: function(message, type = 'success', duration = 3000) {
582 const toast = document.createElement('div');
583 toast.className = `easyel-toast ${type}`;
584 toast.innerText = message;
585
586 document.body.appendChild(toast);
587
588 // Show animation
589 setTimeout(() => toast.classList.add('show'), 50);
590
591 // Auto remove after duration
592 setTimeout(() => {
593 toast.classList.remove('show');
594 setTimeout(() => toast.remove(), 300);
595 }, duration);
596 },
597
598 initSettings: function() {
599 $('#easyel-settings-save').click(function (e) {
600 e.preventDefault();
601
602 let dataArr = $('#easyel-settings-form').serializeArray();
603 let settings = {};
604
605 dataArr.forEach(field => {
606 let name = field.name;
607 let value = field.value;
608
609 // Detect nested name e.g. fb_config[page_id]
610 if (name.includes('[')) {
611 let mainKey = name.split('[')[0]; // fb_config
612 let subKey = name.match(/\[(.*?)\]/)[1]; // page_id
613
614 if (!settings[mainKey]) settings[mainKey] = {}; // init object
615 settings[mainKey][subKey] = value; // assign value
616 } else {
617 // simple field (no nested)
618 settings[name] = value;
619 }
620 });
621
622 $.ajax({
623 url: ajaxurl,
624 type: "POST",
625 data: {
626 action: "easyel_save_user_data",
627 security: easyElementsData.nonce,
628 settings: settings
629 },
630 beforeSend: function () {
631 $('#easyel-settings-save')
632 .text("Saving...")
633 .prop("disabled", true);
634 },
635 success: function(res){
636 $('#easyel-settings-save')
637 .text('Save Settings')
638 .prop('disabled', false);
639
640 if(res.success){
641 EasyElementsAdmin.easyel_notify(res.data.message, 'success');
642 } else {
643 EasyElementsAdmin.easyel_notify('Error saving settings.', 'error');
644 }
645 },
646 error: function(){
647 EasyElementsAdmin.easyel_notify('AJAX error!', 'error');
648 $('#easyel-settings-save').text('Save Settings').prop('disabled', false);
649 }
650 });
651
652 });
653 },
654 };
655
656 $(document).ready(function() {
657 EasyElementsAdmin.init();
658 });
659
660 window.EasyElementsAdmin = EasyElementsAdmin;
661
662 $(document).ready(function ($) {
663
664 function hideEmptyGroups() {
665
666 $('.easyel-widgets-grid').each(function () {
667 var wrapper = $(this);
668
669 var items = wrapper.find('.easy-widget-item');
670
671 var visibleItems = items.filter(function () {
672 return $(this).css('display') !== 'none';
673 }).length;
674
675 var headingGroup = wrapper.prev('.easyel-widget-heading-group');
676
677 if (visibleItems === 0) {
678 headingGroup.hide();
679 } else {
680 headingGroup.show();
681 }
682 });
683 }
684
685 hideEmptyGroups();
686
687 $(document).on('click', '.easyel-action-btn', function () {
688 setTimeout(hideEmptyGroups, 50);
689 });
690
691 });
692
693
694 $(document).ready(function() {
695
696 $('.easyel-scroll-smoother-popup-setting').on('click', function(e) {
697 e.preventDefault();
698
699 $('.easyel-smooth-scroll-popup').addClass('active');
700 $('html').addClass('popup-opened');
701 });
702
703 $('.easyel-smooth-scroll-popup-close-icon').on('click', function(e) {
704 e.preventDefault();
705 $('.easyel-smooth-scroll-popup').removeClass('active');
706 $('html').removeClass('popup-opened');
707 });
708
709 if ( $('.easyel-smooth-scroll-color').length > 0 ) {
710 $('.easyel-smooth-scroll-color').wpColorPicker();
711 }
712
713 });
714
715 $(document).ready(function() {
716
717 $('.easyel-readingprogress-bar-popup-setting').on('click', function(e) {
718 e.preventDefault();
719
720 $('.easyel-reading-progressbar-popup').addClass('active');
721 $('html').addClass('popup-opened');
722 });
723
724 $('.easyel-reading-progressbar-popup-close-icon').on('click', function(e) {
725 e.preventDefault();
726 $('.easyel-reading-progressbar-popup').removeClass('active');
727 $('html').removeClass('popup-opened');
728 });
729 });
730
731 $(document).ready(function() {
732 var scrollTopColorInitialized = false;
733
734 $('.easyel-scroll-top-popup-setting').on('click', function(e) {
735 e.preventDefault();
736 $('.easyel-scroll-top-popup').addClass('active');
737 $('html').addClass('popup-opened');
738
739 // Init color pickers inside popup on first open
740 if (!scrollTopColorInitialized) {
741 scrollTopColorInitialized = true;
742 $('.easyel-scroll-top-popup .easyel-color-picker').each(function() {
743 var $input = $(this);
744 // Destroy existing wpColorPicker if any
745 if ($input.closest('.wp-picker-container').length) {
746 $input.closest('.wp-picker-container').replaceWith($input);
747 }
748 $input.wpColorPicker({
749 change: function(event, ui) {
750 $(event.target).val(ui.color.toString());
751 $('.scroll_top_popup_item_save').prop('disabled', false).val('Save Changes');
752 },
753 clear: function() {
754 $('.scroll_top_popup_item_save').prop('disabled', false).val('Save Changes');
755 }
756 });
757 });
758 }
759 });
760
761 $('.easyel-scroll-top-popup-close-icon').on('click', function(e) {
762 e.preventDefault();
763 $('.easyel-scroll-top-popup').removeClass('active');
764 $('html').removeClass('popup-opened');
765 });
766
767 // Icon type toggle — show/hide custom icon / image fields
768 $(document).on('change', '#scroll_top_icon_select', function() {
769 var val = $(this).val();
770 $('.easyel-scroll-top-custom-icon-row').toggle(val === 'custom_icon');
771 $('.easyel-scroll-top-custom-image-row').toggle(val === 'custom_image');
772 });
773
774 // Image upload via WP media
775 $(document).on('click', '.easyel-scroll-top-upload-btn', function(e) {
776 e.preventDefault();
777 var frame = wp.media({
778 title: 'Select Scroll Top Image',
779 multiple: false,
780 library: { type: 'image' }
781 });
782 frame.on('select', function() {
783 var attachment = frame.state().get('selection').first().toJSON();
784 $('#scroll_top_custom_image').val(attachment.url);
785 $('.easyel-scroll-top-image-preview').attr('src', attachment.url).show();
786 $('.easyel-scroll-top-remove-btn').show();
787 $('.scroll_top_popup_item_save').prop('disabled', false).val('Save Changes');
788 });
789 frame.open();
790 });
791
792 // Remove image
793 $(document).on('click', '.easyel-scroll-top-remove-btn', function(e) {
794 e.preventDefault();
795 $('#scroll_top_custom_image').val('');
796 $('.easyel-scroll-top-image-preview').attr('src', '').hide();
797 $(this).hide();
798 $('.scroll_top_popup_item_save').prop('disabled', false).val('Save Changes');
799 });
800 });
801
802 function easyelDisplayMessage(message, type = 'success') {
803 let messageBox = $('#easyel-message-box');
804
805 if (type === 'success') {
806 messageBox.html('<p class="easyel-saved-success-message">' + message + '</p>').fadeIn().delay(1500).fadeOut();
807 }
808 }
809
810 $(document).ready(function($){
811
812 var $form = $('.easyel-smooth-scroll-settings-main-wrapper');
813 var $saveButton = $('.smooth_scroll_popup_item_save');
814
815 $saveButton.prop('disabled', true);
816
817 $form.on('input change', 'input, select', function() {
818 $saveButton.prop('disabled', false).val('Save Changes');
819 });
820
821 if ( $('.easyel-smooth-scroll-color').length > 0 ) {
822
823 $('.easyel-smooth-scroll-color').wpColorPicker({
824 change: function(event, ui) {
825 $saveButton.prop('disabled', false).val('Save Changes');
826 },
827 clear: function() {
828 $saveButton.prop('disabled', false).val('Save Changes');
829 }
830 });
831 }
832
833 $(document).on('click', '.smooth_scroll_popup_item_save', function(event){
834 event.preventDefault();
835
836 var saveButton = $(this);
837
838 saveButton.prop('disabled', true).val('Saving...');
839
840 var settings = {
841 smooth_scroll_speed: $('input[name="smooth_scroll_speed"]').val(),
842 smooth_scroll_normalize: $('input[name="smooth_scroll_normalize"]').is(':checked') ? 1 : 0,
843 smooth_scroll_enable_mobile: $('input[name="smooth_scroll_enable_mobile"]').is(':checked') ? 1 : 0,
844 smooth_scroll_disable_editor_mode: $('input[name="smooth_scroll_disable_editor_mode"]').is(':checked') ? 1 : 0,
845 enable_smooth_scroller: $('input[data-key="enable_smooth_scroller"]').is(':checked') ? 1 : 0,
846 smooth_scroll_width: $('input[name="smooth_scroll_width"]').val(),
847 smooth_scroll_normal_color: $('input[name="smooth_scroll_normal_color"]').val(),
848 smooth_scroll_highlight_color: $('input[name="smooth_scroll_highlight_color"]').val(),
849 };
850
851 // AJAX call
852 $.ajax({
853 url: ajaxurl,
854 type: 'POST',
855 dataType: 'json',
856 data: {
857 action: 'save_smooth_scroll_settings',
858 nonce: easyElementsData.nonce,
859 settings: settings
860 },
861 success: function(response){
862 if(response.success){
863 easyelDisplayMessage('All settings saved', 'success');
864 saveButton.val('Saved All Data').prop('disabled', true);
865 } else {
866 easyelDisplayMessage('Error saving settings', 'error');
867 saveButton.val('Save Changes').prop('disabled', false);
868 }
869 },
870 error: function(jqXHR, textStatus, errorThrown){
871 console.log('AJAX error:', textStatus, errorThrown);
872 easyelDisplayMessage('AJAX error: ' + textStatus, 'error');
873 saveButton.val('Save Changes').prop('disabled', false);
874 }
875 });
876 });
877 });
878
879 $(document).ready(function($){
880
881 var $form = $('.easyel-reading-progressbar-settings-main-wrapper');
882 var $saveButton = $('.reading_progressbar_popup_item_save');
883
884 $saveButton.prop('disabled', true);
885
886 // Enable save button on input/change
887 $form.on('input change', 'input, select', function() {
888 $saveButton.prop('disabled', false).val('Save Changes');
889 });
890
891 // Initialize color picker safely
892 if ( typeof wp !== 'undefined' && wp.colorPicker ) {
893 if ( $('.easyel-color-picker').length ) {
894 $('.easyel-color-picker').wpColorPicker();
895 }
896 }
897
898 // Save via AJAX
899 $(document).on('click', '.reading_progressbar_popup_item_save', function(event){
900 event.preventDefault();
901
902 var saveButton = $(this);
903 saveButton.prop('disabled', true).val('Saving...');
904
905 var settings = {
906 reading_progressbar_position: $('select[name="reading_progressbar_position"]').val(),
907 reading_progressbar_display: $('input[name="reading_progressbar_display[]"]:checked').map(function(){ return this.value; }).get(),
908 reading_progressbar_color: $('input[name="reading_progressbar_color"]').val(),
909 reading_progressbar_height: $('input[name="reading_progressbar_height"]').val(),
910 reading_progressbar_specific_page: $('select[name="reading_progressbar_specific_page[]"]').map(function(){ return $(this).val(); }).get(),
911 };
912
913 $.ajax({
914 url: ajaxurl,
915 type: 'POST',
916 dataType: 'json',
917 data: {
918 action: 'save_reading_progressbar_settings',
919 nonce: easyElementsData.nonce,
920 settings: settings
921 },
922 success: function(response){
923 if(response.success){
924 easyelDisplayMessage('Settings Saved', 'success');
925 saveButton.val('Saved All Data').prop('disabled', true);
926 } else {
927 easyelDisplayMessage('Error saving settings', 'error');
928 saveButton.val('Save Changes').prop('disabled', false);
929 }
930 },
931 error: function(jqXHR, textStatus, errorThrown){
932 console.log('AJAX error:', textStatus, errorThrown);
933 easyelDisplayMessage('AJAX error: ' + textStatus, 'error');
934 saveButton.val('Save Changes').prop('disabled', false);
935 }
936 });
937 });
938 });
939
940 // open close popup modal
941
942 function easyelAdminToggleOpenProModal() {
943 $('#easyel-admin-toggle-pro-upgrade-modal').addClass('active');
944 $('body').addClass('easyel-admin-toggle-modal-open');
945 }
946
947 function easyelAdminToggleCloseProModal() {
948 $('#easyel-admin-toggle-pro-upgrade-modal').removeClass('active');
949 $('body').removeClass('easyel-admin-toggle-modal-open');
950 }
951
952 /**
953 * PRO widget click → show modal
954 */
955 $(document).on(
956 'click',
957 '.easy-widget-item.easyel-pro-enable .easyel-widget-card-switcher',
958 function (e) {
959 e.preventDefault();
960 e.stopPropagation();
961
962 easyelAdminToggleOpenProModal();
963 }
964 );
965
966 // Close modal
967 $(document).on(
968 'click',
969 '.easyel-admin-toggle-pro-modal-close, \
970 .easyel-admin-toggle-pro-modal-cancel, \
971 .easyel-admin-toggle-pro-modal-overlay',
972 function () {
973 easyelAdminToggleCloseProModal();
974 }
975 );
976
977 // reading progressbar popup color js (exclude scroll-top + preloader popups — initialized separately)
978 if ( $('.easyel-color-picker').not('.easyel-scroll-top-popup .easyel-color-picker').not('.easyel-preloader-popup .easyel-color-picker').length ) {
979 $('.easyel-color-picker').not('.easyel-scroll-top-popup .easyel-color-picker').not('.easyel-preloader-popup .easyel-color-picker').wpColorPicker();
980 }
981
982 if( $('.easyel-readingprogress-barselect2').length ) {
983 $('.easyel-readingprogress-barselect2').select2({
984 width: '100%',
985 placeholder: 'Select a page',
986 multiple: true,
987 });
988 }
989
990 if ( $('.easyel-color-picker').not('.easyel-scroll-top-popup .easyel-color-picker').not('.easyel-preloader-popup .easyel-color-picker').length ) {
991 $('.easyel-color-picker').not('.easyel-scroll-top-popup .easyel-color-picker').not('.easyel-preloader-popup .easyel-color-picker').wpColorPicker({
992 change: function (event, ui) {
993 var color = ui.color.toString();
994
995 $(event.target).val(color);
996
997 $('.reading_progressbar_popup_item_save')
998 .prop('disabled', false)
999 .val('Save Changes');
1000 },
1001 clear: function () {
1002 $('.reading_progressbar_popup_item_save')
1003 .prop('disabled', false)
1004 .val('Save Changes');
1005 }
1006 });
1007 }
1008
1009 // Scroll Top settings save
1010 $(document).ready(function($){
1011
1012 var $popup = $('.easyel-scroll-top-popup');
1013 var $scrollTopSave = $('.scroll_top_popup_item_save');
1014
1015 $scrollTopSave.prop('disabled', true);
1016
1017 $popup.on('input change', 'input, select', function() {
1018 $scrollTopSave.prop('disabled', false).val('Save Changes');
1019 });
1020
1021 $(document).on('click', '.scroll_top_popup_item_save', function(event){
1022 event.preventDefault();
1023
1024 var saveButton = $(this);
1025 saveButton.prop('disabled', true).val('Saving...');
1026
1027 // Get color values from wpColorPicker hidden inputs
1028 var bgColor = $popup.find('input[name="scroll_top_bg_color"]').val();
1029 var iconColor = $popup.find('input[name="scroll_top_icon_color"]').val();
1030
1031 var settings = {
1032 scroll_top_icon: $popup.find('select[name="scroll_top_icon"]').val(),
1033 scroll_top_position: $popup.find('select[name="scroll_top_position"]').val(),
1034 scroll_top_bg_color: bgColor || '#333333',
1035 scroll_top_icon_color: iconColor || '#ffffff',
1036 scroll_top_size: $popup.find('input[name="scroll_top_size"]').val() || '45',
1037 scroll_top_radius: $popup.find('input[name="scroll_top_radius"]').val() || '50',
1038 scroll_top_offset: $popup.find('input[name="scroll_top_offset"]').val() || '300',
1039 scroll_top_border_width: $popup.find('input[name="scroll_top_border_width"]').val() || '0',
1040 scroll_top_border_color: $popup.find('input[name="scroll_top_border_color"]').val() || '#cccccc',
1041 scroll_top_hover_bg_color: $popup.find('input[name="scroll_top_hover_bg_color"]').val() || '#000000',
1042 scroll_top_hover_icon_color: $popup.find('input[name="scroll_top_hover_icon_color"]').val() || '#ffffff',
1043 scroll_top_hover_border_color: $popup.find('input[name="scroll_top_hover_border_color"]').val() || '#cccccc',
1044 scroll_top_custom_icon: $popup.find('input[name="scroll_top_custom_icon"]').val() || '',
1045 scroll_top_custom_image: $popup.find('input[name="scroll_top_custom_image"]').val() || '',
1046 };
1047
1048 $.ajax({
1049 url: ajaxurl,
1050 type: 'POST',
1051 dataType: 'json',
1052 data: {
1053 action: 'save_scroll_top_settings',
1054 nonce: easyElementsData.nonce,
1055 settings: settings
1056 },
1057 success: function(response){
1058 if(response.success){
1059 easyelDisplayMessage('Settings Saved', 'success');
1060 saveButton.val('Saved All Data').prop('disabled', true);
1061 } else {
1062 easyelDisplayMessage('Error saving settings', 'error');
1063 saveButton.val('Save Changes').prop('disabled', false);
1064 }
1065 },
1066 error: function(jqXHR, textStatus, errorThrown){
1067 console.log('AJAX error:', textStatus, errorThrown);
1068 easyelDisplayMessage('AJAX error: ' + textStatus, 'error');
1069 saveButton.val('Save Changes').prop('disabled', false);
1070 }
1071 });
1072 });
1073 });
1074
1075 // Preloader: open popup + init color pickers + media uploader (mirrors Scroll Top extension pattern)
1076 $(document).ready(function() {
1077 var preloaderColorInitialized = false;
1078
1079 // Force the popup hidden on initial load so it never flashes before a click.
1080 $('.easyel-preloader-popup').removeClass('active').hide();
1081
1082 function easyelPreloaderToggleFields() {
1083 var $popup = $('.easyel-preloader-popup');
1084 var style = $popup.find('select[name="preloader_style"]').val();
1085
1086 var hasSecondary = (style === 'circle' || style === 'custom_logo');
1087 var isCustomLogo = (style === 'custom_logo');
1088
1089 $popup.find('.easyel-preloader-field-logo-only').toggle(isCustomLogo);
1090 $popup.find('.easyel-preloader-field-secondary-only').toggle(hasSecondary);
1091 }
1092
1093 $(document).on('click', '.easyel-preloader-popup-setting', function(e) {
1094 e.preventDefault();
1095 e.stopPropagation();
1096 $('.easyel-preloader-popup').show().addClass('active');
1097 $('html').addClass('popup-opened');
1098
1099 easyelPreloaderToggleFields();
1100
1101 if (!preloaderColorInitialized && typeof $.fn.wpColorPicker === 'function') {
1102 preloaderColorInitialized = true;
1103 $('.easyel-preloader-popup .easyel-color-picker').each(function() {
1104 var $input = $(this);
1105 if ($input.closest('.wp-picker-container').length) {
1106 return;
1107 }
1108 $input.wpColorPicker({
1109 change: function(event, ui) {
1110 $(event.target).val(ui.color.toString());
1111 $('.easyel_preloader_popup_item_save').prop('disabled', false).val('Save Changes');
1112 },
1113 clear: function() {
1114 $('.easyel_preloader_popup_item_save').prop('disabled', false).val('Save Changes');
1115 }
1116 });
1117 });
1118 }
1119 });
1120
1121 $(document).on('click', '.easyel-preloader-popup-close-icon', function(e) {
1122 e.preventDefault();
1123 var $popup = $('.easyel-preloader-popup');
1124 $popup.removeClass('active');
1125 $('html').removeClass('popup-opened');
1126 setTimeout(function() {
1127 if ( ! $popup.hasClass('active') ) {
1128 $popup.hide();
1129 }
1130 }, 300);
1131 });
1132
1133 // Style change toggles fields
1134 $(document).on('change', '.easyel-preloader-popup select[name="preloader_style"]', function() {
1135 easyelPreloaderToggleFields();
1136 });
1137
1138 // Logo upload via WP media
1139 $(document).on('click', '.easyel-preloader-upload-btn', function(e) {
1140 e.preventDefault();
1141 var frame = wp.media({
1142 title: 'Select Preloader Logo',
1143 multiple: false,
1144 library: { type: 'image' }
1145 });
1146 frame.on('select', function() {
1147 var attachment = frame.state().get('selection').first().toJSON();
1148 $('.easyel-preloader-logo-input').val(attachment.url);
1149 $('.easyel-preloader-remove-btn').show();
1150 $('.easyel_preloader_popup_item_save').prop('disabled', false).val('Save Changes');
1151 });
1152 frame.open();
1153 });
1154
1155 // Remove logo
1156 $(document).on('click', '.easyel-preloader-remove-btn', function(e) {
1157 e.preventDefault();
1158 $('.easyel-preloader-logo-input').val('');
1159 $(this).hide();
1160 $('.easyel_preloader_popup_item_save').prop('disabled', false).val('Save Changes');
1161 });
1162 });
1163
1164 // Preloader: AJAX save
1165 $(document).ready(function($){
1166
1167 var $popup = $('.easyel-preloader-popup');
1168
1169 function easyelPreloaderEnableSaveBtn() {
1170 $('.easyel_preloader_popup_item_save')
1171 .prop('disabled', false)
1172 .removeAttr('disabled')
1173 .val('Save Changes');
1174 }
1175
1176 function easyelPreloaderDisableSaveBtn() {
1177 $('.easyel_preloader_popup_item_save')
1178 .prop('disabled', true);
1179 }
1180
1181 // Initial state — disabled
1182 easyelPreloaderDisableSaveBtn();
1183
1184 // Native delegate for text/number/select/checkbox
1185 $popup.on('input change', 'input, select', easyelPreloaderEnableSaveBtn);
1186
1187 // Snapshot baseline color values; poll for color changes (wpColorPicker doesn't fire native events reliably).
1188 var preloaderColorBaseline = {};
1189 function easyelPreloaderCaptureColors() {
1190 $popup.find('.easyel-color-picker').each(function() {
1191 var $i = $(this);
1192 preloaderColorBaseline[ $i.attr('name') ] = $i.val();
1193 });
1194 }
1195
1196 // Capture baseline once popup opens (after wpColorPicker init has set initial values)
1197 $(document).on('click', '.easyel-preloader-popup-setting', function() {
1198 setTimeout(easyelPreloaderCaptureColors, 200);
1199 });
1200
1201 // Poll every 250ms while popup is open
1202 setInterval(function() {
1203 if ( ! $popup.hasClass('active') ) {
1204 return;
1205 }
1206 $popup.find('.easyel-color-picker').each(function() {
1207 var $i = $(this);
1208 var name = $i.attr('name');
1209 var current = $i.val();
1210 if ( preloaderColorBaseline[ name ] !== undefined && preloaderColorBaseline[ name ] !== current ) {
1211 preloaderColorBaseline[ name ] = current;
1212 easyelPreloaderEnableSaveBtn();
1213 }
1214 });
1215 }, 250);
1216
1217 $(document).on('click', '.easyel_preloader_popup_item_save', function(event){
1218 event.preventDefault();
1219
1220 var saveButton = $(this);
1221 saveButton.prop('disabled', true).val('Saving...');
1222
1223 var settings = {
1224 preloader_style: $popup.find('select[name="preloader_style"]').val() || 'circle',
1225 preloader_bg_color: $popup.find('input[name="preloader_bg_color"]').val() || '#ffffff',
1226 preloader_color: $popup.find('input[name="preloader_color"]').val() || '#5933ff',
1227 preloader_secondary_color: $popup.find('input[name="preloader_secondary_color"]').val() || '#e0e0e0',
1228 preloader_size: $popup.find('input[name="preloader_size"]').val() || '60',
1229 preloader_speed: $popup.find('input[name="preloader_speed"]').val() || '1',
1230 preloader_min_time: $popup.find('input[name="preloader_min_time"]').val() || '500',
1231 preloader_fadeout_time: $popup.find('input[name="preloader_fadeout_time"]').val() || '600',
1232 preloader_logo: $popup.find('input[name="preloader_logo"]').val() || '',
1233 preloader_logo_width: $popup.find('input[name="preloader_logo_width"]').val() || '36',
1234 preloader_logo_height: $popup.find('input[name="preloader_logo_height"]').val() || '36',
1235 preloader_disable_mobile: $popup.find('input[name="preloader_disable_mobile"]').is(':checked') ? 1 : 0
1236 };
1237
1238 $.ajax({
1239 url: ajaxurl,
1240 type: 'POST',
1241 dataType: 'json',
1242 data: {
1243 action: 'easyel_save_preloader_settings',
1244 nonce: easyElementsData.nonce,
1245 settings: settings
1246 },
1247 success: function(response){
1248 if (response.success) {
1249 easyelDisplayMessage('Settings Saved', 'success');
1250 saveButton.val('Saved All Data').prop('disabled', true);
1251 } else {
1252 easyelDisplayMessage('Error saving settings', 'error');
1253 saveButton.val('Save Changes').prop('disabled', false);
1254 }
1255 },
1256 error: function(jqXHR, textStatus, errorThrown){
1257 console.log('AJAX error:', textStatus, errorThrown);
1258 easyelDisplayMessage('AJAX error: ' + textStatus, 'error');
1259 saveButton.val('Save Changes').prop('disabled', false);
1260 }
1261 });
1262 });
1263 });
1264
1265
1266 })(jQuery);
1267