mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-23 14:00:56 +01:00
On tasks, put Task Graph, Mocks and Mentions into a tabgroup
Summary: Fixes T4788. This change: - converts the "Task Graph" into a "Related Objects" tabgroup. - makes "Task Graph" the first tab in the group. - moves "Mocks" to become a tab. - adds a new "Mentions" tab, which shows inbound and outbound mentions. Primary goal of "mocks" is to give us room for a pinboard/thumbnail view after the next Pholio iteration. Might make sense to make it the default tab (if present) at that point, too, since mocks are probably more important than related tasks when they're present. Primary goal of "mentions" is to provide a bit of general support for various freeform relationships between tasks: if you want to treat tasks as "siblings" or "related" or "following" or whatever, you can at least find them all in one place. I don't plan to formalize any of these weird one-off relationships in the upstream, although it's vaguely possible that some far-future update might just let you define arbitrary custom relationships and then you can do whatever you want. Test Plan: {F1906974} Reviewers: chad Reviewed By: chad Maniphest Tasks: T4788 Differential Revision: https://secure.phabricator.com/D16806
This commit is contained in:
parent
17bd483207
commit
f4f3b90c87
1 changed files with 122 additions and 29 deletions
|
@ -30,20 +30,19 @@ final class ManiphestTaskDetailController extends ManiphestController {
|
|||
->setViewer($viewer)
|
||||
->setTargetObject($task);
|
||||
|
||||
$e_commit = ManiphestTaskHasCommitEdgeType::EDGECONST;
|
||||
$e_rev = ManiphestTaskHasRevisionEdgeType::EDGECONST;
|
||||
$e_mock = ManiphestTaskHasMockEdgeType::EDGECONST;
|
||||
$edge_types = array(
|
||||
ManiphestTaskHasCommitEdgeType::EDGECONST,
|
||||
ManiphestTaskHasRevisionEdgeType::EDGECONST,
|
||||
ManiphestTaskHasMockEdgeType::EDGECONST,
|
||||
PhabricatorObjectMentionedByObjectEdgeType::EDGECONST,
|
||||
PhabricatorObjectMentionsObjectEdgeType::EDGECONST,
|
||||
);
|
||||
|
||||
$phid = $task->getPHID();
|
||||
|
||||
$query = id(new PhabricatorEdgeQuery())
|
||||
->withSourcePHIDs(array($phid))
|
||||
->withEdgeTypes(
|
||||
array(
|
||||
$e_commit,
|
||||
$e_rev,
|
||||
$e_mock,
|
||||
));
|
||||
->withEdgeTypes($edge_types);
|
||||
$edges = idx($query->execute(), $phid);
|
||||
$phids = array_fill_keys($query->getDestinationPHIDs(), true);
|
||||
|
||||
|
@ -77,15 +76,8 @@ final class ManiphestTaskDetailController extends ManiphestController {
|
|||
$timeline->setQuoteRef($monogram);
|
||||
$comment_view->setTransactionTimeline($timeline);
|
||||
|
||||
$view = id(new PHUITwoColumnView())
|
||||
->setHeader($header)
|
||||
->setCurtain($curtain)
|
||||
->setMainColumn(array(
|
||||
$timeline,
|
||||
$comment_view,
|
||||
))
|
||||
->addPropertySection(pht('Description'), $description)
|
||||
->addPropertySection(pht('Details'), $details);
|
||||
$related_tabs = array();
|
||||
$graph_menu = null;
|
||||
|
||||
$graph_limit = 100;
|
||||
$task_graph = id(new ManiphestTaskGraph())
|
||||
|
@ -159,13 +151,50 @@ final class ManiphestTaskDetailController extends ManiphestController {
|
|||
->setText($search_text)
|
||||
->setDropdownMenu($dropdown_menu);
|
||||
|
||||
$graph_header = id(new PHUIHeaderView())
|
||||
->setHeader(pht('Task Graph'))
|
||||
->addActionLink($graph_menu);
|
||||
|
||||
$view->addPropertySection($graph_header, $graph_table);
|
||||
$related_tabs[] = id(new PHUITabView())
|
||||
->setName(pht('Task Graph'))
|
||||
->setKey('graph')
|
||||
->appendChild($graph_table);
|
||||
}
|
||||
|
||||
$related_tabs[] = $this->newMocksTab($task, $query);
|
||||
$related_tabs[] = $this->newMentionsTab($task, $query);
|
||||
|
||||
$tab_view = null;
|
||||
|
||||
$related_tabs = array_filter($related_tabs);
|
||||
if ($related_tabs) {
|
||||
$tab_group = new PHUITabGroupView();
|
||||
foreach ($related_tabs as $tab) {
|
||||
$tab_group->addTab($tab);
|
||||
}
|
||||
|
||||
$related_header = id(new PHUIHeaderView())
|
||||
->setHeader(pht('Related Objects'));
|
||||
|
||||
if ($graph_menu) {
|
||||
$related_header->addActionLink($graph_menu);
|
||||
}
|
||||
|
||||
$tab_view = id(new PHUIObjectBoxView())
|
||||
->setHeader($related_header)
|
||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
||||
->addTabGroup($tab_group);
|
||||
}
|
||||
|
||||
$view = id(new PHUITwoColumnView())
|
||||
->setHeader($header)
|
||||
->setCurtain($curtain)
|
||||
->setMainColumn(
|
||||
array(
|
||||
$tab_view,
|
||||
$timeline,
|
||||
$comment_view,
|
||||
))
|
||||
->addPropertySection(pht('Description'), $description)
|
||||
->addPropertySection(pht('Details'), $details);
|
||||
|
||||
|
||||
return $this->newPage()
|
||||
->setTitle($title)
|
||||
->setCrumbs($crumbs)
|
||||
|
@ -173,10 +202,7 @@ final class ManiphestTaskDetailController extends ManiphestController {
|
|||
array(
|
||||
$task->getPHID(),
|
||||
))
|
||||
->appendChild(
|
||||
array(
|
||||
$view,
|
||||
));
|
||||
->appendChild($view);
|
||||
|
||||
}
|
||||
|
||||
|
@ -356,8 +382,6 @@ final class ManiphestTaskDetailController extends ManiphestController {
|
|||
$edge_types = array(
|
||||
ManiphestTaskHasRevisionEdgeType::EDGECONST
|
||||
=> pht('Differential Revisions'),
|
||||
ManiphestTaskHasMockEdgeType::EDGECONST
|
||||
=> pht('Pholio Mocks'),
|
||||
);
|
||||
|
||||
$revisions_commits = array();
|
||||
|
@ -435,4 +459,73 @@ final class ManiphestTaskDetailController extends ManiphestController {
|
|||
return $section;
|
||||
}
|
||||
|
||||
private function newMocksTab(
|
||||
ManiphestTask $task,
|
||||
PhabricatorEdgeQuery $edge_query) {
|
||||
|
||||
$mock_type = ManiphestTaskHasMockEdgeType::EDGECONST;
|
||||
$mock_phids = $edge_query->getDestinationPHIDs(array(), array($mock_type));
|
||||
if (!$mock_phids) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$viewer = $this->getViewer();
|
||||
$handles = $viewer->loadHandles($mock_phids);
|
||||
|
||||
// TODO: It would be nice to render this as pinboard-style thumbnails,
|
||||
// similar to "{M123}", instead of a list of links.
|
||||
|
||||
$view = id(new PHUIPropertyListView())
|
||||
->addProperty(pht('Mocks'), $handles->renderList());
|
||||
|
||||
return id(new PHUITabView())
|
||||
->setName(pht('Mocks'))
|
||||
->setKey('mocks')
|
||||
->appendChild($view);
|
||||
}
|
||||
|
||||
private function newMentionsTab(
|
||||
ManiphestTask $task,
|
||||
PhabricatorEdgeQuery $edge_query) {
|
||||
|
||||
$in_type = PhabricatorObjectMentionedByObjectEdgeType::EDGECONST;
|
||||
$out_type = PhabricatorObjectMentionsObjectEdgeType::EDGECONST;
|
||||
|
||||
$in_phids = $edge_query->getDestinationPHIDs(array(), array($in_type));
|
||||
$out_phids = $edge_query->getDestinationPHIDs(array(), array($out_type));
|
||||
|
||||
// Filter out any mentioned users from the list. These are not generally
|
||||
// very interesting to show in a relationship summary since they usually
|
||||
// end up as subscribers anyway.
|
||||
|
||||
$user_type = PhabricatorPeopleUserPHIDType::TYPECONST;
|
||||
foreach ($out_phids as $key => $out_phid) {
|
||||
if (phid_get_type($out_phid) == $user_type) {
|
||||
unset($out_phids[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
if (!$in_phids && !$out_phids) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$viewer = $this->getViewer();
|
||||
$view = new PHUIPropertyListView();
|
||||
|
||||
if ($in_phids) {
|
||||
$in_handles = $viewer->loadHandles($in_phids);
|
||||
$view->addProperty(pht('Mentioned In'), $in_handles->renderList());
|
||||
}
|
||||
|
||||
if ($out_phids) {
|
||||
$out_handles = $viewer->loadHandles($out_phids);
|
||||
$view->addProperty(pht('Mentioned Here'), $out_handles->renderList());
|
||||
}
|
||||
|
||||
return id(new PHUITabView())
|
||||
->setName(pht('Mentions'))
|
||||
->setKey('mentions')
|
||||
->appendChild($view);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue