/** * Update Source Selector Scripts * * @package WPALLSTARS\PluginStarterTemplate */ (function($) { 'use strict'; /** * Update Source Selector functionality */ const WPSTUpdateSourceSelector = { /** * Modal element */ $modal: null, /** * Selected source */ selectedSource: '', /** * Initialize */ init: function() { // Cache DOM elements this.$modal = $('#wpst-update-source-modal'); // Bind events this.bindEvents(); }, /** * Bind events */ bindEvents: function() { // Open modal when clicking on the update source link $(document).on('click', '.wpst-update-source-selector', this.openModal.bind(this)); // Close modal when clicking on the close button or outside the modal this.$modal.on('click', '.wpst-modal-close', this.closeModal.bind(this)); $(document).on('click', '.wpst-modal', function(e) { if ($(e.target).hasClass('wpst-modal')) { WPSTUpdateSourceSelector.closeModal(); } }); // Select source option this.$modal.on('click', '.wpst-source-option', this.selectSource.bind(this)); // Save source selection this.$modal.on('click', '#wpst-save-source', this.saveSource.bind(this)); }, /** * Open the modal * * @param {Event} e Click event */ openModal: function(e) { e.preventDefault(); this.$modal.show(); }, /** * Close the modal */ closeModal: function() { this.$modal.hide(); }, /** * Select a source option * * @param {Event} e Click event */ selectSource: function(e) { const $option = $(e.currentTarget); // Update selected state this.$modal.find('.wpst-source-option').removeClass('selected'); $option.addClass('selected'); // Update radio button $option.find('input[type="radio"]').prop('checked', true); // Store selected source this.selectedSource = $option.find('input[type="radio"]').val(); }, /** * Save the selected source */ saveSource: function() { // Validate selection if (!this.selectedSource) { this.showMessage('error', 'Please select an update source.'); return; } // Show loading state const $saveButton = $('#wpst-save-source'); $saveButton.prop('disabled', true).html(' Saving...'); // Send AJAX request $.ajax({ url: wpstModalData.ajaxUrl, type: 'POST', data: { action: 'wpst_set_update_source', nonce: wpstModalData.nonce, source: this.selectedSource }, success: function(response) { if (response.success) { WPSTUpdateSourceSelector.showMessage('success', response.data.message); // Close modal after a short delay setTimeout(function() { WPSTUpdateSourceSelector.closeModal(); }, 1500); } else { WPSTUpdateSourceSelector.showMessage('error', response.data.message); } }, error: function() { WPSTUpdateSourceSelector.showMessage('error', 'An error occurred. Please try again.'); }, complete: function() { // Reset button state $saveButton.prop('disabled', false).text(wpstModalData.i18n.confirm); } }); }, /** * Show a message in the modal * * @param {string} type Message type (success, error) * @param {string} message Message text */ showMessage: function(type, message) { const $message = this.$modal.find('.wpst-modal-message'); // Set message content and type $message.html(message).removeClass('success error').addClass(type).show(); // Hide message after a delay for success messages if (type === 'success') { setTimeout(function() { $message.fadeOut(300); }, 3000); } } }; // Initialize when document is ready $(document).ready(function() { WPSTUpdateSourceSelector.init(); }); })(jQuery);