Jake Vanderwerf
2026-01-11 474109a5df0a06f5343ab184838fe2d80e3872a8
inc/ui/CRUDSkeleton.php
@@ -36,7 +36,7 @@
   protected string $dataType = '';
   protected string $singular = '';
   protected string $plural = '';
   protected string $icon = 'triangle';
   protected string $icon;
   // Capabilities
   protected array $caps = [];
@@ -134,6 +134,7 @@
   protected array $additionalClasses = [];
   public function __construct() {
      $this->icon = jvbDefaultIcon();
      $this->user = wp_get_current_user();
      $this->user_id = $this->user->ID;
   }
@@ -229,6 +230,20 @@
      return $this;
   }
   protected function taxConfig(string $taxonomy, string $label = ''):array
   {
      $isVerified = jvbUserIsVerified();
      $label = ($label === '') ? JVB_TAXONOMY[$taxonomy]['plural'] : $label;
      return [
         'type'      => 'taxonomy',
         'label'     => $label,
         'taxonomy'  => $taxonomy,
         'createNew' => $isVerified,
         'multiple'  => true,
         'mode'      => 'append',
      ];
   }
   public function addSearch():self
   {
      $this->hasSearch = true;
@@ -589,17 +604,19 @@
   protected function renderContent(): void {
      $dataIgnore = $this->useCRUDjs ? '' : ' data-ignore';
      ?>
      <section class="items-list <?= esc_attr($this->dataType) ?> crud" data-content="<?= esc_attr($this->dataType) ?>" data-view="<?= $this->defaultView?>"<?=$dataIgnore?>>
         <?php
         $this->renderControlsAndFilters();
      <section class="items-list <?= esc_attr($this->dataType) ?> crud" data-content="<?= esc_attr($this->dataType) ?>" data-singular="<?=$this->singular?>" data-plural="<?=$this->plural?>" data-view="<?= $this->defaultView?>"<?=$dataIgnore?>>
         <div class="wrap">
            <?php
            $this->renderControlsAndFilters();
         if ($this->showBulkControls) {
            $this->renderBulkActions();
         }
         ?>
            if ($this->showBulkControls) {
               $this->renderBulkActions();
            }
            ?>
         <div class="<?= esc_attr($this->dataType) ?> item-grid" role="grid"></div>
         <div class="scroll-sentinel" aria-hidden="true"></div>
            <div class="<?= esc_attr($this->dataType) ?> item-grid" role="grid"></div>
            <div class="scroll-sentinel" aria-hidden="true"></div>
         </div>
      </section>
      <?php
   }
@@ -613,7 +630,7 @@
      }
      ?>
      <details class="all-filters col start" data-ignore>
         <summary>Filters</summary>
         <summary>Filters <button hidden data-action="clear-filters" data-ignore><?=jvbIcon('x')?><span>Clear Filters</span></span></button></summary>
         <?php
         $this->renderSearch();
@@ -625,6 +642,7 @@
            $this->renderColumnSelector();
         }
         ?>
         <button data-action="refresh" data-ignore><?=jvbIcon('arrows-clockwise')?><span>Hard Refresh</span></span></button>
      </details>
      <?php
   }
@@ -732,8 +750,11 @@
               $i = 0;
               foreach ($option as $opt => $label) {
                  $icon = $opt === 'date' ? 'calendar' : $opt;
                  $value = $opt;
                  $value = ($value === 'sort-ascending') ? 'asc' : $value;
                  $value = ($value === 'sort-descending') ? 'desc' : $value;
                  ?>
                  <input id="<?=$opt?>" class="btn" type="radio" name="<?=$o?>" data-filter="<?=$o?>" value="<?=$opt?>"<?=$i===0 ? ' checked':''?>>
                  <input id="<?=$opt?>" class="btn" type="radio" name="<?=$o?>" data-filter="<?=$o?>" value="<?=$value?>"<?=$i===0 ? ' checked':''?>>
                  <label for="<?=$opt?>" title="<?=$label?>"><?=jvbDashIcon($icon)?></label>
                  <?php
@@ -807,11 +828,11 @@
               <label for="date-start" class="col">
                  From
               </label>
               <input type="date" id="date-start" class="date-start">
               <input type="date" id="date-start" class="date-start" name="date-start">
               <label for="date-end" class="col">
                  To
               </label>
               <input type="date" id="date-end" class="date-end">
               <input type="date" id="date-end" class="date-end" name="date-end">
            </div>
            <div class="month-picker">
               <label>
@@ -855,7 +876,7 @@
      $out = '';
      if (!empty($terms)) {
         $out .= sprintf(
            '<div class="row nowrap"><label for="filter-%s">%s<span class="screen-reader-text">Filter by %s</span></label>
            '<div class="row nowrap"><label class="m-0" for="filter-%s">%s<span class="screen-reader-text">Filter by %s</span></label>
                <select id="filter-%s" class="filter %s" name="%s" data-filter="taxonomies" data-taxonomy="%s">
                <option value="">by %s</option>',
            $taxonomy,
@@ -971,7 +992,7 @@
            }
            foreach ($this->taxonomies as $taxonomy => $config) {
               ?>
               <option value="tax-<?=$taxonomy?>">Add to <?= JVB_TAXONOMY[$taxonomy]['singular']??$config['label'] ?></option>
               <option value="tax-<?=$taxonomy?>" data-type="selector" data-single="<?=JVB_TAXONOMY[$taxonomy]['singular']?>" data-plural="<?=JVB_TAXONOMY[$taxonomy]['plural']?>" data-taxonomy="<?=$taxonomy?>">Add to <?= JVB_TAXONOMY[$taxonomy]['singular']??$config['label'] ?></option>
               <?php
            }
            ?>
@@ -1037,7 +1058,6 @@
         $temp = array_filter($this->fields, function ($field) {
            return in_array($field, $this->timelineUniqueFields);
         }, ARRAY_FILTER_USE_KEY);
         jvbDump($temp);
         $form = new MetaForm();
         echo '<template class="timelineItem">';
         $form->renderImagePreview(null,['fields' => $temp]);
@@ -1155,11 +1175,11 @@
            <?= $this->renderItemSelect()?>
            <?=$this->renderImage() ?>
            <div class="col start w-full">
               <?= $this->renderItemActions()?>
               <h3 data-field="post_title"></h3>
               <p data-attr="date"></p>
               <p data-field="price"></p>
               <div data-field="post_excerpt"></div>
               <?= $this->renderItemActions()?>
            </div>
         </div>
      </template>
@@ -1585,7 +1605,6 @@
               $temp = array_filter($fields, function ($field) {
                  return in_array($field, $this->timelineUniqueFields);
               }, ARRAY_FILTER_USE_KEY);
               $config = [
                  'type'      => 'gallery',
                  'subtype'   => 'timeline',
@@ -1596,6 +1615,9 @@
               $content = '';
               foreach ($fields as $slug=> $field) {
                  if (in_array($slug, $this->timelineSharedFields)) {
                     if (in_array($field['type'], ['taxonomy', 'selector'])) {
                        $field = array_merge($field, $this->taxConfig($field['taxonomy'], $field['label']));
                     }
                     $content .= $this->form->render($slug, null, $field, false, true);
                  }
               }
@@ -1611,6 +1633,9 @@
                  $section = (array_key_exists('section', $config)) ? $config['section'] : 'basic';
                  $tabs[$section]['content'] .= $this->meta->render('form', $n, $config, false, true);
               } else {
                  if (in_array($config['type'], ['taxonomy', 'selector'])) {
                     $config = array_merge($config, $this->taxConfig($config['taxonomy'], $config['label']));
                  }
                  $this->meta->render('form', $n, $config);
               }
            }
@@ -1656,17 +1681,11 @@
               <div class="taxonomies">
                  <?php
                  foreach ($this->taxonomies as $taxonomy => $config) {
                     $this->meta->render(
                        'form',
                     $this->form->renderSelectorField(
                        'bulk-edit-'.$taxonomy,
                        [
                           'type'      => 'taxonomy',
                           'label'     => $config['label'],
                           'taxonomy'  => $taxonomy,
                           'createNew' => jvbUserIsVerified(),
                           'multiple'  => true,
                           'mode'      => 'append'
                        ]
                        '',
                        $this->taxConfig($taxonomy, $config['label']),
                        'taxonomy'
                     );
                  }
                  ?>