diff --git a/src/applications/dashboard/engine/PhabricatorDashboardPanelRenderingEngine.php b/src/applications/dashboard/engine/PhabricatorDashboardPanelRenderingEngine.php --- a/src/applications/dashboard/engine/PhabricatorDashboardPanelRenderingEngine.php +++ b/src/applications/dashboard/engine/PhabricatorDashboardPanelRenderingEngine.php @@ -214,6 +214,18 @@ $header = id(new PhabricatorActionHeaderView()) ->setHeaderTitle($panel->getName()) ->setHeaderColor(PhabricatorActionHeaderView::HEADER_LIGHTBLUE); + + $panel_type = $panel->getImplementation(); + try { + $header = $panel_type->adjustPanelHeader( + $this->getViewer(), + $panel, + $this, + $header); + } catch (Exception $ex) { + phlog($ex); + $header->setHeaderColor(PhabricatorActionHeaderView::HEADER_RED); + } break; } return $header; @@ -247,6 +259,7 @@ return $header; } + /** * Detect graph cycles in panels, and deeply nested panels. * diff --git a/src/applications/dashboard/paneltype/PhabricatorDashboardPanelType.php b/src/applications/dashboard/paneltype/PhabricatorDashboardPanelType.php --- a/src/applications/dashboard/paneltype/PhabricatorDashboardPanelType.php +++ b/src/applications/dashboard/paneltype/PhabricatorDashboardPanelType.php @@ -30,6 +30,14 @@ return true; } + public function adjustPanelHeader( + PhabricatorUser $viewer, + PhabricatorDashboardPanel $panel, + PhabricatorDashboardPanelRenderingEngine $engine, + PhabricatorActionHeaderView $header) { + return $header; + } + public static function getAllPanelTypes() { static $types; diff --git a/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeQuery.php b/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeQuery.php --- a/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeQuery.php +++ b/src/applications/dashboard/paneltype/PhabricatorDashboardPanelTypeQuery.php @@ -40,16 +40,7 @@ PhabricatorDashboardPanel $panel, PhabricatorDashboardPanelRenderingEngine $engine) { - $class = $panel->getProperty('class'); - - $engine = PhabricatorApplicationSearchEngine::getEngineByClassName($class); - if (!$engine) { - throw new Exception( - pht( - 'The application search engine "%s" is not known to Phabricator!', - $class)); - } - + $engine = $this->getSearchEngine($panel); $engine->setViewer($viewer); $key = $panel->getProperty('key'); @@ -58,7 +49,7 @@ } else { $saved = id(new PhabricatorSavedQueryQuery()) ->setViewer($viewer) - ->withEngineClassNames(array($class)) + ->withEngineClassNames(array(get_class($engine))) ->withQueryKeys(array($key)) ->executeOne(); } @@ -68,7 +59,7 @@ pht( 'Query "%s" is unknown to application search engine "%s"!', $key, - $class)); + get_class($engine))); } $query = $engine->buildQueryFromSavedQuery($saved); @@ -86,4 +77,35 @@ return $engine->renderResults($results, $saved); } + + public function adjustPanelHeader( + PhabricatorUser $viewer, + PhabricatorDashboardPanel $panel, + PhabricatorDashboardPanelRenderingEngine $engine, + PhabricatorActionHeaderView $header) { + + $search_engine = $this->getSearchEngine($panel); + $key = $panel->getProperty('key'); + + $action_edit = id(new PHUIIconView()) + ->setIconFont('fa-list') + ->setHref($search_engine->getQueryResultsPageURI($key)); + $header->addAction($action_edit); + + return $header; + } + + private function getSearchEngine(PhabricatorDashboardPanel $panel) { + $class = $panel->getProperty('class'); + $engine = PhabricatorApplicationSearchEngine::getEngineByClassName($class); + if (!$engine) { + throw new Exception( + pht( + 'The application search engine "%s" is not known to Phabricator!', + $class)); + } + + return $engine; + } + }