From e729f920139f0c65902be2d6b2c32466b08375e8 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Mon, 20 Oct 2025 17:54:52 +0000
Subject: [PATCH] =Form updates

---
 inc/managers/DashboardManager.php |  222 ++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 187 insertions(+), 35 deletions(-)

diff --git a/inc/managers/DashboardManager.php b/inc/managers/DashboardManager.php
index e15be50..0f75df3 100644
--- a/inc/managers/DashboardManager.php
+++ b/inc/managers/DashboardManager.php
@@ -3,6 +3,7 @@
 
 use JVBase\managers\CRUD;
 use JVBase\meta\MetaManager;
+use JVBase\utility\Features;
 use WP_User;
 
 if (!defined('ABSPATH')) {
@@ -126,6 +127,120 @@
         remove_action('init', [$this, 'buildDashboard']);
     }
 
+	protected function getAllDashboardPages():array
+	{
+		$manageableContent = get_option(BASE.'all_dashboard_pages');
+		if (JVB_TESTING) {
+			$manageableContent = false;
+		}
+		if ($manageableContent === false) {
+
+			$manageableContent = [];
+			$bios = [];
+			foreach (JVB_USER as $role => $config) {
+				$manageableContent = array_merge($manageableContent, jvbRolePages($role));
+			}
+
+			if (Features::forSite()->has('referrals')) {
+				$manageableContent[] = 'referrals';
+			}
+			foreach (JVB_TAXONOMY as $tax => $config) {
+				if (Features::forTaxonomy($tax)->has('is_content')) {
+					$manageableContent[] = strtolower($config['plural']);
+				}
+			}
+			if (Features::forMembership()->has('can_invite')) {
+				$manageableContent[] = 'invites';
+			}
+
+			if (Features::forMembership()->has('term_approval')) {
+				$manageableContent[] = 'approvals';
+			}
+
+			if (Features::forMembership()->has('forum')) {
+				$manageableContent[] = 'news';
+			}
+
+			if (Features::forMembership()->has('member_content')) {
+				$manageableContent[] = 'metrics';
+			}
+
+			if (!empty($bios)) {
+				$manageableContent[] = 'bio';
+			}
+
+			if (Features::forSite()->has('favourites')) {
+				$manageableContent[] = 'favourites';
+			}
+
+			if (Features::anyContentHas('karma') || Features::anyTaxonomyHas('karma') || Features::anyUserHas('karma')){
+				$manageableContent[] = 'karmic-score';
+			}
+
+			if (Features::forSite()->has('notifications')) {
+				$manageableContent[] = 'notifications';
+			}
+
+			if (Features::forSite()->has('support')){
+				$manageableContent[] = 'support';
+			}
+
+			if (Features::hasAnyIntegration()) {
+				$manageableContent[] = 'integrations';
+			}
+
+			$manageableContent[] = 'admin';
+			$manageableContent = apply_filters('jvbDashboardPages', $manageableContent);
+			$manageableContent = array_unique($manageableContent);
+			sort($manageableContent);
+			$manageableContent = array_map(function ($content) {
+				return str_replace('_', '-', $content);
+			}, $manageableContent);
+			update_option(BASE.'all_dashboard_pages', $manageableContent);
+		}
+
+
+		return $manageableContent;
+	}
+
+	protected function getRolePages(string $role):array
+	{
+		if (!array_key_exists(jvbNoBase($role), JVB_USER)) {
+			return [];
+		}
+		$manageableContent = get_option(BASE.$role.'_pages');
+		if (JVB_TESTING) {
+			$manageableContent = false;
+		}
+		if ($manageableContent === false) {
+			$manageableContent = [];
+			$config = JVB_USER[$role];
+			$content = $config['can_create'];
+			$settings = $bio = false;
+			if (array_key_exists('profile', $config)) {
+				$manageableContent[] = $config['profile'];
+			}
+
+			foreach ($content as $c) {
+				if (is_array($c)) {
+					foreach ($c as $type => $contents) {
+						$manageableContent = array_merge($manageableContent, $contents);
+					}
+				} else {
+					$manageableContent = array_merge($manageableContent, [$c]);
+				}
+			}
+
+			if (array_key_exists('has_dashboard', $config)) {
+				$manageableContent[] = 'settings';
+			}
+
+			update_option(BASE.$role.'_pages', $manageableContent);
+		}
+
+		return $manageableContent;
+	}
+
     protected function getTitle(string $page):string
     {
         $content = JVB_CONTENT;
@@ -206,7 +321,14 @@
             return $template;
         }
         if (!isOurPeople() && !current_user_can('manage_options')) {
-            wp_redirect(wp_login_url(get_home_url(2, '/dash')));
+			error_log('Redirecting because:');
+			if (!isOurPeople()) {
+				error_log('Not our people');
+			}
+			if (!current_user_can('manage_options')) {
+				error_log('Cannot manage options');
+			}
+            wp_redirect(wp_login_url(get_home_url(null, '/dash')));
             exit;
         }
 
@@ -214,6 +336,65 @@
 
         $page = $this->getCurrentPage();
 
+		switch ($page) {
+			case 'integrations':
+				if (!Features::hasAnyIntegration('user', $this->role)) {
+					wp_redirect(get_home_url(null, '/dash'));
+					exit;
+				}
+				break;
+			case 'bluesky':
+			case 'cloudflare':
+			case 'facebook':
+			case 'google-maps':
+			case 'google-my-business':
+			case 'helcim':
+			case 'instagram':
+			case 'square':
+			case 'umami':
+				if (!Features::hasIntegration($page,'user', $this->role)) {
+					wp_redirect(get_home_url(null, '/dash'));
+					exit;
+				}
+				break;
+			case 'bio':
+				$permission = JVB_USER[$this->role]['profile']??false;
+				if (!$permission || (!current_user_can('manage_'.$permission) && !current_user_can('manage_options'))) {
+					wp_redirect(get_home_url(null, '/dash'));
+					exit;
+				}
+				break;
+			case 'settings':
+				if (!current_user_can('manage_settings') && !current_user_can('manage_options')) {
+					wp_redirect(get_home_url(null, '/dash'));
+            		exit;
+				}
+				break;
+			case 'approval':
+				if (!current_user_can('skip_moderation')) {
+					wp_redirect(get_home_url(null, '/dash'));
+					exit;
+				}
+				break;
+				case 'dash':
+
+					break;
+			default:
+				$type = match($page) {
+					'menu-item' => 'menu_item',
+					'events'	=> 'event',
+					default => $page
+				};
+
+				$permission = strtolower(str_replace(' ', '_',JVB_CONTENT[$type]['plural']??$type.'s'));
+
+				if (!current_user_can('edit_'.$permission)) {
+					error_log('User cannot edit: '.$permission);
+					wp_redirect(get_home_url(null, '/dash'));
+					exit;
+				}
+				break;
+		}
 		// Enqueue needed styles/scripts
 		jvbInlineStyles('nav');
 		jvbInlineStyles('dash');
@@ -415,7 +596,7 @@
 				$page = str_replace('_', '-', $page);
 				$link = ($page === 'dash') ? '/'.$page : "/dash/$page";
 				?>
-				<link rel="preconnect" href="<?= get_home_url(2, $link)?>"/>
+				<link rel="preconnect" href="<?= get_home_url(null, $link)?>"/>
 				<?php
 			}
 			 ?>
@@ -477,7 +658,7 @@
                     printf(
                         '<li%s><a href="%s"%s data-page="%s" data-dash title="%s">%s<span>%s</span></a></li>',
                         $active,
-                        get_home_url(2, $link),
+                        get_home_url(null, $link),
                         $current,
                         $page,
                         $title,
@@ -525,7 +706,7 @@
             $description = $this->getDescription($page);
 
             if ($title !== '') {
-                echo '<li><p><a href="'.get_home_url(2, '/dash/'.$url.'/').'"
+                echo '<li><p><a href="'.get_home_url(null, '/dash/'.$url.'/').'"
                     data-page="'.$url.'" data-dash>'.jvbIcon($page).ucfirst($title).'</a></p>'.$description.'</li>';
             }
 
@@ -543,10 +724,7 @@
      */
     protected function renderForm(string $type):void
     {
-        if (!current_user_can('manage_'.$type)) {
-            wp_redirect(get_home_url(2, '/dash'));
-            exit;
-        }
+
         wp_enqueue_script(
             'jvb-bio-manager',
             JVB_URL.'assets/js/min/bioManager.min.js',
@@ -562,10 +740,6 @@
 
     protected function renderSettings():void
     {
-        if (!current_user_can('manage_options') && !current_user_can('manage_settings')) {
-            wp_redirect(get_home_url(2, '/dash'));
-            exit;
-        }
 		wp_enqueue_script('jvb-form');
         wp_enqueue_script(
             'jvb-bio-manager',
@@ -593,7 +767,7 @@
 		if (!empty($integrations)) {
 			$out = '<nav class="integrations"><ul>';
 
-			$url = get_home_url(2, '/dash/integrations/');
+			$url = get_home_url(null, '/dash/integrations/');
 			$out .= '<li><a href="'.$url.'">'.jvbIcon('plugs-connected').'Integrations</a></li>';
 			foreach ($integrations as $name=> $integration) {
 				if (!JVB()->userCanConnect($name, $this->user->ID) || !$integration->hasDefaults()) {
@@ -609,12 +783,6 @@
 
 	protected function renderIntegrations(string $page):void
 	{
-
-		//TODO: Make manage_integrations permission
-//		if (!current_user_can('manage_integrations')) {
-//			wp_redirect(get_home_url(2, '/dash'));
-//			exit;
-//		}
 		echo $this->getIntegrationsMenu();
 		$map = [
 			'google-my-business' => 'gmb',
@@ -653,10 +821,6 @@
 
     protected function renderApprovals():void
     {
-        if (!current_user_can('skip_moderation')) {
-            wp_redirect(get_home_url(2, '/dash'));
-            exit;
-        }
         ?>
         <div class="approvals container">
             <nav class="tabs row start" role="tablist">
@@ -730,12 +894,6 @@
 			'events'	=> 'event',
 			default => $type
 		};
-
-		$permission = JVB_CONTENT[$type]['plural']??$type.'s';
-        if (!current_user_can('edit_'.$permission)) {
-            wp_redirect(get_home_url(2, '/dash'));
-            exit;
-        }
         $crud = new CRUD($type);
         $crud->render();
 
@@ -743,12 +901,6 @@
 
     protected function renderAdmin():void
     {
-        //TODO: This has to be built from the settings from setup.php
-        if (!current_user_can('manage_options')) {
-            wp_redirect(get_home_url(2, '/dash'));
-            exit;
-        }
-
         ?>
         <nav class="tabs row start" role="tablist">
         <?php

--
Gitblit v1.10.0