From d7dbe7fee362d587dfc334135d9581b6216a4295 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 23 Nov 2025 04:13:56 +0000
Subject: [PATCH] =Timeline block, and feed block updated. DataStore.js refactored to not block rendering

---
 inc/managers/DashboardManager.php |  121 +++++++++++++++++++++++++---------------
 1 files changed, 76 insertions(+), 45 deletions(-)

diff --git a/inc/managers/DashboardManager.php b/inc/managers/DashboardManager.php
index 10a8a4a..a7e6790 100644
--- a/inc/managers/DashboardManager.php
+++ b/inc/managers/DashboardManager.php
@@ -169,7 +169,7 @@
 
 		// For valid dashboard pages, check access permissions
 		if (!is_404()) {
-			$page = $this->getCurrentPage();
+			$page = $this->getCurrentPageSlug();
 
 			// Dashboard home is always accessible (if authenticated)
 			if ($page === '' || $page === 'dash') {
@@ -178,7 +178,7 @@
 
 			// Check if page exists in allowed pages
 			$allowedPages = $this->getUserAllowedPages();
-			if (!in_array($page, $allowedPages)) {
+			if (!array_key_exists($page, $allowedPages)) {
 				error_log("User not allowed to access page: {$page}");
 				$this->redirectToDashboard();
 				return;
@@ -193,15 +193,17 @@
     public function buildDashboard():void
     {
         $manageableContent = $this->getAllDashboardPages();
-        foreach ($manageableContent as $key => $slug) {
-			if ($slug === 'dash') {
+        foreach ($manageableContent as $slug => $page) {
+			if ($page === 'dash') {
 				continue;
 			}
 			$existing = get_page_by_path($slug, OBJECT, BASE.'dash');
 			if ($existing) {
 				continue;
 			}
-            $title = $this->getTitle($slug);
+            $title = $page;
+
+			$slug = $this->getSlug($slug, $page);
 
             $ID = wp_insert_post(array(
                 'post_title'    => $title,
@@ -305,11 +307,11 @@
         }
 
         // Get current page/section
-        $page = $this->getCurrentPage();
+        $page = $this->getCurrentPageTitle();
 		$config = $this->getConfig($page);
 		if(!empty($config)) {
 			add_filter('jvbLoadingIcon', function() use ($config) {
-				return jvbIcon($config['icon']);
+				return $config['icon'];
 			});
 		}
 		$integrationSlugs = array_map(function($name) {
@@ -515,7 +517,7 @@
 		wp_enqueue_script('jvb-content');
 		wp_enqueue_script('jvb-crud');
 
-		$page = $this->getCurrentPage();
+		$page = $this->getCurrentPageSlug();
 
             switch ($page) {
                 case 'notifications':
@@ -575,7 +577,20 @@
 			do_action('jvbDashScripts', $page);
     }
 
-   protected function getCurrentPage():string
+   protected function getCurrentPageTitle():string
+    {
+		if (is_post_type_archive(BASE.'dash')) {
+			return 'dash';
+		}
+
+        global $post;
+        if (!$post) {
+            return '';
+        }
+
+        return $post->post_title;
+    }
+   protected function getCurrentPageSlug():string
     {
 		if (is_post_type_archive(BASE.'dash')) {
 			return 'dash';
@@ -588,6 +603,29 @@
 
         return $post->post_name;
     }
+	protected function getIcon(string $slug, string $page):string
+	{
+		return $this->cache->remember('icon_'.sanitize_title($page), function() use ($slug, $page) {
+			$icon = sanitize_title($page);
+			if (!is_numeric($slug)) {
+				$config = Features::getConfig($slug);
+				if (array_key_exists('icon', $config)) {
+					$icon = $config['icon'];
+				}
+			}
+			return $icon;
+		});
+	}
+	protected function getSlug(string $slug, string $page):string
+	{
+		return $this->cache->remember('slug_'.sanitize_title($page), function() use ($slug, $page) {
+			if (!is_numeric($slug)) {
+				return $slug;
+			} else {
+				return sanitize_title($page);
+			}
+		});
+	}
 
     protected function renderHeader():void
     {
@@ -612,7 +650,7 @@
 			 <link rel="preconnect" href="<?= get_home_url()?>"/>
             <?php wp_head(); ?>
         </head>
-    <body class="dashboard<?= ' '.$this->getCurrentPage()?>">
+    <body class="dashboard<?= ' '.$this->getCurrentPageSlug()?>">
         <?php jvbAccessibility();?>
         <header>
             <?php
@@ -663,28 +701,28 @@
         	<?= TaxonomySelector::outputSelectorModal() ?>
             <nav class="dashboard-nav">
                 <?php
-                $current_page = $this->getCurrentPage();
+                $current_page = $this->getCurrentPageSlug();
                 $pages = $this->getUserAllowedPages()?:[];
 
                 echo '<ul>';
-                foreach ($pages as $page) {
-                    // Add data-page attribute for the navigator
-                    $active = ($current_page == $page) ? ' class="current"' : '';
-                    $current = ($current_page == $page) ? ' aria-current="page"' : '';
-					$config = $this->getConfig($page);
-					$icon = $config['icon']??$page;
-					$title = ucwords(str_replace('-', ' ', $page));
+                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/$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,
-                        $title,
-                        jvbIcon($icon, ['title'=> $title]),
-                        $title
+                        jvbIcon($icon, ['title'=> $page]),
+                        $page
                     );
                 }
 
@@ -695,7 +733,7 @@
 
 
  		<?php
-        do_action('jvbRenderDashboardSettings', $this->getCurrentPage());
+        do_action('jvbRenderDashboardSettings', $this->getCurrentPageSlug());
 		?>
         <?php wp_footer(); ?>
 
@@ -717,7 +755,6 @@
         echo '<p>Welcome back!</p>';
 
         $pages = $this->getUserAllowedPages();
-		error_log('Pages: '.print_r($pages, true));
 
         echo '<h2>What would you like to do today?</h2>';
 
@@ -729,15 +766,9 @@
             $title = $this->getTitle($page);
 
             $description = $this->getDescription($page);
-			$icon = $page;
-			if (!is_numeric($slug)) {
-				$config = Features::getConfig($slug);
-				if (array_key_exists('icon', $config)) {
-					$icon = $config['icon'];
-				}
-			} else {
-				$slug = sanitize_title($page);
-			}
+
+			$slug = $this->getSlug($slug, $page);
+			$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>';
@@ -1104,52 +1135,52 @@
 
 			// Add feature-dependent pages (non-config)
 			if (Features::forSite()->has('referrals')) {
-				$pages[] = 'referrals';
+				$pages[] = 'Referrals';
 			}
 
 			if (Features::forMembership()->has('can_invite')) {
-				$pages[] = 'invites';
+				$pages[] = 'Invites';
 			}
 
 			if (Features::forMembership()->has('term_approval')) {
-				$pages[] = 'approvals';
+				$pages[] = 'Approvals';
 			}
 
 			if (Features::forMembership()->has('forum')) {
-				$pages[] = 'news';
+				$pages[] = 'News';
 			}
 
 			if (Features::forMembership()->has('member_content')) {
-				$pages[] = 'metrics';
+				$pages[] = 'Metrics';
 			}
 
 			if (Features::forSite()->has('favourites')) {
-				$pages[] = 'favourites';
+				$pages[] = 'Favourites';
 			}
 
 			if (Features::anyContentHas('karma') || Features::anyTaxonomyHas('karma') || Features::anyUserHas('karma')) {
-				$pages[] = 'karmic-score';
+				$pages[] = 'Karmic Score';
 			}
 
 			if (Features::forSite()->has('notifications')) {
-				$pages[] = 'notifications';
+				$pages[] = 'Notifications';
 			}
 
 			if (Features::forSite()->has('support')) {
-				$pages[] = 'support';
+				$pages[] = 'Support';
 			}
 
 			if (Features::hasAnyIntegration()) {
-				$pages[] = 'integrations';
+				$pages[] = 'Integrations';
 			}
 
 			// Add all content types (with config keys)
 			foreach (JVB_CONTENT as $slug => $config) {
-				$pages[$slug] = sanitize_title($config['plural']);
+				$pages[$slug] = $config['plural'];
 			}
 
 			foreach (JVB_TAXONOMY as $slug=>$config) {
-				$pages[$slug] = sanitize_title($config['plural']);
+				$pages[$slug] = $config['plural'];
 			}
 
 			// Allow filtering

--
Gitblit v1.10.0