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