private function buildCurtain(PhabricatorCalendarEvent $event)
 {
     $viewer = $this->getRequest()->getUser();
     $id = $event->getID();
     $is_attending = $event->getIsUserAttending($viewer->getPHID());
     $can_edit = PhabricatorPolicyFilter::hasCapability($viewer, $event, PhabricatorPolicyCapability::CAN_EDIT);
     $edit_uri = "event/edit/{$id}/";
     if ($event->isChildEvent()) {
         $edit_label = pht('Edit This Instance');
     } else {
         $edit_label = pht('Edit Event');
     }
     $curtain = $this->newCurtainView($event);
     if ($edit_label && $edit_uri) {
         $curtain->addAction(id(new PhabricatorActionView())->setName($edit_label)->setIcon('fa-pencil')->setHref($this->getApplicationURI($edit_uri))->setDisabled(!$can_edit)->setWorkflow(!$can_edit));
     }
     if ($is_attending) {
         $curtain->addAction(id(new PhabricatorActionView())->setName(pht('Decline Event'))->setIcon('fa-user-times')->setHref($this->getApplicationURI("event/join/{$id}/"))->setWorkflow(true));
     } else {
         $curtain->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}/");
     $cancel_disabled = !$can_edit;
     if ($event->isChildEvent()) {
         $cancel_label = pht('Cancel This Instance');
         $reinstate_label = pht('Reinstate This Instance');
         if ($event->getParentEvent()->getIsCancelled()) {
             $cancel_disabled = true;
         }
     } else {
         if ($event->isParentEvent()) {
             $cancel_label = pht('Cancel All');
             $reinstate_label = pht('Reinstate All');
         } else {
             $cancel_label = pht('Cancel Event');
             $reinstate_label = pht('Reinstate Event');
         }
     }
     if ($event->isCancelledEvent()) {
         $curtain->addAction(id(new PhabricatorActionView())->setName($reinstate_label)->setIcon('fa-plus')->setHref($cancel_uri)->setDisabled($cancel_disabled)->setWorkflow(true));
     } else {
         $curtain->addAction(id(new PhabricatorActionView())->setName($cancel_label)->setIcon('fa-times')->setHref($cancel_uri)->setDisabled($cancel_disabled)->setWorkflow(true));
     }
     $ics_name = $event->getICSFilename();
     $export_uri = $this->getApplicationURI("event/export/{$id}/{$ics_name}");
     $curtain->addAction(id(new PhabricatorActionView())->setName(pht('Export as .ics'))->setIcon('fa-download')->setHref($export_uri));
     return $curtain;
 }
 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;
 }