Jake Vanderwerf
2026-01-25 b38f03c0e7218762d90fa5092696b127f24f36db
inc/managers/AdminPages.php
@@ -98,10 +98,10 @@
      switch ($action) {
         case 'flush-all':
            wp_cache_flush();
            $total = Cache::flushAll();
            return new \WP_REST_Response([
               'success' => true,
               'message' => 'All caches flushed successfully'
               'message' => $total.' caches flushed successfully'
            ]);
         case 'flush-cache':
@@ -113,7 +113,7 @@
               ], 400);
            }
            \JVBase\managers\CacheManager::invalidateAll($group);
            Cache::for($group)?->flush();
            return new \WP_REST_Response([
               'success' => true,
@@ -134,17 +134,32 @@
   public function handleIconAction(\WP_REST_Request $request): \WP_REST_Response
   {
      $action = sanitize_text_field($request->get_param('action'));
      $source = sanitize_text_field($request->get_param('source') ?? 'icons'); // Add source param
      $icons = \JVBase\managers\IconsManager::for($source);
      $source = sanitize_text_field($request->get_param('source') ?? 'icons');
      $icons = IconsManager::for($source);
      switch ($action) {
         case 'refresh-icons':
            // Force regenerate CSS immediately
            $icons->forceRefresh();
            IconsManager::regenerateAllCSS([$source => true]);
            return new \WP_REST_Response([
               'success' => true,
               'message' => "Icon CSS regenerated successfully for '{$source}'"
            ]);
         case 'refresh-all-icons':
            // Regenerate all icon sources
            foreach (['icons', 'forms', 'dash'] as $src) {
               IconsManager::for($src)->forceRefresh();
            }
            IconsManager::regenerateAllCSS();
            return new \WP_REST_Response([
               'success' => true,
               'message' => 'All icon CSS files regenerated successfully'
            ]);
         case 'restore-icon-version':
            $timestamp = (int)$request->get_param('timestamp');
            if (empty($timestamp)) {
@@ -186,6 +201,9 @@
            }
            if ($icons->mergeVersions($timestamps)) {
               // Regenerate CSS after merge
               IconsManager::regenerateAllCSS([$source => true]);
               return new \WP_REST_Response([
                  'success' => true,
                  'message' => 'Icon versions merged successfully'
@@ -659,20 +677,22 @@
   public function renderCachePage():void
   {
      $connections = CacheManager::getAllConnections();
      $groups = Cache::getAllGroups();
      // Separate generic vs. specific caches
      $generic_groups = [];
      $content_specific = [];
      $nonce = wp_create_nonce('wp_rest');
      foreach ($connections as $group => $configs) {
         $is_generic = !$this->isBoundToContentOrTaxonomy($group);
      // Separate by type
      $generic = [];
      $specific = [];
         if ($is_generic) {
            $generic_groups[$group] = $configs;
      foreach ($groups as $group => $data) {
         if ($this->isBoundToContentOrTaxonomy($group)) {
            $specific[$group] = $data;
         } else {
            $content_specific[$group] = $configs;
            $generic[$group] = $data;
         }
      }
@@ -728,7 +748,7 @@
               </tr>
               </thead>
               <tbody>
               <?php foreach ($content_specific as $group => $configs): ?>
               <?php foreach ($specific as $group => $configs): ?>
                  <tr>
                     <td><strong><?= esc_html($group); ?></strong></td>
                     <td><?= $this->formatConnections($configs); ?></td>
@@ -739,6 +759,19 @@
                     </td>
                  </tr>
               <?php endforeach; ?>
               <?php foreach ($generic as $group => $data): ?>
                  <tr>
                     <td><strong><?= esc_html($group); ?></strong></td>
                     <td><?= $this->formatConnections($data); ?></td>
                     <td>
                        <button type="button" class="button"
                              data-action="flush-cache"
                              data-group="<?= esc_attr($group); ?>">
                           <?= jvbDashIcon('trash'); ?> Flush
                        </button>
                     </td>
                  </tr>
               <?php endforeach; ?>
               </tbody>
            </table>
         </details>
@@ -820,15 +853,24 @@
      return false;
   }
   protected function formatConnections(array $configs): string
   protected function formatConnections(array $data): string
   {
      $connections = [];
      foreach ($configs as $config) {
         $parent = $config['parent'] ?? 'unknown';
         $scope = $config['scope'] ?? 'id';
         $connections[] = "{$parent} ({$scope})";
      $parts = [];
      if (!empty($data['connects_to'])) {
         $targets = array_map(function($conn) {
            $flush_text = $conn['flush'] ? ' (flush all)' : '';
            return $conn['group'] . $flush_text;
         }, $data['connects_to']);
         $parts[] = '<strong>Invalidates:</strong> ' . implode(', ', $targets);
      }
      return esc_html(implode(', ', $connections));
      if (!empty($data['connected_from'])) {
         $sources = array_map(fn($conn) => $conn['group'], $data['connected_from']);
         $parts[] = '<strong>Invalidated by:</strong> ' . implode(', ', $sources);
      }
      return $parts ? implode('<br>', $parts) : 'No connections';
   }
   public function handleCacheActions($response, $request, $action):WP_REST_Response
@@ -854,7 +896,8 @@
            ], 400);
         }
         \JVBase\managers\CacheManager::invalidateAll($group);
         $group = sanitize_text_field($request->get_param('group'));
         Cache::invalidateGroup($group);
         return new WP_REST_Response([
            'success' => true,
@@ -862,68 +905,6 @@
         ]);
      }
      if ($action === 'merge-icon-versions') {
         $timestamps = $request->get_param('timestamps');
         if (empty($timestamps) || !is_array($timestamps)) {
            return new WP_REST_Response([
               'success' => false,
               'message' => 'No versions selected for merging'
            ], 400);
         }
         // Convert to integers
         $timestamps = array_map('intval', $timestamps);
         if (count($timestamps) < 2) {
            return new WP_REST_Response([
               'success' => false,
               'message' => 'Please select at least 2 versions to merge'
            ], 400);
         }
         $icons = \JVBase\managers\IconsManager::getInstance();
         if ($icons->mergeVersions($timestamps)) {
            return new WP_REST_Response([
               'success' => true,
               'message' => 'Icon versions merged successfully'
            ]);
         }
         return new WP_REST_Response([
            'success' => false,
            'message' => 'Failed to merge icon versions'
         ], 500);
      }
      if ($action === 'refresh-icons') {
         $icons = \JVBase\managers\IconsManager::getInstance();
         $icons->forceRefresh();
         return new WP_REST_Response([
            'success' => true,
            'message' => 'Icon CSS refresh triggered'
         ]);
      }
      if ($action === 'restore-icon-version') {
         $timestamp = (int)$request->get_param('timestamp');
         $icons = \JVBase\managers\IconsManager::getInstance();
         if ($icons->restoreVersion($timestamp)) {
            return new WP_REST_Response([
               'success' => true,
               'message' => 'Icon version restored successfully'
            ]);
         }
         return new WP_REST_Response([
            'success' => false,
            'message' => 'Failed to restore icon version'
         ], 500);
      }
      return $response;
   }
@@ -936,7 +917,7 @@
      // Get all registered icon sources
      $all_sources = ['icons', 'forms', 'dash']; // You could get this dynamically if needed
      $icons = \JVBase\managers\IconsManager::for($current_source);
      $icons = IconsManager::for($current_source);
      $versions = $icons->getVersionHistory();
      $nonce = wp_create_nonce('wp_rest');