From c204185ae86a98994f80010abf35a190c9406739 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 12 Jul 2026 18:08:19 +0000
Subject: [PATCH] =Refactor of Integrations.php. Separated different functionality into traits that classes can use to add that functionality. Hopefully will make maintaining it a little easier. Still have to finish up, as well as refactoring the individual classes to utilize the new system.

---
 inc/managers/Dashboard/DashboardManager.php |  138 ++++++++++++++++++++++++++++++++++++----------
 1 files changed, 108 insertions(+), 30 deletions(-)

diff --git a/inc/managers/Dashboard/DashboardManager.php b/inc/managers/Dashboard/DashboardManager.php
index 3ef40f4..2f7c43e 100644
--- a/inc/managers/Dashboard/DashboardManager.php
+++ b/inc/managers/Dashboard/DashboardManager.php
@@ -1,12 +1,7 @@
 <?php
 namespace JVBase\managers\Dashboard;
 
-use JetBrains\PhpStorm\NoReturn;
-use JVBase\forms\TaxonomySelector;
-use JVBase\base\Site;
-use JVBase\managers\Cache;
-use JVBase\managers\IconsManager;use JVBase\managers\RoleManager;use JVBase\meta\Form;use JVBase\meta\Meta;use JVBase\registrar\Fields;use JVBase\registrar\Registrar;
-use JVBase\ui\Navigation;
+use JetBrains\PhpStorm\NoReturn;use JVBase\base\Site;use JVBase\forms\TaxonomySelector;use JVBase\managers\Cache;use JVBase\managers\IconsManager;use JVBase\managers\LoginManager;use JVBase\managers\RoleManager;use JVBase\meta\Form;use JVBase\meta\Meta;use JVBase\registrar\Fields;use JVBase\registrar\Registrar;use JVBase\ui\Navigation;use JVBase\ui\Tabs;
 
 if (!defined('ABSPATH')) {
 	exit;
@@ -37,6 +32,7 @@
 			add_action(BASE.'dashboard_page_dash', [$this, 'renderMain'], 10);
 		}
 		add_action(BASE.'dashboard_page_account', [$this, 'renderAccount'], 10);
+		add_action(BASE.'dashboard_page_reset_password', [$this, 'resetPasswordPage'], 10);
 	}
 
 	protected function registerDashboard():void
@@ -84,14 +80,17 @@
 						return;
 					}
 					$page = $this->getCurrentPage();
+					if (!$page) {
+						$this->redirectToDashboard();
+					}
 					if (!in_array($page, $this->pages)) {
-						error_log('Looking for page: '.$page. ' in: '.print_r($this->pages, true));
-						error_log('[DashboardManager]::handleRedirect could not find page for '.$page);
+						error_log('Looking for page: '.$page->getSlug(). ' in: '.print_r($this->pages, true));
+						error_log('[DashboardManager]::handleRedirect could not find page for '.$page->getTitle());
 						return;
 					}
 					$permission = $page->getPermission();
-					if (!empty($permission) && !current_user_can($permission)) {
-						error_log('[DashboardManager]::handleRedirect User cannot manage '.$page);
+					if (!empty($permission) && !$this->handlePermission($page)) {
+						error_log('[DashboardManager]::handleRedirect User cannot manage '.$page->getTitle());
 						$this->redirectToDashboard();
 					}
 				}
@@ -216,12 +215,16 @@
 //				uasort($pages, fn($a, $b) => $a->getOrder() <=> $b->getOrder());
 				uasort($all, fn($a, $b) => $a->getOrder() <=> $b->getOrder());
 
+
 				foreach ($all as $slug => $item) {
 					if (is_a($item, Section::class)) {
 						$this->buildMenuSection($item, $menu);
 					} else {
 						$menuItem = $menu->addItem($item->getTitle(), jvbDashIcon($item->getIcon()));
 						$menuItem->url($item->getURL());
+						if ($this->getCurrentPage() === $item) {
+							$menuItem->current();
+						}
 					}
 				}
 				return $menu->render();
@@ -239,6 +242,10 @@
 					$main = $this->getMainPage($section->getSlug());
 					if ($main && $section->getIsLink()) {
 						$page->url($main->getURL());
+
+						if ($this->getCurrentPage() === $page) {
+							$page->current();
+						}
 					}
 					$submenu = $page->submenu();
 
@@ -248,6 +255,10 @@
 						} elseif ($slug !== $section->getSlug()) {
 							$menuItem = $submenu->addItem($item->getTitle(), jvbDashIcon($item->getIcon()));
 							$menuItem->url($item->getURL());
+
+							if ($this->getCurrentPage() === $item) {
+								$menuItem->current();
+							}
 						}
 					}
 
@@ -394,6 +405,7 @@
 			}
 
 			$account = $this->addPage('Account', 'account', 'user-circle');
+			$account->setScripts(['jvb-form','jvb-tabs']);
 			$account->setSection('account');
 
 			$this->sections['account'] = new Section('Account', 'account', 'user-circle');
@@ -403,6 +415,7 @@
 
 			$password = $this->addPage('Reset Password', 'reset-password', 'password', $account->getID());
 			$password->setOrder(2);
+			$password->setScripts(['jvb-form', 'jvb-tabs']);
 			$password->setSection('account');
 
 		}
@@ -489,6 +502,7 @@
 				$page = $this->addPage('Integrations', 'integrations', 'plugs-connected');
 				$page->setSection('settings');
 				$page->setOrder($order);
+				$page->setPermission('user_has_integrations');
 				$page->setScripts(['jvb-integrations']);
 				$parent = $page->getID();
 
@@ -498,16 +512,16 @@
 
 				foreach (array_keys(Site::getIntegrations()) as $integration) {
 					$integration = match($integration) {
-						'maps' => 'JVBase\integrations\GoogleMaps',
-						'square' => 'JVBase\integrations\Square',
-						'facebook' => 'JVBase\integrations\Facebook',
-						'helcim' => 'JVBase\integrations\Helcim',
-						'instagram' => 'JVBase\integrations\Instagram',
-						'bluesky' => 'JVBase\integrations\BlueSky',
-						'gmb' => 'JVBase\integrations\GoogleMyBusiness',
-						'cloudflare' => 'JVBase\integrations\Cloudflare',
-						'umami' => 'JVBase\integrations\Umami',
-						'postmark' => 'JVBase\integrations\PostMark',
+						'maps' => 'JVBase\integrations\services\GoogleMaps',
+						'square' => 'JVBase\integrations\services\Square',
+						'facebook' => 'JVBase\integrations\services\Facebook',
+						'helcim' => 'JVBase\integrations\services\Helcim',
+						'instagram' => 'JVBase\integrations\services\Instagram',
+						'bluesky' => 'JVBase\integrations\services\BlueSky',
+						'gmb' => 'JVBase\integrations\services\GoogleMyBusiness',
+						'cloudflare' => 'JVBase\integrations\services\Cloudflare',
+						'umami' => 'JVBase\integrations\services\Umami',
+						'postmark' => 'JVBase\integrations\services\PostMark',
 					};
 					$title = $integration::title();
 					$icon = $integration::icon();
@@ -599,9 +613,29 @@
 	protected function setCurrentUserPages():void
 	{
 		$this->currentUserPages = array_filter($this->pages, function($page) {
-			return current_user_can('manage_options') || empty($page->getPermission()) || current_user_can($page->getPermission());
+			return current_user_can('manage_options') || empty($page->getPermission()) || $this->handlePermission($page);
 		});
 	}
+		protected function handlePermission($page):bool
+		{
+			return match($page->getPermission()) {
+				'user_has_integrations'	=> $this->handleIntegrationPermission(),
+				default => current_user_can($page->getPermission())
+			};
+		}
+		protected function handleIntegrationPermission():bool
+		{
+			$user = wp_get_current_user();
+			$role = jvbUserRole($user->ID);
+			if (current_user_can('manage_options')) {
+				return true;
+			}
+			$registrar = Registrar::getInstance($role);
+			if (!$registrar) {
+				return false;
+			}
+			return $registrar->hasAnyIntegrations();
+		}
 
 	#[NoReturn]protected function redirectToLogin():void
 	{
@@ -669,26 +703,70 @@
 
 	public function renderAccount():void
 	{
-
 		$user = get_userdata(get_current_user_id());
 		$role = jvbUserRole($user->ID);
 		$registrar = Registrar::getInstance($role);
 
-
 		if ($registrar) {
 			$meta = Meta::forUser($user->ID);
 			$fields = $registrar->getFields();
+			$sections = $registrar->getSections();
+			$tabs = new Tabs();
+			foreach ($sections as $slug => $config) {
+				$tab = $tabs->addTab($slug);
+				$tab->title($config['title']);
+				if (!empty($config['description'])) {
+					$tab->description($config['description']);
+				}
+				if (!empty($config['icon'])) {
+					$tab->icon($config['icon']);
+				}
+				$content = implode('', array_map(function ($f) use ($meta) {
+					return Form::renderFrom($meta,$f);
+				},$config['fields']));
+				$tab->content($content);
+			}
+			echo '<form data-save="user" data-auto data-action="dash">'.jvbFormStatus().$tabs->render().'<button type="submit">'.jvbDashIcon('floppy-disk').'Save</button></form>';
 		} else {
 			$fields = Fields::getUserFields();
 			$meta = new Meta($user->ID, 'user', $fields);
+
+			echo Form::renderFormFrom($meta, 'user', [
+				'heading'	=> 'Your Account',
+				'description' => [
+					'You can set your information here.',
+					'To reset your password, check the side menu under "Account"'
+				],
+				'submit'	=> true
+			]);
 		}
 
-		echo Form::renderFormFrom($meta, 'user', [
-			'heading'	=> 'Your Account',
-			'description' => [
-				'You can set your information here.',
-				'To reset your password, check the side menu under "Account"'
-			]
-		]);
+		$script = 'document.addEventListener(\'DOMContentLoaded\', async function () {
+
+		window.auth.subscribe(event => {
+			if (event === \'auth-loaded\') {
+				const form = document.querySelector(\'form[data-save="user"]\');
+				if (!form || !window.jvbForm) return;
+
+				window.jvbForm.registerForm(form);
+			}
+		});
+	});';
+//		wp_add_inline_script('jvb-form', $script);
+	}
+
+	public function resetPasswordPage():void
+	{
+		?>
+		<h1>Reset Your Password</h1>
+		<p>If you'd like to reset your password, you can do so here.</p>
+		<?php
+		if (Site::has('magic_link')) {
+			echo '<p>Alternatively, you can always login using the magic link, which sets a temporary password for 15 minutes.</p>';
+		}
+		 ?>
+		<?= LoginManager::getInstance()->renderLoginForm('resetpass'); ?>
+
+		<?php
 	}
 }

--
Gitblit v1.10.0