Jake Vanderwerf
2026-09-14 7935d26cd16a4f8f69a59a44e27a7263b60e54bf
inc/blocks/EventBlock.php
@@ -3,6 +3,7 @@
use DateTime;
use JVBase\helpers\Events;
use JVBase\meta\Meta;
use JVBase\utility\Image;
use WP_Block;
@@ -38,27 +39,8 @@
      $values = $meta->getAll();
      $out = '<section class="event-block">';
      $out .= '<div class="event tags row right">';
         $get = ['is_free' => 'Free', 'rsvp_required' => 'Must RSVP', 'public' => 'Private Event'];
         foreach ($get as $k => $g) {
            $check = !empty($values[$k]) && $values[$k] === '1';
            if ($k === 'public') {
               $check = !$check;
            }
            $icon = match ($k) {
               'is_free'   => jvbIcon('check-circle'),
               'rsvp_required'   => jvbIcon('envelope'),
               'public'   => jvbIcon('lock-key'),
            };
            if ($check) {
               $out .= sprintf(
                  '<div class="tag">%s%s</div>',
                  $icon,
                  $g
               );
            }
         }
      $out .= '</div>';
      $out .= Events::tags($values);
      if (!empty($values['post_thumbnail'])) {
         $out .= jvbFormatImage($values['post_thumbnail']);
      }
@@ -70,7 +52,7 @@
               $values['post_title']
            );
         }
         $out .= $this->calendarDay($values['date_start']??'');
         $out .= Events::calendarDay($values['date_start']??'');
      $out .= '</header>';
@@ -79,23 +61,24 @@
            '<ul class="time term-list row left"><li class="title">%s</li>',
            jvbIcon('clock')
         );
            $out .= $this->formatDay($values['date_start']??'', $values['time_start']??'', $values['time_end']??'');
            $out .= sprintf(
               '<li>%s</li>',
               Events::formatDay($values['date_start']??'', $values['time_start']??'', $values['time_end']??'')
            );
            foreach ($values['schedule']??[] as $date) {
               $out .= $this->formatDay($date['date'], $date['time_start'], $date['time_end'], $date['notes']);
               $out .= sprintf(
                  '<li>%s</li>',
                  Events::formatDay($date['date'], $date['time_start'], $date['time_end'], $date['notes'])
               );
            }
         $out .= '</ul>';
            $out .= $this->location($values['location']??[], $values['location_notes']??'');
            $out .= Events::location($values);
         $out .= $this->price($values['cost']??'', $values['ticket_url']??'');
         $out .= $this->participants($values['max_participants']??'');
         $get = ['city', 'event_category'];
         foreach ($get as $g) {
            if (!empty($values[$g])) {
               $out .= jvbMetaTermList($values[$g], $g);
            }
         }
         $out .= Events::terms($values);
         $out .= $this->rsvp($values['rsvp_required']??'', $values['rsvp_limit']??'', $values['rsvp_deadline']);
@@ -111,108 +94,6 @@
      jvbRenderGallery();
   }
   protected function calendarDay(string $day):string
   {
      $out = '';
      if (!empty($day)) {
         $date = new DateTime($day, wp_timezone());
         $weekday = $date->format('D');
         $num = $date->format('d');
         $month = $date->format('M');
         $out .= sprintf(
            '<div class="col calendar">
                  <span class="weekday">%s</span>
                  <span class="month">%s</span>
                  <span class="day">%d</span>
               </div>',
            $weekday,
            $month,
            $num
         );
      }
      return $out;
   }
   protected function renderLocationString(array $location):string
   {
      if (!array_key_exists('address', $location) ||
         !array_key_exists('street', $location) ||
         !array_key_exists('city', $location) ||
         !array_key_exists('province', $location) ||
         !array_key_exists('country', $location)) {
         return '';
      }
      return sprintf(
         '<p class="location">%s%s<br>%s, %s %s</p>',
         $location['address'],
         $location['street'],
         $location['city'],
         $location['province'],
         $location['country'] === 'CA' ? '' : $location['country']
      );
   }
   protected function formatDay(string $date, string $start, string $end, string $notes = ''):string
   {
      $out = '<li>';
      if (!empty($date)) {
         $out .= sprintf(
            '<time datetime="%s">%s</time><br>',
            date('c', strtotime($date)),
            date('F j, Y', strtotime($date))
         );
      }
      $doit = false;
      if (!empty($start)) {
         $doit = true;
         $d = strtotime($date.' '.$start);
         $out .= sprintf(
            '<time datetime="%s">%s</time>',
            date('c', $d),
            date('g:ia', $d)
         );
      }
      if (!empty($end)) {
         if ($doit) {
            $out .= ' - ';
         }
         $d = strtotime($date.' '.$end);
         $out .= sprintf(
            '<time datetime="%s">%s</time>',
            date('c', $d),
            date('g:ia', $d)
         );
      }
      if (!empty($notes)) {
         $out .= wpautop($notes);
      }
      $out .= '</li>';
      return $out;
   }
   protected function location(array $location, string $notes = ''):string
   {
      $out = '';
      if (!empty($location['address']??'')) {
         $out .= sprintf(
            '<ul class="location term-list row left">
               <li class="title">%sLocation</li>
               <li>%s</li>
               <li>%s</li>
               %s
               </ul>',
            jvbIcon('map-pin'),
            $this->renderLocationString($location),
            jvbLocationLinks($location),
            empty($notes) ? '' : '<li>'.$notes.'</li>',
         );
      }
      return $out;
   }
   protected function price(string $price, string $url):string
   {