Move member/watch actions to "Members/Watchers" page

Summary:
Ref T10054. This tries to make the members page a bit more consistent and provide hints to users about subproject/milestone membership rules. In particular:

  - You now join, leave, watch, unwatch, add and remove members, and lock and unlock membership from the members screen.
  - We now explain the membership rule for the project on this screen. There are currently four rules:
    - Normal Project: Join/leave normally.
    - Parent Project: Uses subprojects to determine members.
    - Milestone: Uses parent project to determine members.
    - Locked: Membership is locked.
    - (Future) Imported from LDAP/other external sources: Membership is determined by something else.

Test Plan: {F1064878}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10054

Differential Revision: https://secure.phabricator.com/D15059
This commit is contained in:
epriestley
2016-01-19 16:27:36 -08:00
parent 26500f0545
commit 6b1b21c999
15 changed files with 501 additions and 286 deletions

View File

@@ -0,0 +1,72 @@
<?php
final class PhabricatorProjectMembersAddController
extends PhabricatorProjectController {
public function handleRequest(AphrontRequest $request) {
$viewer = $request->getViewer();
$id = $request->getURIData('id');
$project = id(new PhabricatorProjectQuery())
->setViewer($viewer)
->withIDs(array($id))
->requireCapabilities(
array(
PhabricatorPolicyCapability::CAN_VIEW,
PhabricatorPolicyCapability::CAN_EDIT,
))
->executeOne();
if (!$project) {
return new Aphront404Response();
}
$this->setProject($project);
if (!$project->supportsEditMembers()) {
return new Aphront404Response();
}
$done_uri = "/project/members/{$id}/";
if ($request->isFormPost()) {
$member_phids = $request->getArr('memberPHIDs');
$type_member = PhabricatorProjectProjectHasMemberEdgeType::EDGECONST;
$xactions = array();
$xactions[] = id(new PhabricatorProjectTransaction())
->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
->setMetadataValue('edge:type', $type_member)
->setNewValue(
array(
'+' => array_fuse($member_phids),
));
$editor = id(new PhabricatorProjectTransactionEditor($project))
->setActor($viewer)
->setContentSourceFromRequest($request)
->setContinueOnNoEffect(true)
->setContinueOnMissingFields(true)
->applyTransactions($project, $xactions);
return id(new AphrontRedirectResponse())
->setURI($done_uri);
}
$form = id(new AphrontFormView())
->setUser($viewer)
->appendControl(
id(new AphrontFormTokenizerControl())
->setName('memberPHIDs')
->setLabel(pht('Members'))
->setDatasource(new PhabricatorPeopleDatasource()));
return $this->newDialog()
->setTitle(pht('Add Members'))
->appendForm($form)
->addCancelButton($done_uri)
->addSubmitButton(pht('Add Members'));
}
}