From 39c8560f1ec6cca03192df6769c029f5d3980c80 Mon Sep 17 00:00:00 2001 From: Marcus Quinn Date: Tue, 25 Mar 2025 03:18:53 +0000 Subject: [PATCH] Fix admin color scheme toggle to refresh page and show success notification --- includes/class-wp-allstars-admin-colors.php | 237 +++++--------------- 1 file changed, 50 insertions(+), 187 deletions(-) diff --git a/includes/class-wp-allstars-admin-colors.php b/includes/class-wp-allstars-admin-colors.php index 0d9b742..a58e11e 100644 --- a/includes/class-wp-allstars-admin-colors.php +++ b/includes/class-wp-allstars-admin-colors.php @@ -45,14 +45,41 @@ class WP_Allstars_Admin_Colors { // Set up hooks add_action('admin_init', array($this, 'set_admin_color_scheme')); add_action('wp_ajax_wp_allstars_update_option', array($this, 'handle_color_scheme_update'), 5); - add_action('wp_ajax_wp_allstars_get_admin_colors', array($this, 'get_admin_colors_ajax')); - // Add script to handle dynamic color changes + // Add script to handle the toggle add_action('admin_enqueue_scripts', array($this, 'enqueue_color_scripts')); + + // Add admin notice for setting saved feedback + add_action('admin_notices', array($this, 'show_saved_notice')); } /** - * Enqueue JavaScript to handle dynamic color scheme changes + * Show saved notice when color scheme has been updated + */ + public function show_saved_notice() { + // Only show on our settings page + $screen = get_current_screen(); + if (!$screen || strpos($screen->id, 'wp-allstars') === false) { + return; + } + + // Check if we have a transient indicating a recent save + $user_id = get_current_user_id(); + $transient_name = 'wp_allstars_colors_updated_' . $user_id; + + if (get_transient($transient_name)) { + // Show the notice + echo '

' . + esc_html__('Color scheme setting saved successfully.', 'wp-allstars') . + '

'; + + // Delete the transient so it only shows once + delete_transient($transient_name); + } + } + + /** + * Enqueue JavaScript to handle toggle and page refresh */ public function enqueue_color_scripts($hook) { // Only load on the plugin settings page @@ -60,157 +87,29 @@ class WP_Allstars_Admin_Colors { return; } - // Get the available color schemes - global $_wp_admin_css_colors; - - // Get URLs for the fresh and modern schemes - $fresh_url = ''; - $modern_url = ''; - - if (isset($_wp_admin_css_colors['fresh'])) { - $fresh_url = $_wp_admin_css_colors['fresh']->url; - } - - if (isset($_wp_admin_css_colors['modern'])) { - $modern_url = $_wp_admin_css_colors['modern']->url; - } - - // Add inline JS for handling dynamic color scheme changes + // Add inline JS for handling toggle and refresh $color_js = ' jQuery(document).ready(function($) { - // Store color scheme URLs for direct access - var colorSchemes = { - "fresh": "' . esc_js($fresh_url) . '", - "modern": "' . esc_js($modern_url) . '" - }; - // Special handler for admin color scheme toggle $("#wp_allstars_simple_setting").on("change", function() { var isEnabled = $(this).is(":checked"); - // Apply the color scheme dynamically - if (isEnabled) { - switchColorScheme("modern"); - } else { - switchColorScheme("fresh"); - } - }); - - // Function to switch admin color scheme without page reload - function switchColorScheme(newScheme) { - console.log("Switching to color scheme:", newScheme); - - // Exit if we dont have URL for this scheme - if (!colorSchemes[newScheme]) { - console.error("No URL found for color scheme:", newScheme); - return; - } - - try { - // 1. Update the body class first - var $body = $("body"); - $body.removeClass(function(index, className) { - return (className.match(/(^|\s)admin-color-\S+/g) || []).join(" "); - }); - $body.addClass("admin-color-" + newScheme); - - // 2. Directly replace color stylesheet URLs - var baseUrl = colorSchemes[newScheme]; - if (!baseUrl) return; - - // Force cache-busting - var cacheBuster = "?_=" + new Date().getTime(); - - // Replace all stylesheets with colors in their URL - var $adminColorLinks = $("link[href*=\'colors-\'], link[href*=\'/colors.\'], link#colors, link#colors-css, link#admin-colors-css"); - - // Log what we found - console.log("Found admin color links:", $adminColorLinks.length); - $adminColorLinks.each(function() { - console.log(" - Link:", $(this).attr("href")); - }); - - // For each stylesheet, create and inject a new one with the correct scheme - $adminColorLinks.each(function() { - var $oldLink = $(this); - var oldHref = $oldLink.attr("href"); - var id = $oldLink.attr("id") || ""; - - // Skip if not a stylesheet - if (!oldHref || $oldLink.attr("rel") !== "stylesheet") return; - - // Determine what file is being loaded - var fileType = ""; - if (oldHref.indexOf("colors-rtl") !== -1) { - fileType = "colors-rtl.min.css"; - } else if (oldHref.indexOf("colors.min") !== -1) { - fileType = "colors.min.css"; - } else { - fileType = "colors.css"; - } - - // Create the new URL - var newUrl = baseUrl + fileType + cacheBuster; - console.log("Replacing", oldHref, "with", newUrl); - - // Create a new stylesheet element - var $newLink = $("", { - rel: "stylesheet", - type: "text/css", - id: id, - href: newUrl - }); - - // Insert new stylesheet and remove old one - $oldLink.after($newLink); - setTimeout(function() { - $oldLink.remove(); - }, 100); - }); - - // If we found no stylesheets, inject the main one - if ($adminColorLinks.length === 0) { - console.log("No admin color stylesheets found, injecting new one"); - $("head").append( - $("", { - rel: "stylesheet", - type: "text/css", - id: "colors-css", - href: baseUrl + "colors.min.css" + cacheBuster - }) - ); - } - - // 3. Save the setting via AJAX - saveColorScheme(newScheme); - - } catch (e) { - console.error("Error switching color scheme:", e); - } - } - - function saveColorScheme(scheme) { - // AJAX request to save the color scheme setting + // Save setting via AJAX and refresh page $.ajax({ url: ajaxurl, type: "POST", data: { - action: "wp_allstars_update_admin_colors", - scheme: scheme, - _wpnonce: wpAllstars.nonce + action: "wp_allstars_update_option", + option: "wp_allstars_simple_setting", + value: isEnabled ? 1 : 0, + nonce: "' . wp_create_nonce('wp-allstars-nonce') . '" }, - success: function(response) { - if (response.success) { - console.log("Color scheme updated successfully"); - } else { - console.error("Error updating color scheme:", response); - } - }, - error: function(xhr, status, error) { - console.error("AJAX error:", error); + success: function() { + // Refresh the page after successful update + window.location.reload(); } }); - } + }); }); '; @@ -239,14 +138,16 @@ class WP_Allstars_Admin_Colors { /** * Handle color scheme update via AJAX - * Runs early to apply the color scheme change before the general option update handler */ public function handle_color_scheme_update() { // Check for required params - if (!isset($_POST['option']) || !isset($_POST['value'])) { + if (!isset($_POST['option']) || !isset($_POST['value']) || !isset($_POST['nonce'])) { return; } + // Verify nonce + check_ajax_referer('wp-allstars-nonce', 'nonce'); + // Only process our specific option if ($_POST['option'] !== $this->option_name) { return; @@ -264,52 +165,14 @@ class WP_Allstars_Admin_Colors { // Update the user's color scheme update_user_meta($user_id, 'admin_color', $scheme); - } - - /** - * AJAX handler to update and get admin color schemes - similar to WordPress core - */ - public function get_admin_colors_ajax() { - // Register handler for our new AJAX action - add_action('wp_ajax_wp_allstars_update_admin_colors', array($this, 'update_admin_colors_ajax')); - } - - /** - * AJAX handler to update admin color scheme and return class names - */ - public function update_admin_colors_ajax() { - check_ajax_referer('wp-allstars-nonce', '_wpnonce'); - $user_id = get_current_user_id(); - if (!$user_id) { - wp_send_json_error('Not logged in'); - } + // Update the option + update_option($this->option_name, $value ? 1 : 0); - // Get the old scheme - $old_scheme = get_user_meta($user_id, 'admin_color', true); - if (!$old_scheme) { - $old_scheme = 'fresh'; // Default WordPress admin color scheme - } + // Set a transient to show the saved notice + set_transient('wp_allstars_colors_updated_' . $user_id, true, 30); - // Get the new scheme - $scheme = isset($_POST['scheme']) ? sanitize_text_field($_POST['scheme']) : 'fresh'; - - // Validate scheme - global $_wp_admin_css_colors; - if (!isset($_wp_admin_css_colors[$scheme])) { - wp_send_json_error('Invalid color scheme'); - } - - // Update user meta - update_user_meta($user_id, 'admin_color', $scheme); - - // Also update our plugin option - update_option($this->option_name, $scheme === $this->modern_scheme ? 1 : 0); - - // Return success with old and new scheme names for CSS class updates - wp_send_json_success(array( - 'previousScheme' => 'admin-color-' . $old_scheme, - 'currentScheme' => 'admin-color-' . $scheme - )); + // Return success + wp_send_json_success(); } } \ No newline at end of file