Page MenuHomePhabricator

D15432.id37197.diff
No OneTemporary

D15432.id37197.diff

diff --git a/resources/celerity/map.php b/resources/celerity/map.php
--- a/resources/celerity/map.php
+++ b/resources/celerity/map.php
@@ -7,7 +7,7 @@
*/
return array(
'names' => array(
- 'core.pkg.css' => 'd3b3a609',
+ 'core.pkg.css' => '000cca46',
'core.pkg.js' => '7d8faf57',
'darkconsole.pkg.js' => 'e7393ebb',
'differential.pkg.css' => '2de124c9',
@@ -133,7 +133,7 @@
'rsrc/css/phui/phui-document.css' => '9c71d2bf',
'rsrc/css/phui/phui-feed-story.css' => '04aec08f',
'rsrc/css/phui/phui-fontkit.css' => '9cda225e',
- 'rsrc/css/phui/phui-form-view.css' => '4a1a0f5e',
+ 'rsrc/css/phui/phui-form-view.css' => 'a6856060',
'rsrc/css/phui/phui-form.css' => 'aac1d51d',
'rsrc/css/phui/phui-head-thing.css' => '31638812',
'rsrc/css/phui/phui-header-view.css' => '26cffd3d',
@@ -145,7 +145,7 @@
'rsrc/css/phui/phui-info-view.css' => '6d7c3509',
'rsrc/css/phui/phui-list.css' => '9da2aa00',
'rsrc/css/phui/phui-object-box.css' => '91628842',
- 'rsrc/css/phui/phui-object-item-list-view.css' => '18b2ce8e',
+ 'rsrc/css/phui/phui-object-item-list-view.css' => '8d99e42b',
'rsrc/css/phui/phui-pager.css' => 'bea33d23',
'rsrc/css/phui/phui-pinboard-view.css' => '2495140e',
'rsrc/css/phui/phui-profile-menu.css' => '7e92a89a',
@@ -820,7 +820,7 @@
'phui-font-icon-base-css' => '6449bce8',
'phui-fontkit-css' => '9cda225e',
'phui-form-css' => 'aac1d51d',
- 'phui-form-view-css' => '4a1a0f5e',
+ 'phui-form-view-css' => 'a6856060',
'phui-head-thing-view-css' => '31638812',
'phui-header-view-css' => '26cffd3d',
'phui-hovercard' => '1bd28176',
@@ -833,7 +833,7 @@
'phui-inline-comment-view-css' => '0fdb3667',
'phui-list-view-css' => '9da2aa00',
'phui-object-box-css' => '91628842',
- 'phui-object-item-list-view-css' => '18b2ce8e',
+ 'phui-object-item-list-view-css' => '8d99e42b',
'phui-pager-css' => 'bea33d23',
'phui-pinboard-view-css' => '2495140e',
'phui-profile-menu-css' => '7e92a89a',
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -1352,12 +1352,14 @@
'ManiphestStatusEmailCommand' => 'applications/maniphest/command/ManiphestStatusEmailCommand.php',
'ManiphestSubpriorityController' => 'applications/maniphest/controller/ManiphestSubpriorityController.php',
'ManiphestTask' => 'applications/maniphest/storage/ManiphestTask.php',
+ 'ManiphestTaskAssignController' => 'applications/maniphest/controller/ManiphestTaskAssignController.php',
'ManiphestTaskAssignHeraldAction' => 'applications/maniphest/herald/ManiphestTaskAssignHeraldAction.php',
'ManiphestTaskAssignOtherHeraldAction' => 'applications/maniphest/herald/ManiphestTaskAssignOtherHeraldAction.php',
'ManiphestTaskAssignSelfHeraldAction' => 'applications/maniphest/herald/ManiphestTaskAssignSelfHeraldAction.php',
'ManiphestTaskAssigneeHeraldField' => 'applications/maniphest/herald/ManiphestTaskAssigneeHeraldField.php',
'ManiphestTaskAuthorHeraldField' => 'applications/maniphest/herald/ManiphestTaskAuthorHeraldField.php',
'ManiphestTaskAuthorPolicyRule' => 'applications/maniphest/policyrule/ManiphestTaskAuthorPolicyRule.php',
+ 'ManiphestTaskClaimController' => 'applications/maniphest/controller/ManiphestTaskClaimController.php',
'ManiphestTaskClosedStatusDatasource' => 'applications/maniphest/typeahead/ManiphestTaskClosedStatusDatasource.php',
'ManiphestTaskDependedOnByTaskEdgeType' => 'applications/maniphest/edge/ManiphestTaskDependedOnByTaskEdgeType.php',
'ManiphestTaskDependsOnTaskEdgeType' => 'applications/maniphest/edge/ManiphestTaskDependsOnTaskEdgeType.php',
@@ -5589,12 +5591,14 @@
'PhabricatorConduitResultInterface',
'PhabricatorFulltextInterface',
),
+ 'ManiphestTaskAssignController' => 'ManiphestController',
'ManiphestTaskAssignHeraldAction' => 'HeraldAction',
'ManiphestTaskAssignOtherHeraldAction' => 'ManiphestTaskAssignHeraldAction',
'ManiphestTaskAssignSelfHeraldAction' => 'ManiphestTaskAssignHeraldAction',
'ManiphestTaskAssigneeHeraldField' => 'ManiphestTaskHeraldField',
'ManiphestTaskAuthorHeraldField' => 'ManiphestTaskHeraldField',
'ManiphestTaskAuthorPolicyRule' => 'PhabricatorPolicyRule',
+ 'ManiphestTaskClaimController' => 'ManiphestController',
'ManiphestTaskClosedStatusDatasource' => 'PhabricatorTypeaheadDatasource',
'ManiphestTaskDependedOnByTaskEdgeType' => 'PhabricatorEdgeType',
'ManiphestTaskDependsOnTaskEdgeType' => 'PhabricatorEdgeType',
diff --git a/src/applications/maniphest/application/PhabricatorManiphestApplication.php b/src/applications/maniphest/application/PhabricatorManiphestApplication.php
--- a/src/applications/maniphest/application/PhabricatorManiphestApplication.php
+++ b/src/applications/maniphest/application/PhabricatorManiphestApplication.php
@@ -48,6 +48,8 @@
'/maniphest/' => array(
'(?:query/(?P<queryKey>[^/]+)/)?' => 'ManiphestTaskListController',
'report/(?:(?P<view>\w+)/)?' => 'ManiphestReportController',
+ 'assign/(?P<id>[1-9]\d*)' => 'ManiphestTaskAssignController',
+ 'claim/(?P<id>[1-9]\d*)' => 'ManiphestTaskClaimController',
'batch/' => 'ManiphestBatchEditController',
'task/' => array(
$this->getEditRoutePattern('edit/')
diff --git a/src/applications/maniphest/controller/ManiphestTaskAssignController.php b/src/applications/maniphest/controller/ManiphestTaskAssignController.php
new file mode 100644
--- /dev/null
+++ b/src/applications/maniphest/controller/ManiphestTaskAssignController.php
@@ -0,0 +1,72 @@
+<?php
+
+final class ManiphestTaskAssignController
+ extends ManiphestController {
+
+ public function handleRequest(AphrontRequest $request) {
+ $viewer = $request->getViewer();
+ $id = $request->getURIData('id');
+
+ $task = id(new ManiphestTaskQuery())
+ ->setViewer($viewer)
+ ->withIDs(array($id))
+ ->requireCapabilities(
+ array(
+ PhabricatorPolicyCapability::CAN_EDIT,
+ PhabricatorPolicyCapability::CAN_VIEW,
+ ))
+ ->executeOne();
+ if (!$task) {
+ return new Aphront404Response();
+ }
+
+ $view_uri = ('/T'.$id);
+
+ if ($request->isFormPost()) {
+ // TODO: $owner[0] seems wrong?
+ $owner = $request->getArr('phid');
+ $xaction = id(new ManiphestTransaction())
+ ->setTransactionType(ManiphestTransaction::TYPE_OWNER)
+ ->setNewValue($owner[0]);
+
+ $editor = id(new ManiphestTransactionEditor())
+ ->setActor($viewer)
+ ->setContinueOnNoEffect(true)
+ ->setContinueOnMissingFields(true)
+ ->setContentSourceFromRequest($request);
+
+ $xactions = $editor->applyTransactions($task, array($xaction));
+
+ return id(new AphrontRedirectResponse())->setURI($view_uri);
+ }
+
+ $can_edit = PhabricatorPolicyFilter::hasCapability(
+ $viewer,
+ $task,
+ PhabricatorPolicyCapability::CAN_EDIT);
+
+ if ($can_edit) {
+ $form = id(new AphrontFormView())
+ ->setUser($viewer)
+ ->setFullWidth(true)
+ ->appendControl(
+ id(new AphrontFormTokenizerControl())
+ ->setName('phid')
+ ->setLabel(pht('Assignee'))
+ ->setLimit(1)
+ ->setDatasource(new ManiphestAssigneeDatasource()));
+ }
+
+ $dialog = id(new AphrontDialogView())
+ ->setUser($viewer)
+ ->setTitle(pht('Assign Task'))
+ ->appendForm($form)
+ ->addCancelButton($view_uri)
+ ->addSubmitButton(pht('Assign'));
+
+ return $dialog;
+
+ }
+
+
+}
diff --git a/src/applications/maniphest/controller/ManiphestTaskClaimController.php b/src/applications/maniphest/controller/ManiphestTaskClaimController.php
new file mode 100644
--- /dev/null
+++ b/src/applications/maniphest/controller/ManiphestTaskClaimController.php
@@ -0,0 +1,41 @@
+<?php
+
+final class ManiphestTaskClaimController
+ extends ManiphestController {
+
+ public function handleRequest(AphrontRequest $request) {
+ $viewer = $request->getViewer();
+ $id = $request->getURIData('id');
+
+ $task = id(new ManiphestTaskQuery())
+ ->setViewer($viewer)
+ ->withIDs(array($id))
+ ->requireCapabilities(
+ array(
+ PhabricatorPolicyCapability::CAN_EDIT,
+ PhabricatorPolicyCapability::CAN_VIEW,
+ ))
+ ->executeOne();
+ if (!$task) {
+ return new Aphront404Response();
+ }
+
+ $view_uri = ('/T'.$id);
+
+ $xaction = id(new ManiphestTransaction())
+ ->setTransactionType(ManiphestTransaction::TYPE_OWNER)
+ ->setNewValue($viewer->getPHID());
+
+ $editor = id(new ManiphestTransactionEditor())
+ ->setActor($viewer)
+ ->setContinueOnNoEffect(true)
+ ->setContinueOnMissingFields(true)
+ ->setContentSourceFromRequest($request);
+
+ $xactions = $editor->applyTransactions($task, array($xaction));
+
+ return id(new AphrontRedirectResponse())->setURI($view_uri);
+
+ }
+
+}
diff --git a/src/applications/maniphest/controller/ManiphestTaskDetailController.php b/src/applications/maniphest/controller/ManiphestTaskDetailController.php
--- a/src/applications/maniphest/controller/ManiphestTaskDetailController.php
+++ b/src/applications/maniphest/controller/ManiphestTaskDetailController.php
@@ -217,32 +217,13 @@
$author_phid = $task->getAuthorPHID();
$handles = $viewer->loadHandles(array($owner_phid, $author_phid));
- if ($owner_phid) {
- $image_uri = $handles[$owner_phid]->getImageURI();
- $image_href = $handles[$owner_phid]->getURI();
- $owner = $viewer->renderHandle($owner_phid)->render();
- $content = phutil_tag('strong', array(), $owner);
- $assigned_to = id(new PHUIHeadThingView())
- ->setImage($image_uri)
- ->setImageHref($image_href)
- ->setContent($content);
- } else {
- $assigned_to = phutil_tag('em', array(), pht('None'));
- }
+ $assigned_to = $this->buildOwnerPanel($task, $handles);
+ $authored_by = $this->buildAuthorPanel($task, $handles);
$curtain->newPanel()
->setHeaderText(pht('Assigned To'))
->appendChild($assigned_to);
- $author_uri = $handles[$author_phid]->getImageURI();
- $author_href = $handles[$author_phid]->getURI();
- $author = $viewer->renderHandle($author_phid)->render();
- $content = phutil_tag('strong', array(), $author);
- $authored_by = id(new PHUIHeadThingView())
- ->setImage($author_uri)
- ->setImageHref($author_href)
- ->setContent($content);
-
$curtain->newPanel()
->setHeaderText(pht('Authored By'))
->appendChild($authored_by);
@@ -250,6 +231,91 @@
return $curtain;
}
+ private function buildOwnerPanel(ManiphestTask $task, $handles) {
+ $viewer = $this->getViewer();
+ $id = $task->getID();
+ $owner_phid = $task->getOwnerPHID();
+
+ if ($owner_phid) {
+ $image_uri = $handles[$owner_phid]->getImageURI();
+ $image_href = $handles[$owner_phid]->getURI();
+ $owner = $handles[$owner_phid];
+ $owner = id(new PHUIObjectItemView())
+ ->setImageURI($image_uri)
+ ->setHref($image_href)
+ ->setHeader($owner->getName())
+ ->addAction(
+ id(new PHUIListItemView())
+ ->setHref("/maniphest/assign/{$id}")
+ ->setName(pht('Edit Assignee'))
+ ->setIcon('fa-pencil'))
+ ->setWorkflow(true);
+ $view = id(new PHUIObjectItemListView())
+ ->setSimple(true)
+ ->addItem($owner);
+ } else {
+ $claim = phutil_tag(
+ 'button',
+ array(
+ 'class' => 'link',
+ 'type' => 'submit',
+ ),
+ pht('Claim'));
+
+ $claim = phabricator_form(
+ $viewer,
+ array(
+ 'action' => "/maniphest/claim/{$id}",
+ 'method' => 'POST',
+ 'class' => 'inline-form',
+ ),
+ $claim);
+
+ $assign = phutil_tag(
+ 'button',
+ array(
+ 'class' => 'link',
+ 'type' => 'submit',
+ ),
+ pht('Assign'));
+
+ $assign = phabricator_form(
+ $viewer,
+ array(
+ 'action' => "/maniphest/assign/{$id}",
+ 'method' => 'GET',
+ 'class' => 'inline-form',
+ 'sigil' => 'workflow',
+ ),
+ $assign);
+
+ $view = pht('%s or %s', $claim, $assign);
+ }
+
+ return $view;
+
+ }
+
+ private function buildAuthorPanel(ManiphestTask $task, $handles) {
+ $viewer = $this->getViewer();
+ $author_phid = $task->getAuthorPHID();
+
+ $image_uri = $handles[$author_phid]->getImageURI();
+ $image_href = $handles[$author_phid]->getURI();
+ $author = $handles[$author_phid];
+
+ $author = id(new PHUIObjectItemView())
+ ->setImageURI($image_uri)
+ ->setHref($image_href)
+ ->setHeader($author->getName());
+
+ $view = id(new PHUIObjectItemListView())
+ ->setSimple(true)
+ ->addItem($author);
+
+ return $view;
+
+ }
private function buildPropertyView(
ManiphestTask $task,
PhabricatorCustomFieldList $field_list,
diff --git a/src/view/phui/PHUIObjectItemListView.php b/src/view/phui/PHUIObjectItemListView.php
--- a/src/view/phui/PHUIObjectItemListView.php
+++ b/src/view/phui/PHUIObjectItemListView.php
@@ -7,6 +7,7 @@
private $pager;
private $noDataString;
private $flush;
+ private $simple;
private $allowEmptyList;
private $states;
private $itemClass = 'phui-object-item-standard';
@@ -35,6 +36,11 @@
return $this;
}
+ public function setSimple($simple) {
+ $this->simple = $simple;
+ return $this;
+ }
+
public function setNoDataString($no_data_string) {
$this->noDataString = $no_data_string;
return $this;
@@ -69,6 +75,9 @@
if ($this->flush) {
$classes[] = 'phui-object-list-flush';
}
+ if ($this->simple) {
+ $classes[] = 'phui-object-list-simple';
+ }
return array(
'class' => $classes,
diff --git a/webroot/rsrc/css/phui/phui-form-view.css b/webroot/rsrc/css/phui/phui-form-view.css
--- a/webroot/rsrc/css/phui/phui-form-view.css
+++ b/webroot/rsrc/css/phui/phui-form-view.css
@@ -68,6 +68,9 @@
color:{$greytext} !important;
}
+form.inline-form {
+ display: inline;
+}
.aphront-form-error {
width: 18%;
diff --git a/webroot/rsrc/css/phui/phui-object-item-list-view.css b/webroot/rsrc/css/phui/phui-object-item-list-view.css
--- a/webroot/rsrc/css/phui/phui-object-item-list-view.css
+++ b/webroot/rsrc/css/phui/phui-object-item-list-view.css
@@ -782,3 +782,44 @@
padding: 0 8px 8px;
text-align: left;
}
+
+/* - Simple List------------------------------------------------------------- */
+
+.phui-object-list-simple .phui-object-item-with-image .phui-object-item-frame {
+ min-height: 26px;
+}
+
+.phui-object-list-simple .phui-object-item-image {
+ height: 26px;
+ width: 26px;
+ margin: 0;
+}
+
+.phui-object-list-simple .phui-object-item-with-image
+ .phui-object-item-content-box {
+ margin-left: 32px;
+}
+
+.phui-object-list-simple .phui-object-item-name {
+ padding: 2px 0;
+}
+
+.phui-object-list-simple .phui-object-item-name a {
+ color: {$darkbluetext};
+}
+
+.phui-object-item-list-view.phui-object-list-simple .phui-object-item-frame {
+ border: none;
+ margin-bottom: 4px;
+}
+
+.phui-object-item-list-view.phui-object-list-simple li:last-child
+ .phui-object-item-frame {
+ margin: 0;
+}
+
+.phui-object-list-simple .phui-object-item-actions {
+ top: 2px;
+ bottom: 2px;
+ right: 2px;
+}

File Metadata

Mime Type
text/plain
Expires
Mar 16 2025, 12:12 AM (5 w, 3 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7390668
Default Alt Text
D15432.id37197.diff (15 KB)

Event Timeline