protected function loadPage()
 {
     $table = new PhabricatorCalendarEventInvitee();
     $conn_r = $table->establishConnection('r');
     $data = queryfx_all($conn_r, 'SELECT * FROM %T %Q %Q %Q', $table->getTableName(), $this->buildWhereClause($conn_r), $this->buildOrderClause($conn_r), $this->buildLimitClause($conn_r));
     return $table->loadAllFromArray($data);
 }
 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);
 }
 protected function getTagContent()
 {
     $viewer = $this->getViewer();
     $user = $this->getAvailableUser();
     $until = $user->getAwayUntil();
     if (!$until) {
         return pht('Available');
     }
     $const = $user->getDisplayAvailability();
     $name = PhabricatorCalendarEventInvitee::getAvailabilityName($const);
     $color = PhabricatorCalendarEventInvitee::getAvailabilityColor($const);
     $away_tag = id(new PHUITagView())->setType(PHUITagView::TYPE_SHADE)->setShade($color)->setName($name)->setDotColor($color);
     $now = PhabricatorTime::getNow();
     // Try to load the event handle. If it's invalid or the user can't see it,
     // we'll just render a generic message.
     $object_phid = $user->getAvailabilityEventPHID();
     $handle = null;
     if ($object_phid) {
         $handles = $viewer->loadHandles(array($object_phid));
         $handle = $handles[$object_phid];
         if (!$handle->isComplete() || $handle->getPolicyFiltered()) {
             $handle = null;
         }
     }
     switch ($const) {
         case PhabricatorCalendarEventInvitee::AVAILABILITY_AWAY:
             if ($handle) {
                 $description = pht('Away at %s until %s.', $handle->renderLink(), $viewer->formatShortDateTime($until, $now));
             } else {
                 $description = pht('Away until %s.', $viewer->formatShortDateTime($until, $now));
             }
             break;
         case PhabricatorCalendarEventInvitee::AVAILABILITY_BUSY:
         default:
             if ($handle) {
                 $description = pht('Busy at %s until %s.', $handle->renderLink(), $viewer->formatShortDateTime($until, $now));
             } else {
                 $description = pht('Busy until %s.', $viewer->formatShortDateTime($until, $now));
             }
             break;
     }
     return array($away_tag, ' ', $description);
 }
 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;
 }