Jake Vanderwerf
2026-03-08 c19264ac916707096fe294d996a1b7fb85206b34
inc/registrar/Fields.php
@@ -4,8 +4,10 @@
use JVBase\registrar\fields\Field;
use JVBase\registrar\fields\GroupedField;
use JVBase\registrar\fields\OptionsField;
use JVBase\registrar\fields\TaxonomyField;
use JVBase\registrar\fields\Upload;
use JVBase\registrar\fields\RepeaterField;
use JVBase\registrar\fields\TagListField;
use JVBase\registrar\fields\SelectorField;
use JVBase\registrar\fields\UploadField;
if (!defined('ABSPATH')) {
   exit;
@@ -16,6 +18,7 @@
   protected Registrar $registrar;
   public function __construct(?string $type = null, ?Registrar $registrar = null) {
      $this->registrar = $registrar;
      switch ($type) {
         case 'post':
            $this->addPostFields();
@@ -27,15 +30,16 @@
            $this->addUserFields();
            break;
      }
      $this->registrar = $registrar;
   }
   public function addField(string $name, array $config):self {
      $this->fields[$name] = match ($config['type']) {
         'upload', 'image', 'gallery'  => new Upload($name, $config),
         'upload', 'image', 'gallery'  => new UploadField($name, $config),
         'checkbox', 'radio', 'select', 'set' => new OptionsField($name, $config),
         'repeater', 'group', 'tagList' => new GroupedField($name, $config),
         'selector', 'taxonomy', 'user', 'post' => new TaxonomyField($name, $config),
         'group' => new GroupedField($name, $config),
         'repeater'  => new RepeaterField($name, $config),
         'tagList'   => new TagListField($name, $config),
         'selector', 'taxonomy', 'user', 'post' => new SelectorField($name, $config),
         default => new Field($name, $config),
      };
@@ -117,10 +121,10 @@
            'label'     => 'Description',
         ]
      ];
      if ($this->registrar->registrar->hierarchical){
      if ($this->registrar->args()['hierarchical']??false && $this->registrar->args()['hierarchical'] === true){
         $fields['parent'] = [
            'type'         => 'taxonomy',
            'taxonomy_type'   => 'reference',
            'isReference'  => true,
            'autocomplete' => true,
            'label'        => 'Term Parent'
         ];
@@ -170,4 +174,182 @@
   {
      return $this->fields;
   }
   public function addCommon(string $name):self
   {
      match ($name) {
         'wiki'      => $this->addWikiField(),
         'links'     => $this->addLinksField(),
         'contact'   => $this->addContactField(),
         'reviews', 'review'  => $this->addReviewField(),
         'alternate_name'  => $this->addAlternateName(),
         'keywords' => $this->addKeywords(),
         default => error_log('[Field]addCommon: No configuration found for '.$name.'.')
      };
      return $this;
   }
   protected function addWikiField():void
   {
      $this->addField(
         'wiki',
         [
            'type'        => 'url',
            'label'       => 'Wikipedia Page',
            'description' => 'For the schema',
            'quickEdit'   => true,
         ]
      );
   }
   protected function addLinksField():void
   {
      $this->addField(
         'links',
         [
            'type'        => 'repeater',
            'quickEdit'   => true,
            'add_label' => 'title',
            'label'       => 'Online Links',
            'description' => 'These are listed publicly on the website',
            'fields'      => [
               'url'     => [
                  'type'  => 'url',
                  'label' => 'URL',
               ],
               'title'   => [
                  'type'  => 'text',
                  'label' => 'Label',
               ],
               'tracker' => [
                  'type'        => 'text',
                  'label'       => 'Tracker',
                  'description' => 'If you are set up to track link referrals, add what comes after the ? here.',
               ],
            ],
            'section'     => 'contact'
         ]
      );
   }
   protected function addContactField():void
   {
      $this->addField(
         'admin_contact',
         [
            'type'      => 'set',
            'label'     => 'Admin Contact',
            'quickEdit' => true,
            'options'   => [
               'text'  => 'Text',
               'call'  => 'Call',
               'email' => 'Email',
               'insta' => 'Instagram',
            ],
            'section'   => 'contact'
         ]
      );
      $this->addField(
         'public_contact',
         [
            'type'      => 'set',
            'label'     => 'Public Contact',
            'quickEdit' => true,
            'options'   => [
               'text'  => 'Text',
               'call'  => 'Call',
               'email' => 'Email',
               'insta' => 'Instagram',
            ],
            'section'   => 'contact'
         ]
      );
   }
   protected function addReviewField():void
   {
      $this->addField(
         'reviews',
         [
            'type'    => 'repeater',
            'add_label' => 'name',
            'label'   => 'Reviews',
            'fields'  => [
               'name'   => [
                  'type'  => 'text',
                  'label' => 'Reviewer Name',
               ],
               'review' => [
                  'type'  => 'textarea',
                  'quill' => false,
                  'label' => 'Review',
               ],
               'rating' => [
                  'type'    => 'select',
                  'label'   => 'Rating',
                  'options' => [
                     'none' => 'Not Given',
                     '0.5'  => '0.5',
                     '1'    => '1',
                     '1.5'  => '1.5',
                     '2'    => '2',
                     '2.5'  => '2.5',
                     '3'    => '3',
                     '3.5'  => '3.5',
                     '4'    => '4',
                     '4.5'  => '4.5',
                     '5'    => '5',
                  ],
                  'default' => 'none'
               ],
               'date'   => [
                  'type'  => 'date',
                  'label' => 'Date of Review',
               ],
               'url'    => [
                  'type'  => 'url',
                  'label' => 'Link to Review (optional)',
               ],
            ],
            'section' => 'seo'
         ]
      );
   }
   protected function addAlternateName():void
   {
      $this->addField(
         'alternate_name',
         [
            'type'    => 'repeater',
            'label'   => 'Alternate Name',
            'fields'  => [
               'name' => [
                  'type'  => 'text',
                  'label' => 'Name',
               ]
            ],
            'section' => 'seo'
         ]
      );
   }
   protected function addKeywords():void
   {
      $this->addField(
         'keywords',
         [
            'type'      => 'repeater',
            'label'     => 'Keywords',
            'fields'    => [
               'keyword' => [
                  'type'  => 'text',
                  'label' => 'Keyword',
               ],
            ],
            'default'   => $labels ?? [ 'Edmonton tattoos', 'Edmonton tattoo artist', 'Edmonton tattooist' ],
            'section'   => 'seo',
            'quickEdit' => true,
         ]
      );
   }
}