private function buildRecurringHeader(PhabricatorCalendarEvent $event)
 {
     $viewer = $this->getViewer();
     if (!$event->getIsRecurring()) {
         return null;
     }
     $header = id(new PHUIHeaderView())->setHeader(pht('Recurring Event'));
     $sequence = $event->getSequenceIndex();
     if ($event->isParentEvent()) {
         $parent = $event;
     } else {
         $parent = $event->getParentEvent();
     }
     if ($parent->isValidSequenceIndex($viewer, $sequence + 1)) {
         $next_uri = $parent->getURI() . '/' . ($sequence + 1);
         $has_next = true;
     } else {
         $next_uri = null;
         $has_next = false;
     }
     if ($sequence) {
         if ($sequence > 1) {
             $previous_uri = $parent->getURI() . '/' . ($sequence - 1);
         } else {
             $previous_uri = $parent->getURI();
         }
         $has_previous = true;
     } else {
         $has_previous = false;
         $previous_uri = null;
     }
     $prev_button = id(new PHUIButtonView())->setTag('a')->setIcon('fa-chevron-left')->setHref($previous_uri)->setDisabled(!$has_previous)->setText(pht('Previous'));
     $next_button = id(new PHUIButtonView())->setTag('a')->setIcon('fa-chevron-right')->setHref($next_uri)->setDisabled(!$has_next)->setText(pht('Next'));
     $header->addActionLink($next_button)->addActionLink($prev_button);
     return $header;
 }
 private function buildPropertySection(PhabricatorCalendarEvent $event)
 {
     $viewer = $this->getViewer();
     $properties = id(new PHUIPropertyListView())->setUser($viewer);
     if ($event->getIsAllDay()) {
         $date_start = phabricator_date($event->getDateFrom(), $viewer);
         $date_end = phabricator_date($event->getDateTo(), $viewer);
         if ($date_start == $date_end) {
             $properties->addProperty(pht('Time'), phabricator_date($event->getDateFrom(), $viewer));
         } else {
             $properties->addProperty(pht('Starts'), phabricator_date($event->getDateFrom(), $viewer));
             $properties->addProperty(pht('Ends'), phabricator_date($event->getDateTo(), $viewer));
         }
     } else {
         $properties->addProperty(pht('Starts'), phabricator_datetime($event->getDateFrom(), $viewer));
         $properties->addProperty(pht('Ends'), phabricator_datetime($event->getDateTo(), $viewer));
     }
     if ($event->getIsRecurring()) {
         $properties->addProperty(pht('Recurs'), ucwords(idx($event->getRecurrenceFrequency(), 'rule')));
         if ($event->getRecurrenceEndDate()) {
             $properties->addProperty(pht('Recurrence Ends'), phabricator_datetime($event->getRecurrenceEndDate(), $viewer));
         }
         if ($event->getInstanceOfEventPHID()) {
             $properties->addProperty(pht('Recurrence of Event'), pht('%s of %s', $event->getSequenceIndex(), $viewer->renderHandle($event->getInstanceOfEventPHID())->render()));
         }
     }
     $properties->addProperty(pht('Host'), $viewer->renderHandle($event->getUserPHID()));
     $invitees = $event->getInvitees();
     foreach ($invitees as $key => $invitee) {
         if ($invitee->isUninvited()) {
             unset($invitees[$key]);
         }
     }
     if ($invitees) {
         $invitee_list = new PHUIStatusListView();
         $icon_invited = PHUIStatusItemView::ICON_OPEN;
         $icon_attending = PHUIStatusItemView::ICON_ACCEPT;
         $icon_declined = PHUIStatusItemView::ICON_REJECT;
         $status_invited = PhabricatorCalendarEventInvitee::STATUS_INVITED;
         $status_attending = PhabricatorCalendarEventInvitee::STATUS_ATTENDING;
         $status_declined = PhabricatorCalendarEventInvitee::STATUS_DECLINED;
         $icon_map = array($status_invited => $icon_invited, $status_attending => $icon_attending, $status_declined => $icon_declined);
         $icon_color_map = array($status_invited => null, $status_attending => 'green', $status_declined => 'red');
         foreach ($invitees as $invitee) {
             $item = new PHUIStatusItemView();
             $invitee_phid = $invitee->getInviteePHID();
             $status = $invitee->getStatus();
             $target = $viewer->renderHandle($invitee_phid);
             $icon = $icon_map[$status];
             $icon_color = $icon_color_map[$status];
             $item->setIcon($icon, $icon_color)->setTarget($target);
             $invitee_list->addItem($item);
         }
     } else {
         $invitee_list = phutil_tag('em', array(), pht('None'));
     }
     $properties->addProperty(pht('Invitees'), $invitee_list);
     $properties->invokeWillRenderEvent();
     $properties->addProperty(pht('Icon'), id(new PhabricatorCalendarIconSet())->getIconLabel($event->getIcon()));
     return $properties;
 }