private function buildRecurringSection(PhabricatorCalendarEvent $event)
 {
     $viewer = $this->getViewer();
     if (!$event->getIsRecurring()) {
         return null;
     }
     $properties = id(new PHUIPropertyListView())->setUser($viewer);
     $is_parent = $event->isParentEvent();
     if ($is_parent) {
         $parent_link = null;
     } else {
         $parent = $event->getParentEvent();
         $parent_link = $viewer->renderHandle($parent->getPHID())->render();
     }
     $rule = $event->getFrequencyRule();
     switch ($rule) {
         case PhabricatorCalendarEvent::FREQUENCY_DAILY:
             if ($is_parent) {
                 $message = pht('This event repeats every day.');
             } else {
                 $message = pht('This event is an instance of %s, and repeats every day.', $parent_link);
             }
             break;
         case PhabricatorCalendarEvent::FREQUENCY_WEEKLY:
             if ($is_parent) {
                 $message = pht('This event repeats every week.');
             } else {
                 $message = pht('This event is an instance of %s, and repeats every week.', $parent_link);
             }
             break;
         case PhabricatorCalendarEvent::FREQUENCY_MONTHLY:
             if ($is_parent) {
                 $message = pht('This event repeats every month.');
             } else {
                 $message = pht('This event is an instance of %s, and repeats every month.', $parent_link);
             }
             break;
         case PhabricatorCalendarEvent::FREQUENCY_YEARLY:
             if ($is_parent) {
                 $message = pht('This event repeats every year.');
             } else {
                 $message = pht('This event is an instance of %s, and repeats every year.', $parent_link);
             }
             break;
     }
     $properties->addProperty(pht('Event Series'), $message);
     return $properties;
 }
 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;
 }