From a9b3b28d001941921aa70d37fdc87c758a163a44 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Fri, 05 Jun 2026 16:47:03 +0000
Subject: [PATCH] =Some hefty changes to FeedBlock. Transitioning to loading first page in php to save on extra requests. Got a bit to do yet, but I have to work on Northeh for a bit here.

---
 inc/managers/DirectoryManager.php |   76 ++++++++++++++++++++++++++------------
 1 files changed, 52 insertions(+), 24 deletions(-)

diff --git a/inc/managers/DirectoryManager.php b/inc/managers/DirectoryManager.php
index f336d60..4645f97 100644
--- a/inc/managers/DirectoryManager.php
+++ b/inc/managers/DirectoryManager.php
@@ -6,6 +6,7 @@
 }
 
 use JVBase\registrar\Registrar;
+use JVBase\base\Site;
 use WP_Block;
 use WP_Query;
 
@@ -37,14 +38,14 @@
 
 		jvb_register_do_once('buildDirectories', [$this, 'activate']);
 		add_action('init', [$this, 'registerDirectories']);
-        add_action('render_block', [$this, 'renderBlock'], 998, 3);
+        add_filter('pre_render_block', [$this, 'renderBlock'], 20, 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 = Site::getDirectorySingular()??'Directory';
+		$plural = Site::getDirectoryPlural()??'Directories';
 		$config = [
 			'labels'	=> [
 				'name'               => $plural,
@@ -84,6 +85,7 @@
 	public function getDirectories():array
 	{
 		$directories = get_option(BASE.'directories');
+
 		if (!$directories) {
 			$directories = [];
 			//content
@@ -130,15 +132,36 @@
 			}
 
 			$config = $registrar->getConfig('directory');
-
 			$title = $config['title'];
+			//Bail early if we've already created the page
+			$existing = new WP_Query([
+				'post_type'	=> BASE.'directory',
+				'name'	=> sanitize_title($title),
+				'posts_per_page'	=> 1,
+			]);
+			if ($existing->have_posts()) {
+				$existing = $existing->posts[0];
+				$created[$directory] = $existing->ID;
+				$directories[$directory] = [
+					'slug'	=> $existing->post_name,
+					'title'	=> $existing->post_title,
+					'ID'	=> $existing->ID,
+					'url'	=> get_the_permalink($existing->ID),
+					'page'	=> $existing->post_title,
+					'description'=> $existing->post_excerpt,
+					'type'	=> $type,
+					'extra'	=> $config[$directory]['directory_extra']??[],
+				];
+				continue;
+			}
+
 			$excerpt = implode(' ', $config['description']??[]);
 			$ID = wp_insert_post([
 				'post_type'		=> BASE.'directory',
 				'post_title'	=> $title,
 				'post_status'	=> 'publish',
 				'post_excerpt'	=> $excerpt,
-				'slug'			=> sanitize_title($title)
+				'post_name'			=> sanitize_title($title)
 			]);
 			if (!is_wp_error($ID)) {
 				add_post_meta($ID, self::$type, $type);
@@ -186,7 +209,7 @@
 			}
 		}
 
-//        if (Features::forSite()->has('has_map')) {
+//        if (Site::has('has_map')) {
 //            $ID = wp_insert_post([
 //                'post_type'     => BASE.'directory',
 //                'post_title'    => 'Map',
@@ -206,7 +229,6 @@
 //                ];
 //            }
 //        }
-
         if (!empty($created)) {
             update_option(BASE.'directory_ids', $created);
         }
@@ -218,6 +240,7 @@
 	protected function buildDirectoryList():array
 	{
 		$saved = get_option(BASE.'directory_list', []);
+
 		if (empty($saved)) {
 			$all = new WP_Query([
 				'post_type'	=> BASE.'directory',
@@ -302,7 +325,7 @@
         string $name = '',
         string $url = '',
         string $ID = '',
-        $extra = false
+        ?array $extra = null
     ):array {
         if ($name == '') {
             $name = get_the_title();
@@ -351,7 +374,7 @@
 					$config = Registrar::getInstance($slug);
 					$aOpen = '<a href="'.$directory['url'].'" title="See our list of '.$directory['title'].'">';
 					$aClose = '</a>';
-					$cache .= '<li class="directory col start">
+					$cache .= '<li class="directory col left">
 						'. $aOpen.jvbIcon($config->getIcon() !== '' ? $config->getIcon() :'list-dashes').$directory['title'].$aClose;
 					if (!empty($directory['description'])) {
 						$cache .= '<div class="description">';
@@ -390,7 +413,7 @@
 		);
         if ($current !== '' && array_key_exists($current, $this->directories())) {
             $open = ($open) ? ' open' : '';
-            $cache = '<details'.$open.'><summary class="row btw">Other '.$this->referAs(true).':</summary>'.
+            $cache = '<details'.$open.'><summary class="row x-btw">Other '.$this->referAs(true).':</summary>'.
                      str_replace('id="'.$current.'"', 'id="'.$current.'" class="current"', $cache)
                      .'</details>';
         }
@@ -415,12 +438,20 @@
 	return $this->cache->remember(
 		$cacheKey,
 		function() use ($slug, $type, $registrar, $config, $paged) {
-			$out = '<h1>' . $this->directoryTitle($registrar) . '</h1>';
+
+			$out = '<h1>' . $config['title'] . '</h1>';
 			$out .= '<div class="description">';
 			foreach ($config['description'] ?? [] as $p) {
 				$out .= '<p>' . $p . '</p>';
 			}
 			$out .= '</div>';
+			$link = match($registrar->getType()) {
+				'post'	=> get_post_type_archive_link($registrar->getBased()),
+				'term'	=> false,
+				'user'	=> get_post_type_archive_link($registrar->getProfile()->getBased()),
+				default => false,
+			};
+			$out .= $link ? '<ul class="buttons"><li><a href="'.$link.'">See All</a></li></ul>' : '';
 			$out .= $this->renderIndex($slug);
 
 			$list = [];
@@ -443,7 +474,7 @@
 
 					$get = new WP_Query($args);
 
-						$hasExtra = $registrar->hasFeature('directory_extra');
+						$hasExtra = !empty($config['directory_extra']??[]);
 						if ($get->have_posts()) {
 							while ( $get->have_posts() ) {
 								$get->the_post();
@@ -591,7 +622,7 @@
 			$children =$this->renderListChunk($taxonomy, $term->term_id);
 			$out .= '<li>';
 			if ($children !== '') {
-				$out .= '<details class="term"><summary class="row btw"><a href="'.get_term_link($term->term_id, $term->taxonomy).'" title="See more '.html_entity_decode($term->name).'">'.$term->name.'</a></summary>';
+				$out .= '<details class="term"><summary class="row x-btw"><a href="'.get_term_link($term->term_id, $term->taxonomy).'" title="See more '.html_entity_decode($term->name).'">'.$term->name.'</a></summary>';
 				$out .= $children;
 				$out .= '</details>';
 			} else {
@@ -646,22 +677,23 @@
 
         $out = '<ul class="list-none">';
         foreach ($list as $letter => $items) {
-            $out .= '<li id="starts-with-'.$letter.'" class="row a-start btw nowrap"><h3>'.strtoupper($letter).'</h3><ul>';
+            $out .= '<li id="starts-with-'.$letter.'" class="row top x-btw nowrap"><h3>'.strtoupper($letter).'</h3><ul>';
             foreach ($items as $item) {
                 $extra = '';
                 if (!empty($item['extra'])) {
-                    $extra = '<span>';
+                    $extra = '<ul class="term-list row">';
                     foreach ($item['extra'] as $ext) {
+						$icon = Registrar::getInstance($ext['type'])->getIcon();
                         $umamiType = ($ext['type'] === BASE.'shop') ? 'click_shop' : 'click_taxonomy';
-                        $extra .= '<a href="'.$ext['url'].'"'.$umami->trackContentClick($item['id'],$umamiType, ['source_type' => 'directory']).'>'.$ext['name'].'</a>';
+                        $extra .= '<li><a href="'.$ext['url'].'"'.$umami->trackContentClick($item['id'],$umamiType, ['source_type' => 'directory']).'>'.jvbIcon($icon).$ext['name'].'</a></li>';
                     }
-                    $extra .= '</span>';
+                    $extra .= '</ul>';
                 }
 
 				$item_html = apply_filters('jvb_directory_render_item', '', $item, $type, $extra);
 
 				if (empty($item_html)) {
-					$item_html = '<li class="row btw">
+					$item_html = '<li class="row x-btw">
                     <a href="'.$item['url'].'" title="More about '.$item['name'].'">
                         '.$item['name'].'</a>'.$extra.'
                 </li>';
@@ -675,7 +707,7 @@
         return $out;
     }
 
-    public function renderBlock(string $content, array $block, WP_Block $instance)
+    public function renderBlock(?string $content, array $block, ?WP_Block $instance)
     {
         if (!is_post_type_archive(BASE.'directory') && !is_singular(BASE.'directory')) {
             return $content;
@@ -684,7 +716,6 @@
             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;
@@ -711,10 +742,7 @@
 
 	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';
 	}
 
 	/*****************************************************

--
Gitblit v1.10.0