protected function buildSideNavView(PhabricatorCalendarEvent $status = null)
 {
     $nav = new AphrontSideNavFilterView();
     $nav->setBaseURI(new PhutilURI($this->getApplicationURI()));
     $nav->addLabel(pht('Calendar'));
     $nav->addFilter('/', pht('My Events'));
     $nav->addFilter('all/', pht('View All'));
     $nav->addFilter('event/create/', pht('Create Event'));
     if ($status && $status->getID()) {
         $nav->addFilter('event/edit/' . $status->getID() . '/', pht('Edit Event'));
     }
     $nav->addFilter('event/', pht('Upcoming Events'));
     return $nav;
 }
 private function buildActionView(PhabricatorCalendarEvent $event)
 {
     $viewer = $this->getRequest()->getUser();
     $id = $event->getID();
     $actions = id(new PhabricatorActionListView())->setObjectURI($this->getApplicationURI('event/' . $id . '/'))->setUser($viewer);
     $can_edit = PhabricatorPolicyFilter::hasCapability($viewer, $event, PhabricatorPolicyCapability::CAN_EDIT);
     $actions->addAction(id(new PhabricatorActionView())->setName(pht('Edit Event'))->setIcon('fa-pencil')->setHref($this->getApplicationURI("event/edit/{$id}/"))->setDisabled(!$can_edit)->setWorkflow(!$can_edit));
     $actions->addAction(id(new PhabricatorActionView())->setName(pht('Cancel Event'))->setIcon('fa-times')->setHref($this->getApplicationURI("event/delete/{$id}/"))->setDisabled(!$can_edit)->setWorkflow(true));
     return $actions;
 }
 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;
 }
 private function buildRSVPActions(PhabricatorCalendarEvent $event)
 {
     $viewer = $this->getViewer();
     $id = $event->getID();
     $invite_status = $event->getUserInviteStatus($viewer->getPHID());
     $status_invited = PhabricatorCalendarEventInvitee::STATUS_INVITED;
     $is_invite_pending = $invite_status == $status_invited;
     if (!$is_invite_pending) {
         return array();
     }
     $decline_button = id(new PHUIButtonView())->setTag('a')->setIcon('fa-times grey')->setHref($this->getApplicationURI("/event/decline/{$id}/"))->setWorkflow(true)->setText(pht('Decline'));
     $accept_button = id(new PHUIButtonView())->setTag('a')->setIcon('fa-check green')->setHref($this->getApplicationURI("/event/accept/{$id}/"))->setWorkflow(true)->setText(pht('Accept'));
     return array($decline_button, $accept_button);
 }
 private function newUpdateTransactions(PhabricatorCalendarEvent $event, PhutilCalendarEventNode $node)
 {
     $xactions = array();
     $uid = $node->getUID();
     if (!$event->getID()) {
         $xactions[] = id(new PhabricatorCalendarEventTransaction())->setTransactionType(PhabricatorTransactions::TYPE_CREATE)->setNewValue(true);
     }
     $name = $node->getName();
     if (!strlen($name)) {
         if (strlen($uid)) {
             $name = pht('Unnamed Event "%s"', $uid);
         } else {
             $name = pht('Unnamed Imported Event');
         }
     }
     $xactions[] = id(new PhabricatorCalendarEventTransaction())->setTransactionType(PhabricatorCalendarEventNameTransaction::TRANSACTIONTYPE)->setNewValue($name);
     $description = $node->getDescription();
     $xactions[] = id(new PhabricatorCalendarEventTransaction())->setTransactionType(PhabricatorCalendarEventDescriptionTransaction::TRANSACTIONTYPE)->setNewValue((string) $description);
     $is_recurring = (bool) $node->getRecurrenceRule();
     $xactions[] = id(new PhabricatorCalendarEventTransaction())->setTransactionType(PhabricatorCalendarEventRecurringTransaction::TRANSACTIONTYPE)->setNewValue($is_recurring);
     return $xactions;
 }