Add a Join / Leave button to Projects
Summary: Make it easy to join or leave (well, slightly less easy) a project. Publish join/leave to feed. Fix a couple of membership editor bugs. Test Plan: Joined, left a project. Reviewers: btrahan, jungejason Reviewed By: btrahan CC: aran, epriestley Maniphest Tasks: T681 Differential Revision: https://secure.phabricator.com/D1485
This commit is contained in:
@@ -52,7 +52,7 @@ class PhabricatorProjectProfileController
|
||||
$picture = null;
|
||||
}
|
||||
|
||||
|
||||
$members = mpull($project->loadAffiliations(), null, 'getUserPHID');
|
||||
|
||||
$nav_view = new AphrontSideNavFilterView();
|
||||
$uri = new PhutilURI('/project/view/'.$project->getID().'/');
|
||||
@@ -114,6 +114,33 @@ class PhabricatorProjectProfileController
|
||||
phutil_utf8_shorten($profile->getBlurb(), 1024));
|
||||
$header->setProfilePicture($picture);
|
||||
|
||||
$action = null;
|
||||
if (empty($members[$user->getPHID()])) {
|
||||
$action = phabricator_render_form(
|
||||
$user,
|
||||
array(
|
||||
'action' => '/project/update/'.$project->getID().'/join/',
|
||||
'method' => 'post',
|
||||
),
|
||||
phutil_render_tag(
|
||||
'button',
|
||||
array(
|
||||
'class' => 'green',
|
||||
),
|
||||
'Join Project'));
|
||||
} else {
|
||||
$action = javelin_render_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => '/project/update/'.$project->getID().'/leave/',
|
||||
'sigil' => 'workflow',
|
||||
'class' => 'grey button',
|
||||
),
|
||||
'Leave Project...');
|
||||
}
|
||||
|
||||
$header->addAction($action);
|
||||
|
||||
$header->appendChild($nav_view);
|
||||
|
||||
return $this->buildStandardPageResponse(
|
||||
|
||||
@@ -18,6 +18,7 @@ phutil_require_module('phabricator', 'applications/project/controller/base');
|
||||
phutil_require_module('phabricator', 'applications/project/storage/profile');
|
||||
phutil_require_module('phabricator', 'applications/project/storage/project');
|
||||
phutil_require_module('phabricator', 'infrastructure/celerity/api');
|
||||
phutil_require_module('phabricator', 'infrastructure/javelin/markup');
|
||||
phutil_require_module('phabricator', 'view/control/table');
|
||||
phutil_require_module('phabricator', 'view/layout/profileheader');
|
||||
phutil_require_module('phabricator', 'view/layout/sidenavfilter');
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Copyright 2012 Facebook, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
class PhabricatorProjectUpdateController
|
||||
extends PhabricatorProjectController {
|
||||
|
||||
private $id;
|
||||
private $action;
|
||||
|
||||
public function willProcessRequest(array $data) {
|
||||
$this->id = $data['id'];
|
||||
$this->action = $data['action'];
|
||||
}
|
||||
|
||||
public function processRequest() {
|
||||
$request = $this->getRequest();
|
||||
$user = $request->getUser();
|
||||
|
||||
$project = id(new PhabricatorProject())->load($this->id);
|
||||
if (!$project) {
|
||||
return new Aphront404Response();
|
||||
}
|
||||
|
||||
$process_action = false;
|
||||
switch ($this->action) {
|
||||
case 'join':
|
||||
$process_action = $request->isFormPost();
|
||||
break;
|
||||
case 'leave':
|
||||
$process_action = $request->isDialogFormPost();
|
||||
break;
|
||||
default:
|
||||
return new Aphront404Response();
|
||||
}
|
||||
|
||||
$project_uri = '/project/view/'.$project->getID().'/';
|
||||
|
||||
if ($process_action) {
|
||||
$xactions = array();
|
||||
|
||||
switch ($this->action) {
|
||||
case 'join':
|
||||
$affils = $project->loadAffiliations();
|
||||
$affils = mpull($affils, null, 'getUserPHID');
|
||||
if (empty($affils[$user->getPHID()])) {
|
||||
$affils[$user->getPHID()] = true;
|
||||
|
||||
$xaction = new PhabricatorProjectTransaction();
|
||||
$xaction->setTransactionType(
|
||||
PhabricatorProjectTransactionType::TYPE_MEMBERS);
|
||||
$xaction->setNewValue(array_keys($affils));
|
||||
$xactions[] = $xaction;
|
||||
}
|
||||
break;
|
||||
case 'leave':
|
||||
$affils = $project->loadAffiliations();
|
||||
$affils = mpull($affils, null, 'getUserPHID');
|
||||
if (isset($affils[$user->getPHID()])) {
|
||||
unset($affils[$user->getPHID()]);
|
||||
|
||||
$xaction = new PhabricatorProjectTransaction();
|
||||
$xaction->setTransactionType(
|
||||
PhabricatorProjectTransactionType::TYPE_MEMBERS);
|
||||
$xaction->setNewValue(array_keys($affils));
|
||||
$xactions[] = $xaction;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if ($xactions) {
|
||||
$editor = new PhabricatorProjectEditor($project);
|
||||
$editor->setUser($user);
|
||||
$editor->applyTransactions($xactions);
|
||||
}
|
||||
|
||||
return id(new AphrontRedirectResponse())->setURI($project_uri);
|
||||
}
|
||||
|
||||
$dialog = null;
|
||||
switch ($this->action) {
|
||||
case 'leave':
|
||||
$dialog = new AphrontDialogView();
|
||||
$dialog->setUser($user);
|
||||
$dialog->setTitle('Really leave project?');
|
||||
$dialog->appendChild(
|
||||
'<p>Your tremendous contributions to this project will be sorely '.
|
||||
'missed. Are you sure you want to leave?</p>');
|
||||
$dialog->addCancelButton($project_uri);
|
||||
$dialog->addSubmitButton('Leave Project');
|
||||
break;
|
||||
default:
|
||||
return new Aphront404Response();
|
||||
}
|
||||
|
||||
return id(new AphrontDialogResponse())->setDialog($dialog);
|
||||
}
|
||||
|
||||
}
|
||||
22
src/applications/project/controller/update/__init__.php
Normal file
22
src/applications/project/controller/update/__init__.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
/**
|
||||
* This file is automatically generated. Lint this module to rebuild it.
|
||||
* @generated
|
||||
*/
|
||||
|
||||
|
||||
|
||||
phutil_require_module('phabricator', 'aphront/response/404');
|
||||
phutil_require_module('phabricator', 'aphront/response/dialog');
|
||||
phutil_require_module('phabricator', 'aphront/response/redirect');
|
||||
phutil_require_module('phabricator', 'applications/project/constants/transaction');
|
||||
phutil_require_module('phabricator', 'applications/project/controller/base');
|
||||
phutil_require_module('phabricator', 'applications/project/editor/project');
|
||||
phutil_require_module('phabricator', 'applications/project/storage/project');
|
||||
phutil_require_module('phabricator', 'applications/project/storage/transaction');
|
||||
phutil_require_module('phabricator', 'view/dialog');
|
||||
|
||||
phutil_require_module('phutil', 'utils');
|
||||
|
||||
|
||||
phutil_require_source('PhabricatorProjectUpdateController.php');
|
||||
Reference in New Issue
Block a user