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