private function materializeStub(PhabricatorCalendarEvent $event)
 {
     if (!$event->getIsStub()) {
         throw new Exception(pht('Can not materialize an event stub: this event is not a stub.'));
     }
     $actor = $this->getActor();
     $invitees = $event->getInvitees();
     $event->copyFromParent($actor);
     $event->setIsStub(0);
     $event->openTransaction();
     $event->save();
     foreach ($invitees as $invitee) {
         $invitee->setEventPHID($event->getPHID())->save();
     }
     $event->saveTransaction();
     $event->attachInvitees($invitees);
 }
 private function buildPropertySection(PhabricatorCalendarEvent $event)
 {
     $viewer = $this->getViewer();
     $properties = id(new PHUIPropertyListView())->setUser($viewer);
     $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();
     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;
 }
 private function buildPropertySection(PhabricatorCalendarEvent $event)
 {
     $viewer = $this->getViewer();
     $properties = id(new PHUIPropertyListView())->setUser($viewer);
     $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');
         $viewer_phid = $viewer->getPHID();
         $is_rsvp_invited = $event->isRSVPInvited($viewer_phid);
         $type_user = PhabricatorPeopleUserPHIDType::TYPECONST;
         $head = array();
         $tail = array();
         foreach ($invitees as $invitee) {
             $item = new PHUIStatusItemView();
             $invitee_phid = $invitee->getInviteePHID();
             $status = $invitee->getStatus();
             $target = $viewer->renderHandle($invitee_phid);
             $is_user = phid_get_type($invitee_phid) == $type_user;
             if (!$is_user) {
                 $icon = 'fa-users';
                 $icon_color = 'blue';
             } else {
                 $icon = $icon_map[$status];
                 $icon_color = $icon_color_map[$status];
             }
             // Highlight invited groups which you're a member of if you have
             // not RSVP'd to an event yet.
             if ($is_rsvp_invited) {
                 if ($invitee_phid != $viewer_phid) {
                     if ($event->hasRSVPAuthority($viewer_phid, $invitee_phid)) {
                         $item->setHighlighted(true);
                     }
                 }
             }
             $item->setIcon($icon, $icon_color)->setTarget($target);
             if ($is_user) {
                 $tail[] = $item;
             } else {
                 $head[] = $item;
             }
         }
         foreach (array_merge($head, $tail) as $item) {
             $invitee_list->addItem($item);
         }
     } else {
         $invitee_list = phutil_tag('em', array(), pht('None'));
     }
     if ($event->isImportedEvent()) {
         $properties->addProperty(pht('Imported By'), pht('%s from %s', $viewer->renderHandle($event->getImportAuthorPHID()), $viewer->renderHandle($event->getImportSourcePHID())));
     }
     $properties->addProperty(pht('Invitees'), $invitee_list);
     $properties->invokeWillRenderEvent();
     return $properties;
 }