From 32ce5c542c90be348895328078e392dde2052957 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Fri, 04 Sep 2026 19:15:16 +0000
Subject: [PATCH] =Working at adding defined fields to a dedicated panel in the gutenberg editor. Registrar now has AddCustomFields.php, which currently only supports post fields. Added a @wordpress/plugins base _meta/fields in /build and /src that successfully creates a panel. Next steps: determine sections and fields, group fields by section (each section to a panel), and save output

---
 inc/managers/InvitationsManager.php |   51 +++++++++++++++++++++++++++++++--------------------
 1 files changed, 31 insertions(+), 20 deletions(-)

diff --git a/inc/managers/InvitationsManager.php b/inc/managers/InvitationsManager.php
index c8d17a2..cc3078d 100644
--- a/inc/managers/InvitationsManager.php
+++ b/inc/managers/InvitationsManager.php
@@ -2,10 +2,14 @@
 namespace JVBase\managers;
 
 use Exception;
+use JVBase\Instance;
 use JVBase\managers\queue\executors\InvitationExecutor;
+use JVBase\managers\queue\Queue;
 use JVBase\managers\queue\TypeConfig;
 use JVBase\registrar\Registrar;
 use JVBase\base\Site;
+use JVBase\rest\Rest;
+use JVBase\rest\routes\Invitations;
 use WP_Error;
 
 if (!defined('ABSPATH')) {
@@ -14,16 +18,22 @@
 
 class InvitationsManager
 {
+	use Instance;
 	protected array $inviteConfig;
 	protected CustomTable $table;
 	protected int $expiryDays = 14;
 	protected Cache $cache;
-	public function __construct()
+	protected Rest $route;
+
+	private function __construct()
 	{
 		$this->defineTable();
 		if (!isset($this->table)) {
 			return;
 		}
+		if (Site::membership() && Site::membership()->has('can_invite')) {
+			$this->route = Invitations::getInstance();
+		}
 		$this->setInviteConfig();
 		$this->cache = Cache::for('invitations')->user();
 		add_action('init', [$this, 'registerInvitationExecutors'], 5);
@@ -36,7 +46,7 @@
 
 	public function defineTable():void
 	{
-		$terms = Registrar::getFeatured('invitable', 'term');
+		$terms = Registrar::withFeature('invitable', 'term');
 		$membership = Site::membership();
 		$roles = ($membership) ? Site::membership()->has('can_invite') :[];
 		if (empty($terms) && empty($roles)) {
@@ -118,7 +128,7 @@
 	 */
 	public function registerInvitationExecutors(): void
 	{
-		$registry = JVB()->queue()->registry();
+		$registry = Queue::getInstance()->registry();
 		$executor = new InvitationExecutor();
 
 		// Create invitations - chunked at 20
@@ -144,10 +154,12 @@
 	/**
 	 * Build invite types from JVB constants
 	 * Combines JVB_MEMBERSHIP['can_invite'] and invitable taxonomies
+	 * TODO: Should be accessible via Site::getInstance()->membership()\
+	 *
 	 */
 	protected function buildInviteTypes(): array
 	{
-		$invitable = $this->cache->remember(
+		return $this->cache->remember(
 			'invitableTypes',
 			function () {
 				$types = [];
@@ -163,9 +175,9 @@
 				}
 
 				// Term invitations from invitable content taxonomies
-				$invitable = Registrar::getFeatured('invitable', 'term');
-				$content = Registrar::getFeatured('is_content', 'term');
-				$ownable = Registrar::getFeatured('is_ownable', 'term');
+				$invitable = Registrar::withFeature('invitable', 'term');
+				$content = Registrar::withFeature('is_content', 'term');
+				$ownable = Registrar::withFeature('is_ownable', 'term');
 				$taxonomies = array_intersect($invitable, $content, $ownable);
 				if (!empty($taxonomies)) {
 					$users = Registrar::getRegistered('user');
@@ -197,7 +209,6 @@
 				return $types;
 			}
 		);
-		return $invitable;
 
 	}
 
@@ -214,7 +225,7 @@
 		}
 
 		// User must be owner or manager of the term
-		return JVB()->roles()->isManager($userID, $termID);
+		return Roles::getInstance()()->isManager($userID, $termID);
 	}
 
 	/**
@@ -381,7 +392,7 @@
 		} catch (Exception $e) {
 			$this->table->rollback();
 
-			JVB()->error()->log(
+			Errors::getInstance()->log(
 				'invitation_create',
 				'Error processing invitations: ' . $e->getMessage(),
 				['user_id' => $userID],
@@ -554,9 +565,9 @@
 		}
 		$termText = implode('', $termContent);
 
-		$button = JVB()->email()->button($signupUrl, 'Join the Scene!');
-		$link = JVB()->email()->link($signupUrl);
-		$signature = JVB()->email()->signature();
+		$button = Emails::getInstance()->button($signupUrl, 'Join the Scene!');
+		$link = Emails::getInstance()->link($signupUrl);
+		$signature = Emails::getInstance()->signature();
 
 		$message = sprintf(
 			'<p>Hi %s!</p>
@@ -593,7 +604,7 @@
 			$signature
 		);
 
-		JVB()->email()->sendEmail($email, $subject, $message);
+		Emails::getInstance()->sendEmail($email, $subject, $message);
 	}
 
 	/**
@@ -655,7 +666,7 @@
 
 			// Grant capabilities
 			$user = get_userdata($userID);
-			$user->add_cap('skip_moderation', true);
+			$user->add_cap('skip_moderation');
 
 			return true;
 		});
@@ -671,7 +682,7 @@
 		$this->notifyInvitersOfAcceptance($invitation, $userID);
 
 		// Invalidate cache
-		Cache::for('invitations')->forget('user_' . $userID);
+		$this->cache->forget('user_' . $userID);
 
 		return true;
 	}
@@ -681,7 +692,7 @@
 	 */
 	protected function processTermMembership(int $userID, object $invitation): void
 	{
-		foreach (JVB()->roles()->getInvitableTaxonomies() as $taxonomy) {
+		foreach (Roles::getInstance()()->getInvitableTaxonomies() as $taxonomy) {
 			$column = 'to_' . $taxonomy;
 			if (isset($invitation->$column) && $invitation->$column) {
 				$termID = (int) $invitation->$column;
@@ -706,7 +717,7 @@
 		$userData = get_userdata($userID);
 
 		foreach ($inviters as $inviter) {
-			JVB()->notification()->addNotification(
+			NotificationManager::getInstance()->addNotification(
 				$inviter['user_id'],
 				'invitation_accepted',
 				[
@@ -732,7 +743,7 @@
 		);
 
 		// Clear cache after cleanup
-		Cache::for('invitations')->flush();
+		$this->cache->flush();
 	}
 
 	/*****************************************************************
@@ -760,7 +771,7 @@
 			$name
 		);
 
-		JVB()->email()->sendEmail($email, $subject, $content, 'INVITATION REVOKED');
+		Emails::getInstance()->sendEmail($email, $subject, $content, 'INVITATION REVOKED');
 	}
 
 	/**

--
Gitblit v1.10.0