Jake Vanderwerf
6 hours ago 56a9a1ccf764ff7a6af8f8a2292cb07443cb4aa7
inc/managers/DashboardManager.php
@@ -2,12 +2,11 @@
namespace JVBase\managers;
use JVBase\forms\TaxonomySelector;
use JVBase\managers\CRUD;
use JVBase\base\Site;
use JVBase\meta\Form;
use JVBase\meta\Meta;
use JVBase\registrar\Registrar;use JVBase\utility\Features;
use JVBase\registrar\Registrar;
use JVBase\ui\Navigation;
use WP_User;
use WP_Error;use WP_Query;use WP_User;
if (!defined('ABSPATH')) {
    exit; // Exit if accessed directly
@@ -27,14 +26,14 @@
    public function __construct()
    {
        $this->cache = Cache::for('dashboard', WEEK_IN_SECONDS)->connect('user');
      if (JVB_TESTING) {
         $this->cache->flush();
      }
        add_action('init', [$this, 'registerDashboard']);
        if (!$this->isRegistered()) {
            add_action('init', [$this, 'buildDashboard']);
        }
      $this->cache->flush();
        $this->user = wp_get_current_user();
        $this->role = jvbUserRole($this->user->ID);
        $this->userLink = (int)get_user_meta($this->user->ID, BASE.'link', true);
        $this->userLink = (int)get_user_meta($this->user->ID, BASE.'profile_link', true);
      $this->baseURL = get_home_url(null, '/dash');
      add_action('template_redirect', [$this, 'handleRedirects']);
@@ -43,6 +42,8 @@
        add_action('wp_enqueue_scripts', [$this, 'dashboardScripts'], 50);
      add_filter('jvbDashboardPage', [$this, 'renderIndex'], 10, 2);
      jvb_register_do_once('buildDashboard', [$this, 'activate']);
      add_filter('the_seo_framework_sitemap_exclude_ids', [$this, 'excludeDashboard'], 10, 1);
    }
@@ -225,34 +226,65 @@
     * Ensures the necessary pages are created
     * @return void
     */
    public function buildDashboard():void
    public function activate():void
    {
        $manageableContent = $this->getAllDashboardPages();
      error_log('[DashboardManager]::buildDashboard Manageable Content: '.print_r($manageableContent, true));
        foreach ($manageableContent as $slug => $page) {
         if ($page === 'dash') {
            continue;
         }
         $slug = $this->getSlug($slug, $page);
         $existing = get_page_by_path($slug, OBJECT, BASE.'dash');
         if ($existing) {
            continue;
         $ID = $this->createDashboardPage($slug, $page);
         $registrar = Registrar::getInstance($slug);
         if ($registrar) {
            $create = [
               'new_'   => 'Create New ',
               'edit_'  => 'Edit '
            ];
            $parentID = (int)$ID;
            foreach ($create as $s => $t) {
               $s .= $slug;
               $t .= $page;
               $this->createDashboardPage($s, $t, $parentID);
            }
         }
            $title = $page;
            $ID = wp_insert_post(array(
                'post_title'    => $title,
                'post_name'     => $slug,
                'post_type'     => BASE.'dash',
                'post_status'   => 'publish',
            ));
         if ($title === 'Integrations') {
         if ($page === 'Integrations') {
            $this->buildIntegrationPages($ID);
         }
        }
        update_option(BASE.'dashboard_registered', true);
        remove_action('init', [$this, 'buildDashboard']);
    }
      public function createDashboardPage(string $slug, string $page, int $parentID = 0):int|WP_Error
      {
         if (is_numeric($slug)) {
            $slug = $this->getSlug($slug, $page);
         }
         $existing = new WP_Query([
            'post_type' => BASE.'dash',
            'name'   => $slug,
            'fields' => 'ids',
            'posts_per_page'  => 1,
         ]);
         if ($existing->have_posts()) {
            return $existing->posts[0];
         }
         $args = [
            'post_title'    => $page,
                'post_name'     => $slug,
                'post_type'     => BASE.'dash',
                'post_status'   => 'publish',
         ];
         if ($parentID > 0) {
            $args['post_parent'] = $parentID;
         }
            return wp_insert_post($args);
      }
   /**
    * Build integration sub-pages
@@ -265,27 +297,9 @@
      foreach ($integrations as $name => $integration) {
         $title = $integration->getTitle();
         $slug = sanitize_title($title);
         // Check if integration page already exists
         $existing = get_posts([
            'post_type' => BASE.'dash',
            'name' => $slug,
            'post_parent' => $parentID,
            'posts_per_page' => 1,
         ]);
         if (!empty($existing)) {
            continue; // Skip if exists
         }
         wp_insert_post([
            'post_title'    => $title,
            'post_name'     => $slug,
            'post_type'     => BASE.'dash',
            'post_status'   => 'publish',
            'post_parent'   => $parentID
         ]);
         $this->createDashboardPage($slug, $title, $parentID);
      }
   }
@@ -319,14 +333,6 @@
        return $description;
    }
    /**
     * Checks if we've already created the need pages
     * @return bool
     */
    protected function isRegistered():bool
    {
        return get_option(BASE.'dashboard_registered', false);
    }
    /**
     * Hacking into the template_include to set our custom templates and protections
@@ -376,7 +382,7 @@
   }
   protected function renderDashboard(string $page):string
   {
      ob_start();
//    ob_start();
      jvbInlineStyles('nav');
      jvbInlineStyles('dash');
      jvbInlineStyles('forms');
@@ -392,7 +398,8 @@
      );
      $this->renderFooter();
      return ob_get_clean();
//    return ob_get_clean();
return '';
//    $integrationSlugs = array_map(function($name) {
//       return sanitize_title(str_replace('_', '-', $name));
//    }, array_keys(JVB()->getAvailableServices(false)));
@@ -400,11 +407,11 @@
//    if ($page === 'integrations' || in_array($page, $integrationSlugs)) {
//       // Check integration access
//       if ($page === 'integrations') {
//          if (!Features::hasAnyIntegration('user', $this->role)) {
//          if (!Site::hasAnyIntegration('user', $this->role)) {
//             $this->redirectToDashboard();
//          }
//       } else {
//          if (!Features::hasIntegration($page, 'user', $this->role)) {
//          if (!Site::hasIntegration($page, 'user', $this->role)) {
//             $this->redirectToDashboard();
//          }
//       }
@@ -530,7 +537,7 @@
            switch ($page) {
                case 'notifications':
               if (Features::forSite()->has('notifications')) {
               if (Site::has('notifications')) {
                  wp_enqueue_script('jvb-notification-manager');
               }
                    break;
@@ -570,7 +577,7 @@
               wp_enqueue_script('jvb-crud');
               break;
            }
         if (Features::forSite()->has('favourites')) {
         if (Site::has('favourites')) {
             wp_enqueue_script('jvb-favourites');
            wp_localize_script('jvb-favourites-manager', 'favouritesSettings', [
               'strings' => [
@@ -586,7 +593,7 @@
         wp_enqueue_script('jvb-creator');
         if (Features::forSite()->has('forum')) {
         if (Site::has('forum')) {
         wp_enqueue_script('jvb-news');
         }
         do_action('jvbDashScripts', $page);
@@ -648,7 +655,7 @@
        <!DOCTYPE html>
    <html <?php language_attributes(); ?>>
        <head>
            <title><?= (array_key_exists('dashboard_title', JVB_SITE)) ? JVB_SITE['dashboard_title'] : 'Dashboard | '.get_bloginfo('name') ?></title>
            <title><?= Site::dashboardTitle()??'Dashboard | '.get_bloginfo('name') ?></title>
            <meta charset="<?php bloginfo('charset'); ?>">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <?php
@@ -668,41 +675,27 @@
    <body class="dashboard<?= ' '.$this->getCurrentPageSlug()?>">
        <?php jvbAccessibility();?>
        <header>
            <?php
            $checked = (is_user_logged_in() && current_user_can('prefers_dark_theme', true)) ? ' checked' : '';
            $title = ($checked == '') ? 'Toggle Dark Mode' : 'Toggle Light Mode';
            echo '<label title="'.$title.'" id="theme-switch" class="toggle-switch" for="theme-switcher">
                    <input class="theme-switch row" id="theme-switcher" name="theme-switcher" type="checkbox"'.$checked.' data-setting="theme" data-theme role="switch" name="dark-mode" aria-label="Toggle dark mode"><span class="slider">'.
               jvbIcon('sun-dim', ['title'=> 'Light Mode']).
               jvbIcon('moon', ['title'=>'Dark Mode']).
               '</span></label>';
            ?>
            <p class="title">
                <a href="<?= get_home_url(); ?>" rel="home" title="Back to Site">
                    <?php
                    $icon = (int) get_option( 'site_icon' );
               $out = '';
               if ($icon > 0) {
                  $url = wp_get_attachment_image_url( $icon);
                  if ($url) {
                     $out = '<img src="'.$url.'">';
                  }
               }
               if ($out == '') {
                  $out =jvbIcon('house');
               }
                    ?><?= $out ?>
                </a>
            </p>
         <?= jvbDarkModeToggle() ?>
         <?php
         $function = BASE.'render_core_site_logo';
         if (function_exists($function)) {
            echo $function([],'');
         } else {
            echo render_block( [
               'blockName' => 'core/site-logo',
               'attrs'     => [],
            ]);
         }
         ?>
            <nav>
                <ul>
                    <?= jvbNotificationMenu() ?>
                    <?= jvbHelpMenu() ?>
                    <li><a href="<?=wp_logout_url(get_home_url())?>" title="Logout"><?=jvbIcon('sign-out')?></a></li>
                </ul>
            </nav>
        </header>
         <nav>
            <ul>
               <?= jvbNotificationMenu() ?>
               <?= jvbHelpMenu() ?>
               <li><a href="<?=wp_logout_url(get_home_url())?>" title="Logout"><?=jvbIcon('sign-out')?></a></li>
            </ul>
         </nav>
      </header>
        <main><section class="replace">
    <?php
@@ -715,9 +708,9 @@
      <?php
      $menu = new Navigation('sidebar');
      $menuClasses = ['col', 'a-start', 'nowrap'];
      $menuClasses = ['left'];
      $itemClasses = ['col'];
      $menu->addClass('col a-start')->hasToggle()->defaultMenuClasses($menuClasses);
      $menu->addClass('sidebar left')->hasToggle()->defaultMenuClasses($menuClasses);
      $menu->defaultItemClasses($itemClasses);
      $pages = $this->getUserAllowedPages()?:[];
      //Dashboard
@@ -768,8 +761,11 @@
                  $itemMenu = $item->submenu($slug);
                  foreach ($taxonomies as $s) {
                     $taxRegistrar = Registrar::getInstance($s);
                     $itemMenu->addItem($taxRegistrar->getPlural(), $taxRegistrar->getIcon())
                     if ($taxRegistrar) {
                        $itemMenu->addItem($taxRegistrar->getPlural(), $taxRegistrar->getIcon())
                        ->url($this->baseURL.'/'.$s);
                     }
                  }
               }
            }
@@ -867,7 +863,7 @@
         return $content;
      }
      if (Features::forSite()->has('referrals')) {
      if (Site::has('referrals')) {
         $whatever = JVB()->referrals()->getReferralWelcomeMessage($this->user->ID);
         if (!empty($whatever)) {
            return $whatever;
@@ -877,7 +873,7 @@
      ob_start();
        $name = ($this->user->first_name !== '') ? $this->user->first_name : $this->user->display_name;
        echo '<h1 style="text-transform:none;margin-top:2em!important;">Hey '.$name.'</h1>';
        echo '<h1>Hey '.$name.'</h1>';
        echo '<p>Welcome back!</p>';
        $pages = $this->getUserAllowedPages();
@@ -981,7 +977,7 @@
      $connection = (array_key_exists($page, $map)) ? $map[$page] : $page;
      if ($connection !== 'integrations') {
         $userID = (Features::forSite()->has('has_membership')) ? $this->user->ID : null;
         $userID = (Site::has('has_membership')) ? $this->user->ID : null;
         $integration = JVB()->connect($connection, $userID);
         echo '<h1>Managing '.$integration->title.'</h1>';
@@ -1013,18 +1009,18 @@
    {
        ?>
        <div class="approvals container">
            <nav class="tabs row start" role="tablist">
            <nav class="tabs row left" role="tablist">
                <button type="button" class="tab active" data-tab="summary" role="tab" aria-selected="true">
                    <h2><?= jvbDashIcon('infinity')?>All</h2>
                   <?= jvbDashIcon('infinity')?>All
                </button>
                <button type="button" class="tab" data-tab="artists" role="tab" aria-selected="false">
                    <h2><?= jvbDashIcon('users-three')?>Artists</h2>
                    <?= jvbDashIcon('users-three')?>Artists
                </button>
                <button type="button" class="tab" data-tab="terms" role="tab" aria-selected="false">
                    <h2><?= jvbDashIcon('hash')?>Terms</h2>
                   <?= jvbDashIcon('hash')?>Terms
                </button>
                <button type="button" class="tab" data-tab="yours" role="tab" aria-selected="false">
                    <h2><?= jvbDashIcon('user')?>Yours</h2>
                    <?= jvbDashIcon('user')?>Yours
                </button>
            </nav>
        </div>
@@ -1085,7 +1081,7 @@
      }
      ob_start();
        ?>
        <nav class="tabs row start" role="tablist">
        <nav class="tabs row left" role="tablist">
        <?php
        $i=1;
        $content = Registrar::getRegistered('post');
@@ -1258,27 +1254,27 @@
         $pages = [];
         $pages[] = 'SEO';
         // Add feature-dependent pages (non-config)
         if (Features::forSite()->has('referrals')) {
         if (Site::has('referrals')) {
            $pages[] = 'Referrals';
         }
         if (Features::forMembership()->has('can_invite')) {
         $membership = Site::membership();
         if ($membership && $membership->has('can_invite')) {
            $pages[] = 'Invites';
         }
         if (Features::forMembership()->has('term_approval')) {
         if ($membership && $membership->has('term_approval')) {
            $pages[] = 'Approvals';
         }
         if (Features::forMembership()->has('forum')) {
         if ($membership && $membership->has('forum')) {
            $pages[] = 'News';
         }
         if (Features::forMembership()->has('member_content')) {
         if ($membership && $membership->has('member_content')) {
            $pages[] = 'Metrics';
         }
         if (Features::forSite()->has('favourites')) {
         if (Site::has('favourites')) {
            $pages[] = 'Favourites';
         }
@@ -1286,15 +1282,15 @@
            $pages[] = 'Karmic Score';
         }
         if (Features::forSite()->has('notifications')) {
         if (Site::has('notifications')) {
            $pages[] = 'Notifications';
         }
         if (Features::forSite()->has('support')) {
         if (Site::has('support')) {
            $pages[] = 'Support';
         }
         if (Features::hasAnyIntegration()) {
         if (Site::hasAnyIntegration()) {
            $pages[] = 'Integrations';
         }
@@ -1324,21 +1320,6 @@
      return $pages;
   }
   /**
    * Get pages available to a specific role
    * @param string $role The role slug (with or without BASE prefix)
    * @return array
    */
   protected function getRolePages(string $role):array
   {
      $role = jvbNoBase($role);
      if (!Registrar::getInstance($role)){
         return [];
      }
      return Features::forUser($role)->getDashboardPages();
   }
   /**
    * Get pages that a specific user is allowed to access
@@ -1379,6 +1360,7 @@
            $remove = true;
            if (!is_numeric($key)) {
               $registrar = Registrar::getInstance($key);
               $membership = Site::membership();
               $type  = $registrar? $registrar->getType() : false;
               if ($type) {
                  $permission = JVB()->roles()->getPermission('edit', $key);
@@ -1402,7 +1384,7 @@
               switch ($slug) {
                  case 'Integrations':
                     foreach($roles as $role) {
                        if (Features::hasAnyIntegration('user', $role)) {
                        if (Registrar::getInstance($role)->hasAnyIntegrations()) {
                           $remove = false;
                        }
                     }
@@ -1423,7 +1405,7 @@
                     break;
                  case 'Approvals':
                     $canApprove = false;
                     if (Features::forMembership()->has('term_approval')) {
                     if ($membership && $membership->has('term_approval')) {
                        if (array_key_exists('can_approve', JVB_MEMBERSHIP)) {
                           foreach ($roles as $role) {
                              if (in_array($role, JVB_MEMBERSHIP['can_approve'])) {
@@ -1454,14 +1436,14 @@
                     break;
                  case 'metrics':
                     foreach ($roles as $role) {
                        if (!empty(Features::forUser($role)->getCreatableContent())) {
                        if (!empty(Registrar::getInstance($role)?->getCreatable())) {
                           $remove = false;
                        }
                     }
                     break;
                  case 'karmic-score':
                     foreach ($roles as $role) {
                        $contents = Features::forUser($role)->getCreatableContent();
                        $contents = Registrar::getInstance($role)?->getCreatable();
                        if (!empty($contents)) {
                           $hasKarma = Registrar::getFeatured('karma');
                           $remove = empty(array_intersect($contents, $hasKarma));
@@ -1510,7 +1492,7 @@
      $creatable = [];
      foreach ($roles as $role) {
         $roleCreatable = Features::forUser($role)->getCreatableContent();
         $roleCreatable = Registrar::getInstance($role)?->getCreatable();
         $creatable = array_merge($creatable, $roleCreatable);
      }