Files
wp-plugin-starter-template-…/admin/js/update-source-selector.js
marcusquinn c7b590870c
Some checks failed
Tests / PHP 7.0 (push) Has been cancelled
Tests / PHP 7.4 (push) Has been cancelled
Tests / PHP 8.0 (push) Has been cancelled
Tests / Code Style (push) Has been cancelled
Sync Wiki / Sync Wiki to GitHub (push) Has been cancelled
Release / Build and Release (push) Has been cancelled
Initial commit of WordPress Plugin Starter Template for AI Coding
2025-04-18 03:09:39 +01:00

165 lines
5.0 KiB
JavaScript

/**
* 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('<span class="wpst-loading"></span> 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);