public function handleRequest(AphrontRequest $request)
 {
     $viewer = $this->getViewer();
     $id = $request->getURIData('id');
     $event = id(new PhabricatorCalendarEventQuery())->setViewer($viewer)->withIDs(array($id))->executeOne();
     if (!$event) {
         return new Aphront404Response();
     }
     $response = $this->newImportedEventResponse($event);
     if ($response) {
         return $response;
     }
     $cancel_uri = $event->getURI();
     if (!$event->getIsUserAttending($viewer->getPHID())) {
         return $this->newDialog()->setTitle(pht('Not Attending Event'))->appendParagraph(pht('You can not change your display availability for events you ' . 'are not attending.'))->addCancelButton($cancel_uri);
     }
     // TODO: This endpoint currently only works via AJAX. It would be vaguely
     // nice to provide a plain HTML version of the workflow where we return
     // a dialog with a vanilla <select /> in it for cases where all the JS
     // breaks.
     $request->validateCSRF();
     $invitee = $event->getInviteeForPHID($viewer->getPHID());
     $map = PhabricatorCalendarEventInvitee::getAvailabilityMap();
     $new_availability = $request->getURIData('availability');
     if (isset($map[$new_availability])) {
         $invitee->setAvailability($new_availability)->save();
         // Invalidate the availability cache.
         $viewer->writeAvailabilityCache(array(), null);
     }
     return id(new AphrontRedirectResponse())->setURI($cancel_uri);
 }
 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;
 }