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; }