@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Allow project editors to remove watchers

Summary: Ref T10054. There is no technical or product reason not to support this, and it is largely analogous to removing subscribers.

Test Plan:
- Removed watchers.
- Removed members.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10054

Differential Revision: https://secure.phabricator.com/D15062

+52 -25
+1 -1
src/applications/project/application/PhabricatorProjectApplication.php
··· 51 51 => 'PhabricatorProjectMembersViewController', 52 52 'members/(?P<id>[1-9]\d*)/add/' 53 53 => 'PhabricatorProjectMembersAddController', 54 - 'members/(?P<id>[1-9]\d*)/remove/' 54 + '(?P<type>members|watchers)/(?P<id>[1-9]\d*)/remove/' 55 55 => 'PhabricatorProjectMembersRemoveController', 56 56 'profile/(?P<id>[1-9]\d*)/' 57 57 => 'PhabricatorProjectProfileController',
+41 -22
src/applications/project/controller/PhabricatorProjectMembersRemoveController.php
··· 6 6 public function handleRequest(AphrontRequest $request) { 7 7 $viewer = $request->getViewer(); 8 8 $id = $request->getURIData('id'); 9 + $type = $request->getURIData('type'); 9 10 10 11 $project = id(new PhabricatorProjectQuery()) 11 12 ->setViewer($viewer) 12 13 ->withIDs(array($id)) 13 14 ->needMembers(true) 15 + ->needWatchers(true) 14 16 ->requireCapabilities( 15 17 array( 16 18 PhabricatorPolicyCapability::CAN_VIEW, ··· 21 23 return new Aphront404Response(); 22 24 } 23 25 24 - $member_phids = $project->getMemberPHIDs(); 25 - $remove_phid = $request->getStr('phid'); 26 + if ($type == 'watchers') { 27 + $is_watcher = true; 28 + $edge_type = PhabricatorObjectHasWatcherEdgeType::EDGECONST; 29 + } else { 30 + if (!$project->supportsEditMembers()) { 31 + return new Aphront404Response(); 32 + } 26 33 27 - if (!in_array($remove_phid, $member_phids)) { 28 - return new Aphront404Response(); 34 + $is_watcher = false; 35 + $edge_type = PhabricatorProjectProjectHasMemberEdgeType::EDGECONST; 29 36 } 30 37 31 38 $members_uri = $this->getApplicationURI('members/'.$project->getID().'/'); 39 + $remove_phid = $request->getStr('phid'); 32 40 33 41 if ($request->isFormPost()) { 34 - $member_spec = array(); 35 - $member_spec['-'] = array($remove_phid => $remove_phid); 36 - 37 - $type_member = PhabricatorProjectProjectHasMemberEdgeType::EDGECONST; 38 - 39 42 $xactions = array(); 40 43 41 44 $xactions[] = id(new PhabricatorProjectTransaction()) 42 45 ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) 43 - ->setMetadataValue('edge:type', $type_member) 44 - ->setNewValue($member_spec); 46 + ->setMetadataValue('edge:type', $edge_type) 47 + ->setNewValue( 48 + array( 49 + '-' => array($remove_phid => $remove_phid), 50 + )); 45 51 46 52 $editor = id(new PhabricatorProjectTransactionEditor($project)) 47 53 ->setActor($viewer) ··· 59 65 ->withPHIDs(array($remove_phid)) 60 66 ->executeOne(); 61 67 62 - $dialog = id(new AphrontDialogView()) 63 - ->setUser($viewer) 64 - ->setTitle(pht('Really Remove Member?')) 65 - ->appendParagraph( 66 - pht( 67 - 'Really remove %s from the project %s?', 68 - phutil_tag('strong', array(), $handle->getName()), 69 - phutil_tag('strong', array(), $project->getName()))) 68 + $target_name = phutil_tag('strong', array(), $handle->getName()); 69 + $project_name = phutil_tag('strong', array(), $project->getName()); 70 + 71 + if ($is_watcher) { 72 + $title = pht('Remove Watcher'); 73 + $body = pht( 74 + 'Remove %s as a watcher of %s?', 75 + $target_name, 76 + $project_name); 77 + $button = pht('Remove Watcher'); 78 + } else { 79 + $title = pht('Remove Member'); 80 + $body = pht( 81 + 'Remove %s as a project member of %s?', 82 + $target_name, 83 + $project_name); 84 + $button = pht('Remove Member'); 85 + } 86 + 87 + return $this->newDialog() 88 + ->setTitle($title) 89 + ->addHiddenInput('phid', $remove_phid) 90 + ->appendParagraph($body) 70 91 ->addCancelButton($members_uri) 71 - ->addSubmitButton(pht('Remove Project Member')); 72 - 73 - return id(new AphrontDialogResponse())->setDialog($dialog); 92 + ->addSubmitButton($button); 74 93 } 75 94 76 95 }
+10 -2
src/applications/project/view/PhabricatorProjectWatcherListView.php
··· 4 4 extends PhabricatorProjectUserListView { 5 5 6 6 protected function canEditList() { 7 - return false; 7 + $viewer = $this->getUser(); 8 + $project = $this->getProject(); 9 + 10 + return PhabricatorPolicyFilter::hasCapability( 11 + $viewer, 12 + $project, 13 + PhabricatorPolicyCapability::CAN_EDIT); 8 14 } 9 15 10 16 protected function getNoDataString() { ··· 12 18 } 13 19 14 20 protected function getRemoveURI($phid) { 15 - return null; 21 + $project = $this->getProject(); 22 + $id = $project->getID(); 23 + return "/project/watchers/{$id}/remove/?phid={$phid}"; 16 24 } 17 25 18 26 protected function getHeaderText() {