Page MenuHomestyx hydra

No OneTemporary

diff --git a/src/applications/project/application/PhabricatorProjectApplication.php b/src/applications/project/application/PhabricatorProjectApplication.php
index e1b484ffe2..c25a1b223f 100644
--- a/src/applications/project/application/PhabricatorProjectApplication.php
+++ b/src/applications/project/application/PhabricatorProjectApplication.php
@@ -1,136 +1,136 @@
<?php
final class PhabricatorProjectApplication extends PhabricatorApplication {
public function getName() {
return pht('Projects');
}
public function getShortDescription() {
return pht('Get Organized');
}
public function isPinnedByDefault(PhabricatorUser $viewer) {
return true;
}
public function getBaseURI() {
return '/project/';
}
public function getFontIcon() {
return 'fa-briefcase';
}
public function getFlavorText() {
return pht('Group stuff into big piles.');
}
public function getRemarkupRules() {
return array(
new ProjectRemarkupRule(),
);
}
public function getEventListeners() {
return array(
new PhabricatorProjectUIEventListener(),
);
}
public function getRoutes() {
return array(
'/project/' => array(
'(?:query/(?P<queryKey>[^/]+)/)?' => 'PhabricatorProjectListController',
'filter/(?P<filter>[^/]+)/' => 'PhabricatorProjectListController',
'archive/(?P<id>[1-9]\d*)/'
=> 'PhabricatorProjectArchiveController',
'lock/(?P<id>[1-9]\d*)/'
=> 'PhabricatorProjectLockController',
'members/(?P<id>[1-9]\d*)/'
=> 'PhabricatorProjectMembersViewController',
'members/(?P<id>[1-9]\d*)/add/'
=> 'PhabricatorProjectMembersAddController',
- 'members/(?P<id>[1-9]\d*)/remove/'
+ '(?P<type>members|watchers)/(?P<id>[1-9]\d*)/remove/'
=> 'PhabricatorProjectMembersRemoveController',
'profile/(?P<id>[1-9]\d*)/'
=> 'PhabricatorProjectProfileController',
'view/(?P<id>[1-9]\d*)/'
=> 'PhabricatorProjectViewController',
'picture/(?P<id>[1-9]\d*)/'
=> 'PhabricatorProjectEditPictureController',
$this->getEditRoutePattern('edit/')
=> 'PhabricatorProjectEditController',
'(?P<projectID>[1-9]\d*)/panel/'
=> $this->getPanelRouting('PhabricatorProjectPanelController'),
'subprojects/(?P<id>[1-9]\d*)/'
=> 'PhabricatorProjectSubprojectsController',
'milestones/(?P<id>[1-9]\d*)/'
=> 'PhabricatorProjectMilestonesController',
'board/(?P<id>[1-9]\d*)/'.
'(?P<filter>filter/)?'.
'(?:query/(?P<queryKey>[^/]+)/)?'
=> 'PhabricatorProjectBoardViewController',
'move/(?P<id>[1-9]\d*)/' => 'PhabricatorProjectMoveController',
'board/(?P<projectID>[1-9]\d*)/' => array(
'edit/(?:(?P<id>\d+)/)?'
=> 'PhabricatorProjectColumnEditController',
'hide/(?:(?P<id>\d+)/)?'
=> 'PhabricatorProjectColumnHideController',
'column/(?:(?P<id>\d+)/)?'
=> 'PhabricatorProjectColumnDetailController',
'import/'
=> 'PhabricatorProjectBoardImportController',
'reorder/'
=> 'PhabricatorProjectBoardReorderController',
),
'update/(?P<id>[1-9]\d*)/(?P<action>[^/]+)/'
=> 'PhabricatorProjectUpdateController',
'history/(?P<id>[1-9]\d*)/' => 'PhabricatorProjectHistoryController',
'(?P<action>watch|unwatch)/(?P<id>[1-9]\d*)/'
=> 'PhabricatorProjectWatchController',
),
'/tag/' => array(
'(?P<slug>[^/]+)/' => 'PhabricatorProjectViewController',
'(?P<slug>[^/]+)/board/' => 'PhabricatorProjectBoardViewController',
),
);
}
public function getQuickCreateItems(PhabricatorUser $viewer) {
return id(new PhabricatorProjectEditEngine())
->setViewer($viewer)
->loadQuickCreateItems();
}
protected function getCustomCapabilities() {
return array(
ProjectCreateProjectsCapability::CAPABILITY => array(),
ProjectCanLockProjectsCapability::CAPABILITY => array(
'default' => PhabricatorPolicies::POLICY_ADMIN,
),
ProjectDefaultViewCapability::CAPABILITY => array(
'caption' => pht('Default view policy for newly created projects.'),
'template' => PhabricatorProjectProjectPHIDType::TYPECONST,
'capability' => PhabricatorPolicyCapability::CAN_VIEW,
),
ProjectDefaultEditCapability::CAPABILITY => array(
'caption' => pht('Default edit policy for newly created projects.'),
'template' => PhabricatorProjectProjectPHIDType::TYPECONST,
'capability' => PhabricatorPolicyCapability::CAN_EDIT,
),
ProjectDefaultJoinCapability::CAPABILITY => array(
'caption' => pht('Default join policy for newly created projects.'),
'template' => PhabricatorProjectProjectPHIDType::TYPECONST,
'capability' => PhabricatorPolicyCapability::CAN_JOIN,
),
);
}
public function getApplicationSearchDocumentTypes() {
return array(
PhabricatorProjectProjectPHIDType::TYPECONST,
);
}
}
diff --git a/src/applications/project/controller/PhabricatorProjectMembersRemoveController.php b/src/applications/project/controller/PhabricatorProjectMembersRemoveController.php
index cad3f35c05..ea41ea7113 100644
--- a/src/applications/project/controller/PhabricatorProjectMembersRemoveController.php
+++ b/src/applications/project/controller/PhabricatorProjectMembersRemoveController.php
@@ -1,76 +1,95 @@
<?php
final class PhabricatorProjectMembersRemoveController
extends PhabricatorProjectController {
public function handleRequest(AphrontRequest $request) {
$viewer = $request->getViewer();
$id = $request->getURIData('id');
+ $type = $request->getURIData('type');
$project = id(new PhabricatorProjectQuery())
->setViewer($viewer)
->withIDs(array($id))
->needMembers(true)
+ ->needWatchers(true)
->requireCapabilities(
array(
PhabricatorPolicyCapability::CAN_VIEW,
PhabricatorPolicyCapability::CAN_EDIT,
))
->executeOne();
if (!$project) {
return new Aphront404Response();
}
- $member_phids = $project->getMemberPHIDs();
- $remove_phid = $request->getStr('phid');
+ if ($type == 'watchers') {
+ $is_watcher = true;
+ $edge_type = PhabricatorObjectHasWatcherEdgeType::EDGECONST;
+ } else {
+ if (!$project->supportsEditMembers()) {
+ return new Aphront404Response();
+ }
- if (!in_array($remove_phid, $member_phids)) {
- return new Aphront404Response();
+ $is_watcher = false;
+ $edge_type = PhabricatorProjectProjectHasMemberEdgeType::EDGECONST;
}
$members_uri = $this->getApplicationURI('members/'.$project->getID().'/');
+ $remove_phid = $request->getStr('phid');
if ($request->isFormPost()) {
- $member_spec = array();
- $member_spec['-'] = array($remove_phid => $remove_phid);
-
- $type_member = PhabricatorProjectProjectHasMemberEdgeType::EDGECONST;
-
$xactions = array();
$xactions[] = id(new PhabricatorProjectTransaction())
->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
- ->setMetadataValue('edge:type', $type_member)
- ->setNewValue($member_spec);
+ ->setMetadataValue('edge:type', $edge_type)
+ ->setNewValue(
+ array(
+ '-' => array($remove_phid => $remove_phid),
+ ));
$editor = id(new PhabricatorProjectTransactionEditor($project))
->setActor($viewer)
->setContentSourceFromRequest($request)
->setContinueOnNoEffect(true)
->setContinueOnMissingFields(true)
->applyTransactions($project, $xactions);
return id(new AphrontRedirectResponse())
->setURI($members_uri);
}
$handle = id(new PhabricatorHandleQuery())
->setViewer($viewer)
->withPHIDs(array($remove_phid))
->executeOne();
- $dialog = id(new AphrontDialogView())
- ->setUser($viewer)
- ->setTitle(pht('Really Remove Member?'))
- ->appendParagraph(
- pht(
- 'Really remove %s from the project %s?',
- phutil_tag('strong', array(), $handle->getName()),
- phutil_tag('strong', array(), $project->getName())))
- ->addCancelButton($members_uri)
- ->addSubmitButton(pht('Remove Project Member'));
+ $target_name = phutil_tag('strong', array(), $handle->getName());
+ $project_name = phutil_tag('strong', array(), $project->getName());
+
+ if ($is_watcher) {
+ $title = pht('Remove Watcher');
+ $body = pht(
+ 'Remove %s as a watcher of %s?',
+ $target_name,
+ $project_name);
+ $button = pht('Remove Watcher');
+ } else {
+ $title = pht('Remove Member');
+ $body = pht(
+ 'Remove %s as a project member of %s?',
+ $target_name,
+ $project_name);
+ $button = pht('Remove Member');
+ }
- return id(new AphrontDialogResponse())->setDialog($dialog);
+ return $this->newDialog()
+ ->setTitle($title)
+ ->addHiddenInput('phid', $remove_phid)
+ ->appendParagraph($body)
+ ->addCancelButton($members_uri)
+ ->addSubmitButton($button);
}
}
diff --git a/src/applications/project/view/PhabricatorProjectWatcherListView.php b/src/applications/project/view/PhabricatorProjectWatcherListView.php
index ec993f031c..7aa9638afc 100644
--- a/src/applications/project/view/PhabricatorProjectWatcherListView.php
+++ b/src/applications/project/view/PhabricatorProjectWatcherListView.php
@@ -1,22 +1,30 @@
<?php
final class PhabricatorProjectWatcherListView
extends PhabricatorProjectUserListView {
protected function canEditList() {
- return false;
+ $viewer = $this->getUser();
+ $project = $this->getProject();
+
+ return PhabricatorPolicyFilter::hasCapability(
+ $viewer,
+ $project,
+ PhabricatorPolicyCapability::CAN_EDIT);
}
protected function getNoDataString() {
return pht('This project does not have any watchers.');
}
protected function getRemoveURI($phid) {
- return null;
+ $project = $this->getProject();
+ $id = $project->getID();
+ return "/project/watchers/{$id}/remove/?phid={$phid}";
}
protected function getHeaderText() {
return pht('Watchers');
}
}

File Metadata

Mime Type
text/x-diff
Expires
Thu, Aug 14, 7:06 PM (1 d, 6 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
192592
Default Alt Text
(10 KB)

Event Timeline