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' => 'efc0f11c', + 'core.pkg.css' => '8b87d014', 'core.pkg.js' => '13c7e56a', 'darkconsole.pkg.js' => 'e7393ebb', 'differential.pkg.css' => '3fb7f532', @@ -25,7 +25,7 @@ 'rsrc/css/aphront/notification.css' => '3f6c89c9', 'rsrc/css/aphront/panel-view.css' => '8427b78d', 'rsrc/css/aphront/phabricator-nav-view.css' => 'ac79a758', - 'rsrc/css/aphront/table-view.css' => '8df59783', + 'rsrc/css/aphront/table-view.css' => '832656fd', 'rsrc/css/aphront/tokenizer.css' => '056da01b', 'rsrc/css/aphront/tooltip.css' => '1a07aea8', 'rsrc/css/aphront/typeahead-browse.css' => '8904346a', @@ -537,7 +537,7 @@ 'aphront-list-filter-view-css' => '5d6f0526', 'aphront-multi-column-view-css' => 'fd18389d', 'aphront-panel-view-css' => '8427b78d', - 'aphront-table-view-css' => '8df59783', + 'aphront-table-view-css' => '832656fd', 'aphront-tokenizer-control-css' => '056da01b', 'aphront-tooltip-css' => '1a07aea8', 'aphront-typeahead-control-css' => 'd4f16145', diff --git a/src/infrastructure/graph/ManiphestTaskGraph.php b/src/infrastructure/graph/ManiphestTaskGraph.php --- a/src/infrastructure/graph/ManiphestTaskGraph.php +++ b/src/infrastructure/graph/ManiphestTaskGraph.php @@ -3,6 +3,8 @@ final class ManiphestTaskGraph extends PhabricatorObjectGraph { + private $seedMaps = array(); + protected function getEdgeTypes() { return array( ManiphestTaskDependedOnByTaskEdgeType::EDGECONST, @@ -57,7 +59,12 @@ $object->getTitle()); $link = array( - $object->getMonogram(), + phutil_tag( + 'span', + array( + 'class' => 'object-name', + ), + $object->getMonogram()), ' ', $link, ); @@ -67,9 +74,33 @@ $link = $viewer->renderHandle($phid); } + + + if ($this->isParentTask($object)) { + $marker = 'fa-chevron-circle-up bluegrey'; + $marker_tip = pht('Direct Parent'); + } else if ($this->isChildTask($object)) { + $marker = 'fa-chevron-circle-down bluegrey'; + $marker_tip = pht('Direct Subtask'); + } else { + $marker = null; + } + + if ($marker) { + $marker = id(new PHUIIconView()) + ->setIcon($marker) + ->addSigil('has-tooltip') + ->setMetadata( + array( + 'tip' => $marker_tip, + 'align' => 'E', + )); + } + $link = AphrontTableView::renderSingleDisplayLine($link); return array( + $marker, $trace, $status, $assigned, @@ -82,12 +113,14 @@ ->setHeaders( array( null, + null, pht('Status'), pht('Assigned'), pht('Task'), )) ->setColumnClasses( array( + 'nudgeright', 'threads', 'graph-status', null, @@ -95,4 +128,24 @@ )); } + private function isParentTask(ManiphestTask $task) { + $map = $this->getSeedMap(ManiphestTaskDependedOnByTaskEdgeType::EDGECONST); + return isset($map[$task->getPHID()]); + } + + private function isChildTask(ManiphestTask $task) { + $map = $this->getSeedMap(ManiphestTaskDependsOnTaskEdgeType::EDGECONST); + return isset($map[$task->getPHID()]); + } + + private function getSeedMap($type) { + if (!isset($this->seedMaps[$type])) { + $maps = $this->getEdges($type); + $phids = idx($maps, $this->getSeedPHID(), array()); + $phids = array_fuse($phids); + $this->seedMaps[$type] = $phids; + } + + return $this->seedMaps[$type]; + } } diff --git a/src/infrastructure/graph/PhabricatorObjectGraph.php b/src/infrastructure/graph/PhabricatorObjectGraph.php --- a/src/infrastructure/graph/PhabricatorObjectGraph.php +++ b/src/infrastructure/graph/PhabricatorObjectGraph.php @@ -50,6 +50,10 @@ )); } + final public function getSeedPHID() { + return $this->seedPHID; + } + final public function isEmpty() { return (count($this->getNodes()) <= 2); } diff --git a/webroot/rsrc/css/aphront/table-view.css b/webroot/rsrc/css/aphront/table-view.css --- a/webroot/rsrc/css/aphront/table-view.css +++ b/webroot/rsrc/css/aphront/table-view.css @@ -228,8 +228,8 @@ position: static; } -.aphront-table-view tr.closed td.object-link, -.aphront-table-view tr.alt-closed td.object-link { +.aphront-table-view tr.closed td.object-link .object-name, +.aphront-table-view tr.alt-closed td.object-link .object-name { text-decoration: line-through; color: rgba({$alphablack}, 0.5); }