@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<?php
2
3final class PhabricatorProjectMembersRemoveController
4 extends PhabricatorProjectController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $viewer = $request->getViewer();
8 $id = $request->getURIData('id');
9 $type = $request->getURIData('type');
10
11 $project = id(new PhabricatorProjectQuery())
12 ->setViewer($viewer)
13 ->withIDs(array($id))
14 ->needMembers(true)
15 ->needWatchers(true)
16 ->requireCapabilities(
17 array(
18 PhabricatorPolicyCapability::CAN_VIEW,
19 PhabricatorPolicyCapability::CAN_EDIT,
20 ))
21 ->executeOne();
22 if (!$project) {
23 return new Aphront404Response();
24 }
25
26 if ($type == 'watchers') {
27 $is_watcher = true;
28 $edge_type = PhabricatorObjectHasWatcherEdgeType::EDGECONST;
29 } else {
30 if (!$project->supportsEditMembers()) {
31 return new Aphront404Response();
32 }
33
34 $is_watcher = false;
35 $edge_type = PhabricatorProjectProjectHasMemberEdgeType::EDGECONST;
36 }
37
38 $members_uri = $this->getApplicationURI('members/'.$project->getID().'/');
39 $remove_phid = $request->getStr('phid');
40
41 if ($request->isFormPost()) {
42 $xactions = array();
43
44 $xactions[] = id(new PhabricatorProjectTransaction())
45 ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
46 ->setMetadataValue('edge:type', $edge_type)
47 ->setNewValue(
48 array(
49 '-' => array($remove_phid => $remove_phid),
50 ));
51
52 $editor = id(new PhabricatorProjectTransactionEditor())
53 ->setActor($viewer)
54 ->setContentSourceFromRequest($request)
55 ->setContinueOnNoEffect(true)
56 ->setContinueOnMissingFields(true)
57 ->applyTransactions($project, $xactions);
58
59 return id(new AphrontRedirectResponse())
60 ->setURI($members_uri);
61 }
62
63 $handle = id(new PhabricatorHandleQuery())
64 ->setViewer($viewer)
65 ->withPHIDs(array($remove_phid))
66 ->executeOne();
67
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)
91 ->addCancelButton($members_uri)
92 ->addSubmitButton($button);
93 }
94
95}