Files
wpa-superstar-plugin/admin/js/wpallstars-admin.js
T
marcus f65d648a82 Refactor(Admin): Implement Settings API & AJAX save for Settings Manager
- Refactored WPALLSTARS_Settings_Manager to use WordPress Settings API.
- Stores settings in single 'wpallstars_options' array.
- Implemented robust AJAX saving for specific settings (e.g., color scheme, auto-upload) via WPALLSTARS_Admin_Manager::update_option.
- Updated JS and setting render functions for AJAX.
- Corrected admin menu registration and script enqueue hooks.
- Includes file renames from wp-allstars to wpallstars.
2025-04-19 13:12:37 +01:00

139 lines
6.6 KiB
JavaScript

/**
* WP Allstars Admin Script
*
* Handles generic UI interactions in the admin settings page.
* Specific AJAX handlers for themes/plugins are handled in inline scripts
* loaded by their respective managers.
*/
(function($) {
'use strict';
$(document).ready(function() {
// --- General UI Enhancements ---
// Toggle expandable sections/panels (using consistent class names)
$('.wpallstars-toggle-header').on('click', function() {
var $this = $(this);
var $content = $this.next('.wpallstars-toggle-content'); // Use a consistent content class
var isExpanded = $this.attr('aria-expanded') === 'true';
// Toggle ARIA attribute for accessibility
$this.attr('aria-expanded', !isExpanded);
// Toggle content visibility with animation
$content.slideToggle(200);
// Optional: Toggle an icon class on the header (e.g., dashicons-arrow-down / dashicons-arrow-up)
$this.find('.dashicons').toggleClass('dashicons-arrow-down dashicons-arrow-up');
});
// Initialize state for expandable sections (ensure icons are correct on load)
$('.wpallstars-toggle-header').each(function() {
var $this = $(this);
var isExpanded = $this.attr('aria-expanded') === 'true';
if (isExpanded) {
$this.find('.dashicons').removeClass('dashicons-arrow-down').addClass('dashicons-arrow-up');
$this.next('.wpallstars-toggle-content').show();
} else {
$this.find('.dashicons').removeClass('dashicons-arrow-up').addClass('dashicons-arrow-down');
$this.next('.wpallstars-toggle-content').hide();
}
});
// --- Settings Save Logic (Example for simple toggles/inputs via AJAX) ---
// AJAX saving for specific settings (e.g., checkboxes, selects)
// Add the class 'wpallstars-ajax-save' and 'data-setting-key="your_key"' to the input elements
$('.wpallstars-settings-wrap').on('change', 'input.wpallstars-ajax-save, select.wpallstars-ajax-save', function(e) {
e.preventDefault();
const $input = $(this);
const settingKey = $input.data('setting-key'); // Get key from data attribute
let settingValue;
// Determine the value based on input type
if ($input.is(':checkbox')) {
settingValue = $input.is(':checked'); // Send true/false
} else {
settingValue = $input.val(); // Get value from select or other inputs
}
// Find the feedback element (could be next to the input, or a general area)
let $feedback = $input.siblings('.wpallstars-ajax-feedback');
if (!$feedback.length) {
// Fallback to a general feedback area if specific one not found
$feedback = $input.closest('td, p, div').find('.wpallstars-ajax-feedback');
if (!$feedback.length) {
// If still no feedback area, maybe create one dynamically or log error
console.error('WPAllstars: Feedback element not found for AJAX save.', $input);
return; // Stop if no feedback area
}
}
// Check if settingKey is valid
if (!settingKey) {
console.error('WPAllstars: Missing data-setting-key attribute for AJAX save.', $input);
$feedback.removeClass('spinner success is-active').addClass('error').text('Error: Missing setting key.').show();
return;
}
// Show spinner/updating message
if ($feedback.hasClass('spinner')) {
// If it's already designed as a spinner container
$feedback.removeClass('success error').addClass('is-active').show();
// Optionally add text: $feedback.text(wpallstars.l10n.updating || 'Updating...');
} else {
$feedback.removeClass('success error').addClass('spinner is-active').text(wpallstars.l10n.updating || 'Updating...').show();
}
// Use localized strings and the specific nonce
// $feedback.text(wpallstars.l10n.updating || 'Updating...'); // Moved spinner text above
// Perform AJAX request
$.ajax({
url: wpallstars.ajaxurl,
type: 'POST',
data: {
action: 'wpallstars_update_option', // The action hook in WPALLSTARS_Admin_Manager
nonce: wpallstars.update_option_nonce, // Use the specific nonce
setting_key: settingKey, // Send the setting key
setting_value: settingValue // Send the setting value
},
success: function(response) {
if (response.success) {
$feedback.removeClass('spinner is-active error').addClass('success').text(response.data || wpallstars.l10n.success || 'Saved!');
// Optionally fade out the success message after a delay
setTimeout(function() {
// $feedback.fadeOut();
// Or just remove the text/class if element should stay
$feedback.removeClass('success').text('');
}, 3000);
} else {
const errorMessage = response.data || wpallstars.l10n.error || 'Error';
$feedback.removeClass('spinner is-active success').addClass('error').text(errorMessage);
console.error('WPAllstars AJAX Error:', response.data);
}
},
error: function(jqXHR, textStatus, errorThrown) {
$feedback.removeClass('spinner is-active success').addClass('error').text(wpallstars.l10n.error || 'Error');
console.error('WPAllstars AJAX Request Failed:', textStatus, errorThrown);
},
// Removed complete: function() { ... } as feedback is handled in success/error
});
});
// --- Tab Handling ---
// Basic tab switching is handled by WordPress core CSS (.nav-tab-active) and page reloads.
// If you need AJAX tab loading in the future, implement it here.
// --- Initialization ---
// Add any code that needs to run on page load after elements are ready.
// Example: Initialize color pickers if added via WPALLSTARS_Settings_Manager
}); // End document ready
})(jQuery);