From 8aec3f916b39c32c5894c72343edb38b97cf6e12 Mon Sep 17 00:00:00 2001 From: epriestley Date: Sun, 12 Jul 2020 12:41:18 -0700 Subject: [PATCH] Unify more build, property, auditor, and status information into "CommitGraphView" Summary: Ref T13552. In unifying the various Graph/List/Table commit views, some information was dropped -- particularly, audit status. Restore most of it. The result isn't very pretty, but has most of the required information. Test Plan: {F7637411} Maniphest Tasks: T13552 Differential Revision: https://secure.phabricator.com/D21417 --- resources/celerity/map.php | 6 +- .../query/PhabricatorCommitSearchEngine.php | 3 +- .../view/DiffusionCommitGraphView.php | 229 +++++++++++++----- src/view/phui/PHUIObjectItemView.php | 41 ++++ .../phui/object-item/phui-oi-list-view.css | 6 + 5 files changed, 216 insertions(+), 69 deletions(-) diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 6c4d8774a9..fb63b68822 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -9,7 +9,7 @@ return array( 'names' => array( 'conpherence.pkg.css' => '0e3cf785', 'conpherence.pkg.js' => '020aebcf', - 'core.pkg.css' => '9b2e2e20', + 'core.pkg.css' => '9cb7cb3f', 'core.pkg.js' => '845355f4', 'dark-console.pkg.js' => '187792c2', 'differential.pkg.css' => '5c459f92', @@ -133,7 +133,7 @@ return array( 'rsrc/css/phui/object-item/phui-oi-color.css' => 'b517bfa0', 'rsrc/css/phui/object-item/phui-oi-drag-ui.css' => 'da15d3dc', 'rsrc/css/phui/object-item/phui-oi-flush-ui.css' => '490e2e2e', - 'rsrc/css/phui/object-item/phui-oi-list-view.css' => 'd7723ecc', + 'rsrc/css/phui/object-item/phui-oi-list-view.css' => '4b0def39', 'rsrc/css/phui/object-item/phui-oi-simple-ui.css' => '6a30fa46', 'rsrc/css/phui/phui-action-list.css' => '1b0085b2', 'rsrc/css/phui/phui-action-panel.css' => '6c386cbf', @@ -866,7 +866,7 @@ return array( 'phui-oi-color-css' => 'b517bfa0', 'phui-oi-drag-ui-css' => 'da15d3dc', 'phui-oi-flush-ui-css' => '490e2e2e', - 'phui-oi-list-view-css' => 'd7723ecc', + 'phui-oi-list-view-css' => '4b0def39', 'phui-oi-simple-ui-css' => '6a30fa46', 'phui-pager-css' => 'd022c7ad', 'phui-pinboard-view-css' => '1f08f5d8', diff --git a/src/applications/audit/query/PhabricatorCommitSearchEngine.php b/src/applications/audit/query/PhabricatorCommitSearchEngine.php index 326cb5c9b6..37e8d563b4 100644 --- a/src/applications/audit/query/PhabricatorCommitSearchEngine.php +++ b/src/applications/audit/query/PhabricatorCommitSearchEngine.php @@ -222,7 +222,8 @@ final class PhabricatorCommitSearchEngine $bucket = $this->getResultBucket($query); $template = id(new DiffusionCommitGraphView()) - ->setViewer($viewer); + ->setViewer($viewer) + ->setShowAuditors(true); $views = array(); if ($bucket) { diff --git a/src/applications/diffusion/view/DiffusionCommitGraphView.php b/src/applications/diffusion/view/DiffusionCommitGraphView.php index ae72d50077..124a94fc69 100644 --- a/src/applications/diffusion/view/DiffusionCommitGraphView.php +++ b/src/applications/diffusion/view/DiffusionCommitGraphView.php @@ -14,6 +14,8 @@ final class DiffusionCommitGraphView private $buildableMap; private $revisionMap; + private $showAuditors; + public function setHistory(array $history) { assert_instances_of($history, 'DiffusionPathChange'); $this->history = $history; @@ -34,6 +36,15 @@ final class DiffusionCommitGraphView return $this->commits; } + public function setShowAuditors($show_auditors) { + $this->showAuditors = $show_auditors; + return $this; + } + + public function getShowAuditors() { + return $this->showAuditors; + } + public function setParents(array $parents) { $this->parents = $parents; return $this; @@ -92,10 +103,36 @@ final class DiffusionCommitGraphView } private function newObjectItemViews() { + $viewer = $this->getViewer(); + require_celerity_resource('diffusion-css'); $show_builds = $this->shouldShowBuilds(); $show_revisions = $this->shouldShowRevisions(); + $show_auditors = $this->shouldShowAuditors(); + + $phids = array(); + + if ($show_revisions) { + $revision_map = $this->getRevisionMap(); + foreach ($revision_map as $revisions) { + foreach ($revisions as $revision) { + $phids[] = $revision->getPHID(); + } + } + } + + if ($show_auditors) { + $commits = $this->getCommitMap(); + foreach ($commits as $commit) { + $audits = $commit->getAudits(); + foreach ($audits as $auditor) { + $phids[] = $auditor->getAuditorPHID(); + } + } + } + + $handles = $viewer->loadHandles($phids); $views = array(); @@ -111,38 +148,52 @@ final class DiffusionCommitGraphView $short_hash = $this->getCommitObjectName($hash); $is_disabled = $this->getCommitIsDisabled($commit); - $author_view = $this->getCommitAuthorView($commit); - $item_view = id(new PHUIObjectItemView()) + ->setViewer($viewer) ->setHeader($commit_description) ->setObjectName($short_hash) ->setHref($commit_link) ->setDisabled($is_disabled); - if ($author_view !== null) { - $item_view->addAttribute($author_view); - } + $this->addBrowseAction($item_view, $hash); - $browse_button = $this->newBrowseButton($hash); - - $build_view = null; if ($show_builds) { - $build_view = $this->newBuildView($hash); + $this->addBuildAction($item_view, $hash); } - $item_view->setSideColumn( - array( - $build_view, - $browse_button, - )); + $this->addAuditAction($item_view, $hash); + + if ($show_auditors) { + $auditor_list = $item_view->newPropertyList(); + if ($commit) { + $auditors = $this->newAuditorList($commit, $handles); + $auditor_list->addProperty(pht('Auditors'), $auditors); + } + } + + $property_list = $item_view->newPropertyList(); + + if ($commit) { + $author_view = $this->getCommitAuthorView($commit); + if ($author_view) { + $property_list->addProperty( + pht('Author'), + $this->getCommitAuthorView($commit)); + } + } - $revision_view = null; if ($show_revisions) { - $revision_view = $this->newRevisionView($hash); - } + if ($commit) { + $revisions = $this->getRevisions($commit); + if ($revisions) { + $revision = head($revisions); + $handle = $handles[$revision->getPHID()]; - if ($revision_view !== null) { - $item_view->addAttribute($revision_view); + $property_list->addProperty( + pht('Revision'), + $handle->renderLink()); + } + } } $views[$hash] = $item_view; @@ -172,6 +223,7 @@ final class DiffusionCommitGraphView $item_view = $views[$hash]; $list_view = id(new PHUIObjectItemListView()) + ->setViewer($viewer) ->setFlush(true) ->addItem($item_view); @@ -268,6 +320,10 @@ final class DiffusionCommitGraphView return $show_revisions; } + private function shouldShowAuditors() { + return $this->getShowAuditors(); + } + private function newHistoryItems() { $items = array(); @@ -367,24 +423,6 @@ final class DiffusionCommitGraphView return $commit->newCommitAuthorView($viewer); } - private function newBrowseButton($hash) { - $repository = $this->getRepository(); - - if ($repository) { - $drequest = $this->getDiffusionRequest(); - - return $this->linkBrowse( - $drequest->getPath(), - array( - 'commit' => $hash, - 'branch' => $drequest->getBranch(), - ), - $as_button = true); - } - - return null; - } - private function getCommit($hash) { $commit_map = $this->getCommitMap(); return idx($commit_map, $hash); @@ -399,18 +437,84 @@ final class DiffusionCommitGraphView return $this->commitMap; } - private function newBuildView($hash) { + private function addBrowseAction(PHUIObjectItemView $item, $hash) { + $repository = $this->getRepository(); + + if (!$repository) { + return; + } + + $drequest = $this->getDiffusionRequest(); + $path = $drequest->getPath(); + + $uri = $drequest->generateURI( + array( + 'action' => 'browse', + 'path' => $path, + )); + + $item->newAction() + ->setIcon('fa-folder-open-o bluegrey') + ->setName(pht('Browse Repository')) + ->setHref($uri); + } + + private function addBuildAction(PHUIObjectItemView $item, $hash) { + $is_disabled = true; + + $buildable = null; + $commit = $this->getCommit($hash); if (!$commit) { - return null; + $buildable = $this->getBuildable($commit); } - $buildable = $this->getBuildable($commit); - if (!$buildable) { - return null; + if ($buildable) { + $icon = $buildable->getStatusIcon(); + $color = $buildable->getStatusColor(); + $name = $buildable->getStatusDisplayName(); + $uri = $buildable->getURI(); + } else { + $icon = 'fa-times'; + $color = 'grey'; + $name = pht('No Builds'); + $uri = null; } - return $this->renderBuildable($buildable, 'button'); + $item->newAction() + ->setIcon($icon.' '.$color) + ->setName($name) + ->setHref($uri) + ->setDisabled(($uri === null)); + } + + private function addAuditAction(PHUIObjectItemView $item_view, $hash) { + $commit = $this->getCommit($hash); + + if ($commit) { + $status = $commit->getAuditStatusObject(); + + $text = $status->getName(); + $color = $status->getColor(); + $icon = $status->getIcon(); + + $uri = $commit->getURI(); + + $is_disabled = $status->isNoAudit(); + } else { + $text = pht('No Audit'); + $color = 'grey'; + $icon = 'fa-times'; + $uri = null; + + $is_disabled = true; + } + + $item_view->newAction() + ->setIcon($icon.' '.$color) + ->setName($text) + ->setHref($uri) + ->setDisabled($is_disabled); } private function getBuildable(PhabricatorRepositoryCommit $commit) { @@ -428,28 +532,6 @@ final class DiffusionCommitGraphView return $this->buildableMap; } - private function newRevisionView($hash) { - $commit = $this->getCommit($hash); - if (!$commit) { - return null; - } - - $revisions = $this->getRevisions($commit); - if (!$revisions) { - return null; - } - - $revision = head($revisions); - - return id(new PHUITagView()) - ->setName($revision->getMonogram()) - ->setType(PHUITagView::TYPE_SHADE) - ->setColor(PHUITagView::COLOR_BLUE) - ->setHref($revision->getURI()) - ->setBorder(PHUITagView::BORDER_NONE) - ->setSlimShady(true); - } - private function getRevisions(PhabricatorRepositoryCommit $commit) { $revision_map = $this->getRevisionMap(); return idx($revision_map, $commit->getPHID(), array()); @@ -510,4 +592,21 @@ final class DiffusionCommitGraphView return $commits; } + private function newAuditorList( + PhabricatorRepositoryCommit $commit, + $handles) { + + $auditors = $commit->getAudits(); + if (!$auditors) { + return phutil_tag('em', array(), pht('None')); + } + + $auditor_phids = mpull($auditors, 'getAuditorPHID'); + $auditor_list = $handles->newSublist($auditor_phids) + ->renderList() + ->setAsInline(true); + + return $auditor_list; + } + } diff --git a/src/view/phui/PHUIObjectItemView.php b/src/view/phui/PHUIObjectItemView.php index b5ad5a7fd6..b96dfc748f 100644 --- a/src/view/phui/PHUIObjectItemView.php +++ b/src/view/phui/PHUIObjectItemView.php @@ -16,6 +16,7 @@ final class PHUIObjectItemView extends AphrontTagView { private $bylines = array(); private $grippable; private $actions = array(); + private $actionItems = array(); private $headIcons = array(); private $disabled; private $imageURI; @@ -29,6 +30,7 @@ final class PHUIObjectItemView extends AphrontTagView { private $coverImage; private $description; private $clickable; + private $propertyLists = array(); private $selectableName; private $selectableValue; @@ -212,6 +214,18 @@ final class PHUIObjectItemView extends AphrontTagView { return $this; } + public function newAction() { + $action = new PhabricatorActionView(); + $this->actionItems[] = $action; + return $action; + } + + public function newPropertyList() { + $list = new PHUIPropertyListView(); + $this->propertyLists[] = $list; + return $list; + } + /** * This method has been deprecated, use @{method:setImageIcon} instead. * @@ -598,6 +612,14 @@ final class PHUIObjectItemView extends AphrontTagView { ''); } + $property_lists = null; + if ($this->propertyLists) { + $property_lists[] = phutil_tag( + 'div', + array(), + $this->propertyLists); + } + $content = phutil_tag( 'div', array( @@ -606,6 +628,7 @@ final class PHUIObjectItemView extends AphrontTagView { array( $subhead, $attrs, + $property_lists, $this->renderChildren(), )); @@ -733,6 +756,23 @@ final class PHUIObjectItemView extends AphrontTagView { )); } + $column4 = null; + if ($this->actionItems) { + $action_list = id(new PhabricatorActionListView()) + ->setViewer($viewer); + + foreach ($this->actionItems as $action_item) { + $action_list->addAction($action_item); + } + + $column4 = phutil_tag( + 'div', + array( + 'class' => 'phui-oi-col2 phui-oi-action-list', + ), + $action_list); + } + $table = phutil_tag( 'div', array( @@ -745,6 +785,7 @@ final class PHUIObjectItemView extends AphrontTagView { $column1, $column2, $column3, + $column4, ))); $box = phutil_tag( diff --git a/webroot/rsrc/css/phui/object-item/phui-oi-list-view.css b/webroot/rsrc/css/phui/object-item/phui-oi-list-view.css index 85f83802e7..f38731f3da 100644 --- a/webroot/rsrc/css/phui/object-item/phui-oi-list-view.css +++ b/webroot/rsrc/css/phui/object-item/phui-oi-list-view.css @@ -725,3 +725,9 @@ ul.phui-oi-list-view .phui-oi-selectable padding: 8px 0; background: linear-gradient({$lightbluebackground}, #fff 66%, #fff); } + +.phui-oi-action-list { + background: {$lightbluebackground}; + border-left: 1px solid {$thinblueborder}; + padding: 4px; +}