From 48721c85ebcfa973ee81719d2467ca80e4253dc9 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Fri, 01 May 2026 17:30:03 +0000
Subject: [PATCH] =Edmonton Ink hard test begins! Real testing of the managers and reset routes will commence. So far, just ensuring our classes are all loaded correctly: Site() and its sub-classes Membership, Login, etc. Care should be taken to load conditionally on 'init', as we finish defining most settings by 'plugins_loaded' at priority 5

---
 inc/managers/DirectoryManager.php |  169 ++++++++++++++++++++++++++++++--------------------------
 1 files changed, 91 insertions(+), 78 deletions(-)

diff --git a/inc/managers/DirectoryManager.php b/inc/managers/DirectoryManager.php
index 541ca2c..3be452e 100644
--- a/inc/managers/DirectoryManager.php
+++ b/inc/managers/DirectoryManager.php
@@ -5,9 +5,8 @@
 	exit;
 }
 
-use JVBase\registry\PostTypeRegistrar;
-use JVBase\managers\Cache;
-use JVBase\utility\Features;
+use JVBase\registrar\Registrar;
+use JVBase\base\Site;
 use WP_Block;
 use WP_Query;
 
@@ -37,15 +36,16 @@
 			$this->cache->flush();
 		}
 
+		jvb_register_do_once('buildDirectories', [$this, 'activate']);
 		add_action('init', [$this, 'registerDirectories']);
-		jvb_register_do_once('directories_registered', [$this, 'activate']);
-        add_action('render_block', [$this, 'renderBlock'], 99999, 3);
+        add_filter('render_block', [$this, 'renderBlock'], 998, 3);
     }
 
     public function registerDirectories():void
     {
-		$singular = (array_key_exists('directory_label', JVB_SITE)) ? JVB_SITE['directory_label'][0] : 'Directory';
-		$plural = (array_key_exists('directory_label', JVB_SITE)) ? JVB_SITE['directory_label'][1] : 'Directories';
+
+		$singular = !empty(Site::getDirectorySingular())?:'Directory';
+		$plural = !empty(Site::getDirectorySingular())?: 'Directories';
 		$config = [
 			'labels'	=> [
 				'name'               => $plural,
@@ -66,7 +66,7 @@
 			'public'              => true,
 			'menu_icon'		=> jvbCSSIcon('list-dashes'),
 			'publicly_queryable'    => true,
-			'show_in_menu'          => false,
+			'show_in_menu'          => true,
 			'show_in_admin_bar'     => false,
 			'has_archive'           => true,
 			'hierarchical'			=> true,
@@ -88,25 +88,25 @@
 		if (!$directories) {
 			$directories = [];
 			//content
-			if(Features::anyContentHas('show_directory')) {
-				foreach (JVB_CONTENT as $key => $config) {
-					if (Features::forContent($key)->has('show_directory')) {
-						$directories[$key] = 'content';
-					}
+
+			$content = Registrar::getFeatured('show_directory', 'post');
+			if(!empty($content)) {
+				foreach ($content as $key) {
+					$directories[$key] = 'content';
 				}
 			}
-			if(Features::anyTaxonomyHas('show_directory')) {
-				foreach (JVB_TAXONOMY as $key=>$config) {
-					if (Features::forTaxonomy($key)->has('show_directory')) {
-						$directories[$key] = 'taxonomy';
-					}
+
+			$taxonomies = Registrar::getFeatured('show_directory', 'term');
+			if(!empty($taxonomies)) {
+				foreach ($taxonomies as $key) {
+					$directories[$key] = 'taxonomy';
 				}
 			}
-			if (Features::anyUserHas('show_directory')) {
-				foreach(JVB_USER as $key=>$config) {
-					if (Features::forUser($key)->has('show_directory')) {
-						$directories[$key] = 'user';
-					}
+
+			$users = Registrar::getFeatured('show_directory', 'user');
+			if(!empty($users)) {
+				foreach ($users as $key) {
+					$directories[$key] = 'user';
 				}
 			}
 
@@ -114,33 +114,28 @@
 		}
 		return $directories;
 	}
-	protected function getConfigFromType(string $type):array
-	{
-		if (!array_key_exists($type, $this->directories)) {
-			return [];
-		}
-		return match ($this->directories[$type]) {
-			'content' => JVB_CONTENT[$type],
-			'taxonomy' => JVB_TAXONOMY[$type],
-			'user' => JVB_USER[$type],
-			default => [],
-		};
 
-	}
-
-    public function activate()
+    public function activate():void
     {
-		$this->registerDirectories();
+//		$tmp = new self();
+//		$this->registerDirectories();
 
         $created = [];
         $directories = [];
-
+		$this->getDirectories();
 		foreach($this->directories as $directory => $type) {
-			$config = $this->getConfigFromType($directory);
-			$title = $this->directoryTitle($config);
+			$registrar = Registrar::getInstance($directory);
+			if (!$registrar){
+				error_log('Could not find registrar for making directory for '.$directory);
+				continue;
+			}
+
+			$config = $registrar->getConfig('directory');
+
+			$title = $config['title'];
 			$excerpt = implode(' ', $config['description']??[]);
 			$ID = wp_insert_post([
-				'post_type'	=> BASE.'directory',
+				'post_type'		=> BASE.'directory',
 				'post_title'	=> $title,
 				'post_status'	=> 'publish',
 				'post_excerpt'	=> $excerpt,
@@ -162,13 +157,7 @@
 					'extra'    => $config[$directory]['directory_extra'] ??[],
 				];
 			}
-			$isGrouped = match ($type) {
-				'content' => Features::forContent($directory)->has('isGrouped'),
-				'taxonomy' => Features::forTaxonomy($directory)->has('isGrouped'),
-				'user' => Features::forUser($directory)->has('isGrouped'),
-				default => false,
-			};
-			if ($isGrouped) {
+			if ($config['isGrouped']) {
 				$title = $title.', but Grouped';
 				$slug = sanitize_title($title).'-grouped';
 				$excerpt = $config['groupedDescription']??'Too many options? This is grouped by type.';
@@ -198,7 +187,7 @@
 			}
 		}
 
-//        if (Features::forSite()->has('has_map')) {
+//        if (Site::has('has_map')) {
 //            $ID = wp_insert_post([
 //                'post_type'     => BASE.'directory',
 //                'post_title'    => 'Map',
@@ -227,6 +216,35 @@
         }
     }
 
+	protected function buildDirectoryList():array
+	{
+		$saved = get_option(BASE.'directory_list', []);
+		if (empty($saved)) {
+			$all = new WP_Query([
+				'post_type'	=> BASE.'directory',
+				'post_status'	=> 'publish',
+				'posts_per_page'	=> -1,
+			]);
+			foreach($all->posts as $post) {
+				$config = Registrar::getInstance($post->post_name)->getConfig('directory')??false;
+
+				$saved[$post->post_name] = [
+					'slug'	=> $post->post_name,
+					'title'	=> $post->post_title,
+					'ID'	=> $post->ID,
+					'url'	=> get_the_permalink($post->ID),
+					'page'	=> $post->post_title,
+					'description'	=> ($config) ?$config['description'] :'',
+					'type'	=> get_post_meta($post->ID, self::$type,true),
+					'extra'	=> ($config) ?$config['directory_extra'] : [],
+				];
+			}
+			update_option(BASE.'directory_list', $saved);
+			wp_reset_postdata();
+		}
+		return $saved;
+	}
+
 	public function getDirectoryPageIDs():array
 	{
 		if (empty($this->directoryPageIDs)) {
@@ -237,21 +255,15 @@
 	public function getDirectoryList():array
 	{
 		if (empty($this->directoryList)) {
-			$this->directoryList = get_option(BASE.'directory_list', []);
+			$this->directoryList = $this->buildDirectoryList();
 		}
 		return $this->directoryList;
 	}
 
-    public static function getConfig(int $ID):array
+    public static function getConfig(int $ID):Registrar|false
     {
-        $type = get_post_meta($ID, self::$type, true);
         $slug = get_post_meta($ID, self::$slug, true);
-		return match ($type) {
-			'content' => JVB_CONTENT[$slug],
-			'taxonomy' => JVB_TAXONOMY[$slug],
-			'user' => JVB_USER[$slug],
-			default => [],
-		};
+		return Registrar::getInstance($slug);
 	}
 
     public function letters():array
@@ -315,7 +327,7 @@
 
 	public function directories(string $search = 'all'):array
 	{
-		$directories = $this->getDirectories();
+		$directories = $this->getDirectoryList();
 		if ($search === 'all') {
 			return $directories;
 		}
@@ -337,11 +349,11 @@
                 <p>You like lists? We\'ve got \'em!</p>
                 <ul class="directories">';
 				foreach ($this->directoryList as $slug => $directory) {
-					$config = $this->getConfigFromType($slug);
+					$config = Registrar::getInstance($slug);
 					$aOpen = '<a href="'.$directory['url'].'" title="See our list of '.$directory['title'].'">';
 					$aClose = '</a>';
 					$cache .= '<li class="directory col start">
-						'. $aOpen.jvbIcon(array_key_exists('icon', $config) ? $config['icon']:'list-dashes').$directory['title'].$aClose;
+						'. $aOpen.jvbIcon($config->getIcon() !== '' ? $config->getIcon() :'list-dashes').$directory['title'].$aClose;
 					if (!empty($directory['description'])) {
 						$cache .= '<div class="description">';
 						foreach ($directory['description'] as $description) {
@@ -365,8 +377,8 @@
 				$cache = '<nav class="directory condensed"><ul>';
 				foreach ($this->getDirectoryList() as $slug => $directory) {
 					$actualSlug = str_replace('-grouped', '', $slug);
-					$config = $this->getConfigFromType($actualSlug);
-					$icon = jvbIcon($config['icon']??'');
+					$config = Registrar::getInstance($actualSlug);
+					$icon = $config->getIcon() !== '' ? jvbIcon($config->getIcon()) : '';
 					$cache .= '<li id="'.$slug.'">
                     <a href="'.$directory['url'].'" class="'.$actualSlug.'">'.
 						$icon.$directory['title'].'
@@ -394,7 +406,8 @@
 	}
 
 	$type = $this->directories[$slug];
-	$config = $this->getConfigFromType($slug);
+	$registrar = Registrar::getInstance($slug);
+	$config = $registrar->getConfig('directory');
 
 	$paged = isset($_GET['page']) ? max(1, (int)$_GET['page']) : 1;
 
@@ -402,10 +415,10 @@
 
 	return $this->cache->remember(
 		$cacheKey,
-		function() use ($slug, $type, $config, $paged) {
-			$out = '<h1>' . $this->directoryTitle($config) . '</h1>';
+		function() use ($slug, $type, $registrar, $config, $paged) {
+			$out = '<h1>' . $this->directoryTitle($registrar) . '</h1>';
 			$out .= '<div class="description">';
-			foreach ($config[$slug]['description'] ?? [] as $p) {
+			foreach ($config['description'] ?? [] as $p) {
 				$out .= '<p>' . $p . '</p>';
 			}
 			$out .= '</div>';
@@ -424,13 +437,14 @@
 						'order' => 'ASC'
 					];
 
-					if (Features::forContent($slug)->has('is_timeline')) {
+
+					if ($registrar->hasFeature('is_timeline')) {
 						$args['post_parent'] = 0;
 					}
 
 					$get = new WP_Query($args);
 
-						$hasExtra = Features::forContent($slug)->has('directory_extra');
+						$hasExtra = $registrar->hasFeature('directory_extra');
 						if ($get->have_posts()) {
 							while ( $get->have_posts() ) {
 								$get->the_post();
@@ -671,6 +685,7 @@
             return $content;
         }
 
+		error_log('Still working on directory manager...');
         // For archive page
         if (is_post_type_archive(BASE.'directory') && $block['blockName'] === 'core/group') {
             return ($block['attrs']['tagName']??'' === 'main') ? '<main>'.$this->renderArchive().'</main>' : $content;
@@ -689,17 +704,15 @@
         return $content;
     }
 
-	protected function directoryTitle(array $config):string
+	protected function directoryTitle(Registrar $registrar):string
 	{
-		return array_key_exists('directory', $config) ? $config['directory'] : $config['plural'];
+		$config = $registrar->getConfig('directory');
+		return $config['title']?: $registrar->getPlural();
 	}
 
 	public function referAs($plural = false):string
 	{
-		if (!empty(JVB_SITE) && array_key_exists('directory_label', JVB_SITE)) {
-			return ($plural) ? JVB_SITE['directory_label'][1] : JVB_SITE['directory_label'][0];
-		}
-		return ($plural) ? 'Directories' : 'Directory';
+		return ($plural) ? Site::getDirectoryPlural()??'Directories' : Site::getDirectorySingular()??'Directory';
 	}
 
 	/*****************************************************
@@ -800,14 +813,14 @@
 			$slug . '_letter_page_map',
 			function() use ($type, $slug) {
 				$titles = [];
-
+				$registrar = Registrar::getInstance($slug);
 				switch ($type) {
 					case 'content':
 						global $wpdb;
 						$post_type = jvbCheckBase($slug);
 
 						$where = $wpdb->prepare("post_type = %s AND post_status = 'publish'", $post_type);
-						if (Features::forContent($slug)->has('is_timeline')) {
+						if ($registrar && $registrar->hasFeature('is_timeline')) {
 							$where .= " AND post_parent = 0";
 						}
 

--
Gitblit v1.10.0