1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-23 22:10:55 +01:00

Ability to join or decline an event

Summary: Ref T7986, Ability to join or decline an event.

Test Plan: Open Calendar event, join event, Invitee list should update. Decline event, invitee list should remove you.

Reviewers: epriestley, #blessed_reviewers

Reviewed By: epriestley, #blessed_reviewers

Subscribers: Korvin, epriestley

Maniphest Tasks: T7986

Differential Revision: https://secure.phabricator.com/D12618
This commit is contained in:
lkassianik 2015-04-29 18:18:27 -07:00
parent 8039e52ac2
commit 39e252caf5
6 changed files with 119 additions and 1 deletions

View file

@ -1488,6 +1488,7 @@ phutil_register_library_map(array(
'PhabricatorCalendarEventInvalidEpochException' => 'applications/calendar/exception/PhabricatorCalendarEventInvalidEpochException.php', 'PhabricatorCalendarEventInvalidEpochException' => 'applications/calendar/exception/PhabricatorCalendarEventInvalidEpochException.php',
'PhabricatorCalendarEventInvitee' => 'applications/calendar/storage/PhabricatorCalendarEventInvitee.php', 'PhabricatorCalendarEventInvitee' => 'applications/calendar/storage/PhabricatorCalendarEventInvitee.php',
'PhabricatorCalendarEventInviteeQuery' => 'applications/calendar/query/PhabricatorCalendarEventInviteeQuery.php', 'PhabricatorCalendarEventInviteeQuery' => 'applications/calendar/query/PhabricatorCalendarEventInviteeQuery.php',
'PhabricatorCalendarEventJoinController' => 'applications/calendar/controller/PhabricatorCalendarEventJoinController.php',
'PhabricatorCalendarEventListController' => 'applications/calendar/controller/PhabricatorCalendarEventListController.php', 'PhabricatorCalendarEventListController' => 'applications/calendar/controller/PhabricatorCalendarEventListController.php',
'PhabricatorCalendarEventPHIDType' => 'applications/calendar/phid/PhabricatorCalendarEventPHIDType.php', 'PhabricatorCalendarEventPHIDType' => 'applications/calendar/phid/PhabricatorCalendarEventPHIDType.php',
'PhabricatorCalendarEventQuery' => 'applications/calendar/query/PhabricatorCalendarEventQuery.php', 'PhabricatorCalendarEventQuery' => 'applications/calendar/query/PhabricatorCalendarEventQuery.php',
@ -4824,6 +4825,7 @@ phutil_register_library_map(array(
'PhabricatorPolicyInterface', 'PhabricatorPolicyInterface',
), ),
'PhabricatorCalendarEventInviteeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorCalendarEventInviteeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorCalendarEventJoinController' => 'PhabricatorCalendarController',
'PhabricatorCalendarEventListController' => 'PhabricatorCalendarController', 'PhabricatorCalendarEventListController' => 'PhabricatorCalendarController',
'PhabricatorCalendarEventPHIDType' => 'PhabricatorPHIDType', 'PhabricatorCalendarEventPHIDType' => 'PhabricatorPHIDType',
'PhabricatorCalendarEventQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorCalendarEventQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',

View file

@ -53,6 +53,8 @@ final class PhabricatorCalendarApplication extends PhabricatorApplication {
=> 'PhabricatorCalendarEventEditController', => 'PhabricatorCalendarEventEditController',
'cancel/(?P<id>[1-9]\d*)/' 'cancel/(?P<id>[1-9]\d*)/'
=> 'PhabricatorCalendarEventCancelController', => 'PhabricatorCalendarEventCancelController',
'join/(?P<id>[1-9]\d*)/'
=> 'PhabricatorCalendarEventJoinController',
), ),
), ),
); );

View file

@ -0,0 +1,74 @@
<?php
final class PhabricatorCalendarEventJoinController
extends PhabricatorCalendarController {
private $id;
public function handleRequest(AphrontRequest $request) {
$this->id = $request->getURIData('id');
$request = $this->getRequest();
$viewer = $request->getViewer();
$declined_status = PhabricatorCalendarEventInvitee::STATUS_DECLINED;
$attending_status = PhabricatorCalendarEventInvitee::STATUS_ATTENDING;
$event = id(new PhabricatorCalendarEventQuery())
->setViewer($viewer)
->withIDs(array($this->id))
->executeOne();
if (!$event) {
return new Aphront404Response();
}
$cancel_uri = '/E'.$event->getID();
$validation_exception = null;
$is_attending = $event->getIsUserAttending($viewer->getPHID());
if ($request->isFormPost()) {
$new_status = null;
if ($is_attending) {
$new_status = array($viewer->getPHID() => $declined_status);
} else {
$new_status = array($viewer->getPHID() => $attending_status);
}
$xaction = id(new PhabricatorCalendarEventTransaction())
->setTransactionType(
PhabricatorCalendarEventTransaction::TYPE_INVITE)
->setNewValue($new_status);
$editor = id(new PhabricatorCalendarEventEditor())
->setActor($viewer)
->setContentSourceFromRequest($request)
->setContinueOnNoEffect(true)
->setContinueOnMissingFields(true);
try {
$editor->applyTransactions($event, array($xaction));
return id(new AphrontRedirectResponse())->setURI($cancel_uri);
} catch (PhabricatorApplicationTransactionValidationException $ex) {
$validation_exception = $ex;
}
}
if (!$is_attending) {
$title = pht('Join Event');
$paragraph = pht('Would you like to join this event?');
$submit = pht('Join');
} else {
$title = pht('Decline Event');
$paragraph = pht('Would you like to decline this event?');
$submit = pht('Decline');
}
return $this->newDialog()
->setTitle($title)
->setValidationException($validation_exception)
->appendParagraph($paragraph)
->addCancelButton($cancel_uri)
->addSubmitButton($submit);
}
}

View file

@ -72,6 +72,7 @@ final class PhabricatorCalendarEventViewController
$viewer = $this->getRequest()->getUser(); $viewer = $this->getRequest()->getUser();
$id = $event->getID(); $id = $event->getID();
$is_cancelled = $event->getIsCancelled(); $is_cancelled = $event->getIsCancelled();
$is_attending = $event->getIsUserAttending($viewer->getPHID());
$actions = id(new PhabricatorActionListView()) $actions = id(new PhabricatorActionListView())
->setObjectURI($this->getApplicationURI('event/'.$id.'/')) ->setObjectURI($this->getApplicationURI('event/'.$id.'/'))
@ -91,6 +92,22 @@ final class PhabricatorCalendarEventViewController
->setDisabled(!$can_edit) ->setDisabled(!$can_edit)
->setWorkflow(!$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));
}
if ($is_cancelled) { if ($is_cancelled) {
$actions->addAction( $actions->addAction(
id(new PhabricatorActionView()) id(new PhabricatorActionView())

View file

@ -130,6 +130,27 @@ final class PhabricatorCalendarEvent extends PhabricatorCalendarDAO
return $this; return $this;
} }
public function getUserInviteStatus($phid) {
$invitees = $this->getInvitees();
$invitees = mpull($invitees, null, 'getInviteePHID');
$invited = idx($invitees, $phid);
if (!$invited) {
return PhabricatorCalendarEventInvitee::STATUS_UNINVITED;
}
$invited = $invited->getStatus();
return $invited;
}
public function getIsUserAttending($phid) {
$attending_status = PhabricatorCalendarEventInvitee::STATUS_ATTENDING;
$old_status = $this->getUserInviteStatus($phid);
$is_attending = ($old_status == $attending_status);
return $is_attending;
}
/** /**
* Validates data and throws exceptions for non-sensical status * Validates data and throws exceptions for non-sensical status
* windows * windows

View file

@ -66,9 +66,11 @@ final class PhabricatorCalendarEventTransaction
case self::TYPE_STATUS: case self::TYPE_STATUS:
case self::TYPE_DESCRIPTION: case self::TYPE_DESCRIPTION:
case self::TYPE_CANCEL: case self::TYPE_CANCEL:
case self::TYPE_INVITE:
return 'fa-pencil'; return 'fa-pencil';
break; break;
case self::TYPE_INVITE:
return 'fa-user-plus';
break;
} }
return parent::getIcon(); return parent::getIcon();
} }