private function buildHeaderView(PhabricatorCalendarEvent $event)
 {
     $viewer = $this->getViewer();
     $id = $event->getID();
     if ($event->getIsCancelled()) {
         $icon = 'fa-ban';
         $color = 'red';
         $status = pht('Cancelled');
     } else {
         $icon = 'fa-check';
         $color = 'bluegrey';
         $status = pht('Active');
     }
     $header = id(new PHUIHeaderView())->setUser($viewer)->setHeader($event->getName())->setStatus($icon, $color, $status)->setPolicyObject($event)->setHeaderIcon($event->getIcon());
     if ($event->isImportedEvent()) {
         $header->addTag(id(new PHUITagView())->setType(PHUITagView::TYPE_SHADE)->setName(pht('Imported'))->setIcon('fa-download')->setHref($event->getImportSource()->getURI())->setShade('orange'));
     }
     foreach ($this->buildRSVPActions($event) as $action) {
         $header->addActionLink($action);
     }
     $options = PhabricatorCalendarEventInvitee::getAvailabilityMap();
     $is_attending = $event->getIsUserAttending($viewer->getPHID());
     if ($is_attending) {
         $invitee = $event->getInviteeForPHID($viewer->getPHID());
         $selected = $invitee->getDisplayAvailability($event);
         if (!$selected) {
             $selected = PhabricatorCalendarEventInvitee::AVAILABILITY_AVAILABLE;
         }
         $selected_option = idx($options, $selected);
         $availability_select = id(new PHUIButtonView())->setTag('a')->setIcon('fa-circle ' . $selected_option['color'])->setText(pht('Availability: %s', $selected_option['name']));
         $dropdown = id(new PhabricatorActionListView())->setUser($viewer);
         foreach ($options as $key => $option) {
             $uri = "event/availability/{$id}/{$key}/";
             $uri = $this->getApplicationURI($uri);
             $dropdown->addAction(id(new PhabricatorActionView())->setName($option['name'])->setIcon('fa-circle ' . $option['color'])->setHref($uri)->setWorkflow(true));
         }
         $availability_select->setDropdownMenu($dropdown);
         $header->addActionLink($availability_select);
     }
     return $header;
 }
 private function buildActionView(PhabricatorCalendarEvent $event)
 {
     $viewer = $this->getRequest()->getUser();
     $id = $event->getID();
     $is_cancelled = $event->getIsCancelled();
     $is_attending = $event->getIsUserAttending($viewer->getPHID());
     $actions = id(new PhabricatorActionListView())->setUser($viewer)->setObject($event);
     $can_edit = PhabricatorPolicyFilter::hasCapability($viewer, $event, PhabricatorPolicyCapability::CAN_EDIT);
     $edit_label = false;
     $edit_uri = false;
     if ($event->getIsGhostEvent()) {
         $index = $event->getSequenceIndex();
         $edit_label = pht('Edit This Instance');
         $edit_uri = "event/edit/{$id}/{$index}/";
     } else {
         if ($event->getIsRecurrenceException()) {
             $edit_label = pht('Edit This Instance');
             $edit_uri = "event/edit/{$id}/";
         } else {
             $edit_label = pht('Edit');
             $edit_uri = "event/edit/{$id}/";
         }
     }
     if ($edit_label && $edit_uri) {
         $actions->addAction(id(new PhabricatorActionView())->setName($edit_label)->setIcon('fa-pencil')->setHref($this->getApplicationURI($edit_uri))->setDisabled(!$can_edit)->setWorkflow(!$can_edit));
     }
     if ($is_attending) {
         $actions->addAction(id(new PhabricatorActionView())->setName(pht('Decline Event'))->setIcon('fa-user-times')->setHref($this->getApplicationURI("event/join/{$id}/"))->setWorkflow(true));
     } else {
         $actions->addAction(id(new PhabricatorActionView())->setName(pht('Join Event'))->setIcon('fa-user-plus')->setHref($this->getApplicationURI("event/join/{$id}/"))->setWorkflow(true));
     }
     $cancel_uri = $this->getApplicationURI("event/cancel/{$id}/");
     if ($event->getIsGhostEvent()) {
         $index = $event->getSequenceIndex();
         $can_reinstate = $event->getIsParentCancelled();
         $cancel_label = pht('Cancel This Instance');
         $reinstate_label = pht('Reinstate This Instance');
         $cancel_disabled = !$can_edit || $can_reinstate;
         $cancel_uri = $this->getApplicationURI("event/cancel/{$id}/{$index}/");
     } else {
         if ($event->getIsRecurrenceException()) {
             $can_reinstate = $event->getIsParentCancelled();
             $cancel_label = pht('Cancel This Instance');
             $reinstate_label = pht('Reinstate This Instance');
             $cancel_disabled = !$can_edit || $can_reinstate;
         } else {
             if ($event->getIsRecurrenceParent()) {
                 $cancel_label = pht('Cancel Recurrence');
                 $reinstate_label = pht('Reinstate Recurrence');
                 $cancel_disabled = !$can_edit;
             } else {
                 $cancel_label = pht('Cancel Event');
                 $reinstate_label = pht('Reinstate Event');
                 $cancel_disabled = !$can_edit;
             }
         }
     }
     if ($is_cancelled) {
         $actions->addAction(id(new PhabricatorActionView())->setName($reinstate_label)->setIcon('fa-plus')->setHref($cancel_uri)->setDisabled($cancel_disabled)->setWorkflow(true));
     } else {
         $actions->addAction(id(new PhabricatorActionView())->setName($cancel_label)->setIcon('fa-times')->setHref($cancel_uri)->setDisabled($cancel_disabled)->setWorkflow(true));
     }
     return $actions;
 }