From 5b5f37de365ff84fc231e414a719d1b2ff4ceff6 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Thu, 01 Jan 2026 22:38:58 +0000
Subject: [PATCH] =further feed block testing
---
inc/managers/DashboardManager.php | 237 ++++++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 184 insertions(+), 53 deletions(-)
diff --git a/inc/managers/DashboardManager.php b/inc/managers/DashboardManager.php
index 69e485e..6f1f337 100644
--- a/inc/managers/DashboardManager.php
+++ b/inc/managers/DashboardManager.php
@@ -4,6 +4,7 @@
use JVBase\forms\TaxonomySelector;use JVBase\managers\CRUD;
use JVBase\meta\MetaManager;
use JVBase\utility\Features;
+use JVBase\ui\Navigation;
use WP_User;
if (!defined('ABSPATH')) {
@@ -18,6 +19,7 @@
protected WP_User $user;
protected CacheManager $cache;
protected string $role;
+ protected string $baseURL;
protected int $userLink;
public function __construct()
@@ -30,15 +32,30 @@
$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->baseURL = get_home_url(null, '/dash');
add_action('template_redirect', [$this, 'handleRedirects']);
add_action('template_include', [$this, 'dashboardTemplates']);
add_action('admin_init', [$this, 'redirectFromAdmin']);
add_action('wp_enqueue_scripts', [$this, 'dashboardScripts'], 50);
add_filter('jvbDashboardPage', [$this, 'renderIndex'], 10, 2);
+
+ add_filter('the_seo_framework_sitemap_exclude_ids', [$this, 'excludeDashboard'], 10, 1);
}
+ public function excludeDashboard(array $ids):array {
+ $cached = $this->cache->remember(
+ 'dashboardIDs',
+ function() {
+ return get_posts([
+ 'post_type' => BASE.'dash',
+ 'posts_per_page' => -1,
+ 'fields' => 'ids',
+ ]);
+ });
+ return array_merge($ids, $cached);
+ }
+
/**
* Registers the custom post type that handles the dashboard
* @return void
@@ -482,12 +499,13 @@
if (!is_singular(BASE.'dash') && !is_post_type_archive(BASE.'dash')) {
return;
}
+ wp_enqueue_style('jvb-icons-dash');
+ wp_enqueue_style('jvb-icons-forms');
wp_enqueue_script('jvb-form');
wp_enqueue_script('jvb-selector');
wp_enqueue_script('jvb-uploader');
wp_enqueue_script('jvb-content');
- wp_enqueue_script('jvb-crud');
$page = $this->getCurrentPageSlug();
@@ -526,6 +544,12 @@
);
}
break;
+ case 'seo':
+ wp_enqueue_script('jvb-schema');
+ break;
+ default:
+ wp_enqueue_script('jvb-crud');
+ break;
}
if (Features::forSite()->has('favourites')) {
wp_enqueue_script('jvb-favourites');
@@ -629,7 +653,7 @@
$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" type="checkbox"'.$checked.' data-setting="theme" data-theme role="switch" name="dark-mode"><span class="slider">'.
+ <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>';
@@ -668,39 +692,133 @@
{
?>
</section>
+
+ <?php
+ $menu = new Navigation('sidebar');
+ $menuClasses = ['col', 'a-start', 'nowrap'];
+ $itemClasses = ['col'];
+ $menu->addClass('col a-start')->hasToggle()->defaultMenuClasses($menuClasses);
+ $menu->defaultItemClasses($itemClasses);
+ $pages = $this->getUserAllowedPages()?:[];
+ //Dashboard
+ //Referrals
+ $dashboard = $menu->addItem('Dashboard',jvbDashIcon('door'))
+ ->url($this->baseURL);
+// ->submenu('dashboard')
+// ->defaultMenuClasses($menuClasses)
+// ->defaultItemClasses($itemClasses);
+ //notifications
+ if (in_array('Notifications', $pages)) {
+ $menu->addItem('Notifications',jvbDashIcon('bell'))
+ ->url($this->baseURL.'/notifications');
+ }
+ if (in_array('Referrals', $pages)) {
+ $menu->addItem('Referrals', jvbDashIcon('hand-heart'))
+ ->url($this->baseURL.'/referrals');
+ }
+ if (in_array('Favourites', $pages)) {
+ $menu->addItem('Favourites', jvbDashIcon('heart'))
+ ->url($this->baseURL.'/favourites');
+ }
+
+ //Content
+ //content types
+ //Taxonomies
+ $availableContent = array_filter($pages, function($page, $key) {
+ return !is_numeric($key) && array_key_exists($key, JVB_CONTENT);
+ }, ARRAY_FILTER_USE_BOTH);
+ if (!empty ($availableContent)){
+ $content = $menu->addItem('Your Content', jvbDashIcon('book-bookmark'))
+ ->submenu('content')
+ ->defaultMenuClasses($menuClasses)
+ ->defaultItemClasses($itemClasses);
+ foreach ($availableContent as $slug => $page) {
+ $config = JVB_CONTENT[$slug];
+ $item = $content->addItem($page, jvbDashIcon($config['icon']))
+ ->url($this->baseURL.'/'.$slug);
+
+ $taxonomies = array_filter(JVB_TAXONOMY, function ($value, $key) use ($slug) {
+ return in_array($slug, $value['for_content']);
+ },1);
+ if (!empty ($taxonomies)) {
+ //TODO: If we add a dedicated 'create item' page, remove this from the empty check
+ $itemMenu = $item->submenu($slug);
+ foreach ($taxonomies as $s => $config) {
+ $itemMenu->addItem($config['plural'], $config['icon'])
+ ->url($this->baseURL.'/'.$s);
+ }
+ }
+
+ }
+ }
+
+ //Settings
+ $settings = $menu->addItem('Settings', jvbDashIcon('faders'))
+ ->submenu('settings')
+ ->defaultItemClasses($itemClasses)
+ ->defaultMenuClasses($menuClasses);
+
+ //SEO
+ if (in_array('SEO', $pages)) {
+ $settings->addItem('SEO', jvbDashIcon('robot'))
+ ->url($this->baseURL.'/seo');
+ }
+ //Integrations
+ if (in_array('Integrations', $pages)) {
+ $settings->addItem('Integrations', jvbDashIcon('plugs-connected'))
+ ->url($this->baseURL.'/integrations');
+ }
+ //Account
+ $account = $menu->addItem('Account', jvbDashIcon('user-circle'))
+ ->url($this->baseURL.'/account')
+ ->submenu('account')
+ ->defaultMenuClasses($menuClasses)
+ ->defaultItemClasses($itemClasses);
+ $account->addItem('Reset Password', jvbDashIcon('password'))
+ ->url($this->baseURL.'/reset-password');
+ //name + contact
+ //reset password
+
+ if (in_array('notifications', $pages)) {
+ $account->addItem('Permissions', jvbDashIcon('keyhole'))
+ ->url($this->baseURL.'/permissions');
+ }
+
+ echo $menu->render();
+ ?>
+
<footer class="col">
<?= jvbLoadingScreen() ?>
<?= TaxonomySelector::outputSelectorModal() ?>
- <nav class="dashboard-nav">
+<!-- <nav class="dashboard-nav">-->
<?php
- $current_page = $this->getCurrentPageSlug();
- $pages = $this->getUserAllowedPages()?:[];
-
- echo '<ul>';
- foreach ($pages as $slug => $page) {
- $slug = $this->getSlug($slug, $page);
- $icon = $this->getIcon($slug, $page);
- // Add data-page attribute for the navigator
- $active = ($current_page == $slug) ? ' class="current"' : '';
- $current = ($current_page == $slug) ? ' aria-current="page"' : '';
-
-
- $link = ($page === 'dash') ? '/'.$page : "/dash/$slug";
- printf(
- '<li%s><a href="%s"%s data-page="%s" data-dash title="%s">%s<span>%s</span></a></li>',
- $active,
- get_home_url(null, $link),
- $current,
- $slug,
- $page,
- jvbIcon($icon, ['title'=> $page]),
- $page
- );
- }
-
- echo '</ul>';
+// $current_page = $this->getCurrentPageSlug();
+// $pages = $this->getUserAllowedPages()?:[];
+// echo '<ul>';
+// foreach ($pages as $slug => $page) {
+// $slug = $this->getSlug($slug, $page);
+// $icon = $this->getIcon($slug, $page);
+// // Add data-page attribute for the navigator
+// $active = ($current_page == $slug) ? ' class="current"' : '';
+// $current = ($current_page == $slug) ? ' aria-current="page"' : '';
+//
+//
+// $link = ($page === 'dash') ? '/'.$page : "/dash/$slug";
+// printf(
+// '<li%s><a href="%s"%s data-page="%s" data-dash title="%s">%s<span>%s</span></a></li>',
+// $active,
+// get_home_url(null, $link),
+// $current,
+// $slug,
+// $page,
+// jvbDashIcon($icon, ['title'=> $page]),
+// $page
+// );
+// }
+//
+// echo '</ul>';
?>
- </nav>
+<!-- </nav>-->
</footer>
@@ -720,6 +838,14 @@
if ($page !== '' && $page !== 'dash') {
return $content;
}
+
+ if (Features::forSite()->has('referrals')) {
+ $whatever = JVB()->referrals()->getReferralWelcomeMessage($this->user->ID);
+ if (!empty($whatever)) {
+ return $whatever;
+ }
+ }
+
ob_start();
$name = ($this->user->first_name !== '') ? $this->user->first_name : $this->user->display_name;
@@ -743,7 +869,7 @@
$icon = $this->getIcon($slug, $page);
if ($title !== '') {
echo '<li><p><a href="'.get_home_url(null, '/dash/'.$slug.'/').'"
- data-page="'.$slug.'" data-dash>'.jvbIcon($icon).ucwords($title).'</a></p></li>';
+ data-page="'.$slug.'" data-dash>'.jvbDashIcon($icon).ucwords($title).'</a></p></li>';
}
}
@@ -804,13 +930,13 @@
$out = '<nav class="integrations"><ul>';
$url = get_home_url(null, '/dash/integrations/');
- $out .= '<li><a href="'.$url.'">'.jvbIcon('plugs-connected').'Integrations</a></li>';
+ $out .= '<li><a href="'.$url.'">'.jvbDashIcon('plugs-connected').'Integrations</a></li>';
foreach ($integrations as $name=> $integration) {
if (!JVB()->userCanConnect($name, $this->user->ID) || !$integration->hasDefaults()) {
continue;
}
$link = sanitize_title(str_replace('_', '-',$name));
- $out .= '<li><a href="'.$url.$link.'">'.jvbIcon($integration->icon).$integration->getTitle().'</a></li>';
+ $out .= '<li><a href="'.$url.$link.'">'.jvbDashIcon($integration->icon).$integration->getTitle().'</a></li>';
}
$out .= '</ul></nav>';
}
@@ -861,16 +987,16 @@
<div class="approvals container">
<nav class="tabs row start" role="tablist">
<button type="button" class="tab active" data-tab="summary" role="tab" aria-selected="true">
- <h2><?= jvbIcon('infinity')?>All</h2>
+ <h2><?= jvbDashIcon('infinity')?>All</h2>
</button>
<button type="button" class="tab" data-tab="artists" role="tab" aria-selected="false">
- <h2><?= jvbIcon('users-three')?>Artists</h2>
+ <h2><?= jvbDashIcon('users-three')?>Artists</h2>
</button>
<button type="button" class="tab" data-tab="terms" role="tab" aria-selected="false">
- <h2><?= jvbIcon('hash')?>Terms</h2>
+ <h2><?= jvbDashIcon('hash')?>Terms</h2>
</button>
<button type="button" class="tab" data-tab="yours" role="tab" aria-selected="false">
- <h2><?= jvbIcon('user')?>Yours</h2>
+ <h2><?= jvbDashIcon('user')?>Yours</h2>
</button>
</nav>
</div>
@@ -947,7 +1073,7 @@
$active = ($i === 1) ? ' active' : '';
?>
<button type="button" class="tab<?=$active?>" data-tab="<?=$type?>" role="tab" aria-selected="<?= ($active !== '') ? 'true' : 'false'?>">
- <h2><?=jvbIcon($settings['icon']??$key)?> <?= $settings['plural'] ?></h2>
+ <h2><?=jvbDashIcon($settings['icon']??$key)?> <?= $settings['plural'] ?></h2>
</button>
<?php
$i++;
@@ -974,8 +1100,8 @@
'vertical',
'TAB NAV:',
'',
- jvbIcon('caret-double-down'),
- jvbIcon('caret-double-right'))?>
+ jvbDashIcon('caret-double-down'),
+ jvbDashIcon('caret-double-right'))?>
</div>
<div class="items-container">
@@ -1034,18 +1160,18 @@
<template class="<?= $type ?>Row">
<tr>
<td>
- <?= jvbIcon('dots-six-vertical') ?>
+ <?= jvbDashIcon('dots-six-vertical') ?>
</td>
<td data-id="actions" class="col">
<?= jvbRenderToggleTextField(
'public',
'',
'',
- jvbIcon('eye'),
- jvbIcon('eye-closed'))
+ jvbDashIcon('eye'),
+ jvbDashIcon('eye-closed'))
?>
<button type="button" data-action="edit">
- <?= jvbIcon('pencil-simple') ?>
+ <?= jvbDashIcon('pencil-simple') ?>
</button>
</td>
<?php
@@ -1104,7 +1230,7 @@
$pages = $this->cache->get($cacheKey);
if ($pages === false || JVB_TESTING) {
$pages = [];
-
+ $pages[] = 'SEO';
// Add feature-dependent pages (non-config)
if (Features::forSite()->has('referrals')) {
$pages[] = 'Referrals';
@@ -1205,9 +1331,10 @@
return [];
}
+
$cacheKey = "user_pages_{$userID}";
$pages = $this->cache->get($cacheKey);
-
+ $pages = false;
if ($pages === false || JVB_TESTING) {
if (user_can($userID, 'manage_options')) {
// Admin gets all pages as flat array
@@ -1230,7 +1357,7 @@
}
switch ($type) {
case 'content':
- if (!user_can($userID, "edit_{$permission}")) {
+ if (user_can($userID, "edit_{$permission}")) {
$remove = false;
}
break;
@@ -1238,12 +1365,14 @@
$config = Features::getConfig($key, 'taxonomy');
if (array_key_exists('is_content', $config) && $config['is_content'] && (user_can($userID, "own_{$key}") || user_can($userID, "manage_{$key}"))) {
$remove = false;
+ } else if (count(array_intersect($config['for_content'], array_keys($pages))) > 0) {
+ $remove = false;
}
break;
}
} else {
switch ($slug) {
- case 'integrations':
+ case 'Integrations':
foreach($roles as $role) {
if (Features::hasAnyIntegration('user', $role)) {
$remove = false;
@@ -1263,7 +1392,7 @@
}
}
break;
- case 'approvals':
+ case 'Approvals':
$canApprove = false;
if (Features::forMembership()->has('term_approval')) {
if (array_key_exists('can_approve', JVB_MEMBERSHIP)) {
@@ -1313,6 +1442,8 @@
}
}
break;
+ case 'dash':
+ case 'Referrals':
case 'favourites':
case 'notifications':
case 'support':
@@ -1321,9 +1452,9 @@
default:
break;
}
- if ($remove) {
- unset($pages[$key]);
- }
+ }
+ if ($remove) {
+ unset($pages[$key]);
}
}
--
Gitblit v1.10.0