From 3baf3d2545ba6ece6b74a64c0def59bd0774cf54 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Wed, 10 Jun 2026 16:34:12 +0000
Subject: [PATCH] =Laid the groundwork for an improved DashboardManager.php setup. Have to put it aside so I can get the dang Northeh done though.

---
 inc/managers/SEO/render/Traits/_Properties/hasOfferCatalogTrait.php |  103 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 103 insertions(+), 0 deletions(-)

diff --git a/inc/managers/SEO/render/Traits/_Properties/hasOfferCatalogTrait.php b/inc/managers/SEO/render/Traits/_Properties/hasOfferCatalogTrait.php
index 0230b99..e7d32a7 100644
--- a/inc/managers/SEO/render/Traits/_Properties/hasOfferCatalogTrait.php
+++ b/inc/managers/SEO/render/Traits/_Properties/hasOfferCatalogTrait.php
@@ -3,6 +3,12 @@
 
 use JVBase\base\SchemaHelper;
 use JVBase\inc\managers\SEO\render\Thing\Intangible\ItemList\OfferCatalog;
+use JVBase\managers\SEO\render\Thing\Intangible\Offer;
+use JVBase\managers\SEO\render\Thing\Intangible\Service;
+use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\PriceSpecification;
+use JVBase\managers\SEO\render\Thing\Product\Product;
+use JVBase\meta\Meta;
+use JVBase\registrar\Fields;
 use JVBase\registrar\Registrar;
 
 if (!defined('ABSPATH')) {
@@ -97,4 +103,101 @@
 			]
 		];
 	}
+
+	public function setHasOfferCatalogField(Fields $fields):void
+	{
+		$fields->addField(
+			'hasOfferCatalog',
+			[
+				'type'	=> 'repeater',
+				'label'	=> 'Main Products & Services',
+				'fields'	=> [
+					'type'	=> [
+						'type'	=> 'radio',
+						'label'	=> __('Select Type', 'jvb'),
+						'options'	=> [
+							'product'	=> 'Product',
+							'service'	=> 'Service'
+						],
+						'required' => true,
+					],
+					'name'	=> [
+						'type'	=> 'text',
+						'label'	=> __('Name of Product or Service', 'jvb'),
+						'required'	=> true,
+					],
+					'description'	=> [
+						'type'	=> 'textarea',
+						'label'	=> __('Description (optional)', 'jvb'),
+					],
+					'price'	=> [
+						'type'	=> 'text',
+						'subtype'	=> 'number',
+						'label'		=> __('Price', 'jvb'),
+					],
+					'unitText' 	=> [
+						'type'	=> 'radio',
+						'label'	=> 'Price per unit',
+						'options'	=> [
+							'hour'	=> 'Hour',
+							'unit'	=> 'Unit',
+						],
+						'default'	=> 'unit',
+					]
+				],
+			]
+		);
+	}
+
+	public function formatHasOfferCatalogField(Meta $meta):void
+	{
+		$catalog = $meta->get('hasOfferCatalog');
+		if (!empty($catalog)) {
+			$offerCatalog = [];
+			$name = '';
+			$services = array_filter($catalog, function ($item) {
+				return $item['type'] === 'service';
+			});
+			$products =array_filter($catalog, function ($item) {
+				return $item['type'] === 'product';
+			});
+			if (count($products) > 0) {
+				$name = 'Products';
+				if (count($services) > 0) {
+					$name .= ' & ';
+				}
+			}
+			if (count($services) > 0) {
+				$name .= 'Services';
+			}
+			foreach ($catalog as $row) {
+				$offer = new Offer();
+
+				$item = match($row['type']) {
+					'product'	=> new Product(),
+					'service' 	=> new Service(),
+				};
+
+				$item->setName($row['name']);
+				if (!empty($row['description'])) {
+					$item->setDescription($row['description']);
+				}
+				if (!empty($row['price'])) {
+					$price = new PriceSpecification();
+					$price->setPrice($row['price']);
+					$price->setPriceCurrency('CAD');
+					$price->setUnitText($row['unitText']);
+					$offer->setPriceSpecification($price);
+				}
+				$offer->setItemOffered($item);
+				$offerCatalog[] =  $offer;
+			}
+			if (!empty(!$offerCatalog)) {
+				$final = new OfferCatalog();
+				$final->setName($name);
+				$final->setItemListElement($offerCatalog);
+				$this->sethasOfferCatalog($final);
+			}
+		}
+	}
 }

--
Gitblit v1.10.0