@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Use real Dashboard Panels to render the default hard-coded homepage, not hacky fake panels

Summary:
Ref T13272. Currently, the hard-coded default homepage looks like a dashboard but is actually rendered completely manually.

This means that various panel rendering improvements we'd like to make (including better "Show More" behavior and better handling of overheated queries) won't work on the home page naturally: we'd have to make these changes twice, once for dashboards and once for the home page.

Instead, build the home page out of real panels. This turns out to be significantly simpler (I think the backend part of panels/dashboards is mostly on solid footing, the frontend just needs some work).

Test Plan:
Loaded the default home page, saw a thing which looked the same as the old thing. Changes I know about / expect:

- The headers for these panels are no longer linked, but they weren't colorized before so the links were hard to find. I plan to improve panel behavior for "find/more" in a followup.
- I've removed the "follow us on twitter" default NUX if feed is empty, since this seems like unnecessary incidental complexity.
- (Internal exception behavior should be better, now.)

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T13272

Differential Revision: https://secure.phabricator.com/D20333

+43 -116
+43 -116
src/applications/home/view/PHUIHomeView.php
··· 77 77 return $view; 78 78 } 79 79 80 - private function buildHomepagePanel($title, $href, $view) { 81 - $title = phutil_tag( 82 - 'a', 83 - array( 84 - 'href' => $href, 85 - ), 86 - $title); 87 - 88 - $icon = id(new PHUIIconView()) 89 - ->setIcon('fa-search') 90 - ->setHref($href); 91 - 92 - $header = id(new PHUIHeaderView()) 93 - ->setHeader($title) 94 - ->addActionItem($icon); 95 - 96 - $box = id(new PHUIObjectBoxView()) 97 - ->setHeader($header); 98 - 99 - if ($view->getObjectList()) { 100 - $box->setObjectList($view->getObjectList()); 101 - } 102 - if ($view->getContent()) { 103 - $box->appendChild($view->getContent()); 104 - } 105 - 106 - return $box; 107 - } 108 - 109 80 private function buildRevisionPanel() { 110 81 $viewer = $this->getViewer(); 111 82 if (!$viewer->isLoggedIn()) { 112 83 return null; 113 84 } 114 85 115 - $engine = new DifferentialRevisionSearchEngine(); 116 - $engine->setViewer($viewer); 117 - $saved = $engine->buildSavedQueryFromBuiltin('active'); 118 - $query = $engine->buildQueryFromSavedQuery($saved); 119 - $pager = $engine->newPagerForSavedQuery($saved); 120 - $pager->setPageSize(15); 121 - $results = $engine->executeQuery($query, $pager); 122 - $view = $engine->renderResults($results, $saved); 123 - 124 - $title = pht('Active Revisions'); 125 - $href = '/differential/query/active/'; 86 + $panel = $this->newQueryPanel() 87 + ->setName(pht('Active Revisions')) 88 + ->setProperty('class', 'DifferentialRevisionSearchEngine') 89 + ->setProperty('key', 'active'); 126 90 127 - return $this->buildHomepagePanel($title, $href, $view); 91 + return $this->renderPanel($panel); 128 92 } 129 93 130 94 private function buildTasksPanel() { 131 95 $viewer = $this->getViewer(); 132 96 133 - $query = 'assigned'; 134 - $title = pht('Assigned Tasks'); 135 - $href = '/maniphest/query/assigned/'; 136 - if (!$viewer->isLoggedIn()) { 97 + if ($viewer->isLoggedIn()) { 98 + $name = pht('Assigned Tasks'); 99 + $query = 'assigned'; 100 + } else { 101 + $name = pht('Open Tasks'); 137 102 $query = 'open'; 138 - $title = pht('Open Tasks'); 139 - $href = '/maniphest/query/open/'; 140 103 } 141 104 142 - $engine = new ManiphestTaskSearchEngine(); 143 - $engine->setViewer($viewer); 144 - $saved = $engine->buildSavedQueryFromBuiltin($query); 145 - $query = $engine->buildQueryFromSavedQuery($saved); 146 - $pager = $engine->newPagerForSavedQuery($saved); 147 - $pager->setPageSize(15); 148 - $results = $engine->executeQuery($query, $pager); 149 - $view = $engine->renderResults($results, $saved); 105 + $panel = $this->newQueryPanel() 106 + ->setName($name) 107 + ->setProperty('class', 'ManiphestTaskSearchEngine') 108 + ->setProperty('key', $query) 109 + ->setProperty('limit', 15); 150 110 151 - return $this->buildHomepagePanel($title, $href, $view); 111 + return $this->renderPanel($panel); 152 112 } 153 113 154 114 public function buildFeedPanel() { 155 - $viewer = $this->getViewer(); 115 + $panel = $this->newQueryPanel() 116 + ->setName(pht('Recent Activity')) 117 + ->setProperty('class', 'PhabricatorFeedSearchEngine') 118 + ->setProperty('key', 'all') 119 + ->setProperty('limit', 40); 120 + 121 + return $this->renderPanel($panel); 122 + } 156 123 157 - $engine = new PhabricatorFeedSearchEngine(); 158 - $engine->setViewer($viewer); 159 - $saved = $engine->buildSavedQueryFromBuiltin('all'); 160 - $query = $engine->buildQueryFromSavedQuery($saved); 161 - $pager = $engine->newPagerForSavedQuery($saved); 162 - $pager->setPageSize(40); 163 - $results = $engine->executeQuery($query, $pager); 164 - $view = $engine->renderResults($results, $saved); 165 - // Low tech NUX. 166 - if (!$results && ($viewer->getIsAdmin() == 1)) { 167 - $instance = PhabricatorEnv::getEnvConfig('cluster.instance'); 168 - if (!$instance) { 169 - $content = pht(<<<EOT 170 - Welcome to Phabricator, here are some links to get you started: 171 - - [[ /config/ | Configure Phabricator ]] 172 - - [[ /guides/ | Quick Start Guide ]] 173 - - [[ /diffusion/ | Create a Repository ]] 174 - - [[ /people/invite/send/ | Invite People ]] 175 - - [[ https://twitter.com/phabricator/ | Follow us on Twitter ]] 176 - EOT 177 - ); 178 - } else { 179 - $content = pht(<<<EOT 180 - Welcome to Phabricator, here are some links to get you started: 181 - - [[ /guides/ | Quick Start Guide ]] 182 - - [[ /diffusion/ | Create a Repository ]] 183 - - [[ https://twitter.com/phabricator/ | Follow us on Twitter ]] 184 - EOT 185 - ); 186 - } 124 + public function buildRepositoryPanel() { 125 + $panel = $this->newQueryPanel() 126 + ->setName(pht('Active Repositories')) 127 + ->setProperty('class', 'PhabricatorRepositorySearchEngine') 128 + ->setProperty('key', 'active') 129 + ->setProperty('limit', 5); 187 130 188 - if ($results) { 189 - $list = new PHUIObjectItemListView(); 190 - $view = new PhabricatorApplicationSearchResultView(); 191 - $view->setObjectList($list); 192 - } else { 193 - $content = id(new PHUIBoxView()) 194 - ->appendChild(new PHUIRemarkupView($viewer, $content)) 195 - ->addClass('mlt mlb msr msl'); 196 - $view = new PhabricatorApplicationSearchResultView(); 197 - $view->setContent($content); 198 - } 199 - } 131 + return $this->renderPanel($panel); 132 + } 200 133 201 - $title = pht('Recent Activity'); 202 - $href = '/feed/'; 134 + private function newQueryPanel() { 135 + $panel_type = id(new PhabricatorDashboardQueryPanelType()) 136 + ->getPanelTypeKey(); 203 137 204 - return $this->buildHomepagePanel($title, $href, $view); 138 + return id(new PhabricatorDashboardPanel()) 139 + ->setPanelType($panel_type); 205 140 } 206 141 207 - public function buildRepositoryPanel() { 142 + private function renderPanel(PhabricatorDashboardPanel $panel) { 208 143 $viewer = $this->getViewer(); 209 144 210 - $engine = new PhabricatorRepositorySearchEngine(); 211 - $engine->setViewer($viewer); 212 - $saved = $engine->buildSavedQueryFromBuiltin('active'); 213 - $query = $engine->buildQueryFromSavedQuery($saved); 214 - $pager = $engine->newPagerForSavedQuery($saved); 215 - $pager->setPageSize(5); 216 - $results = $engine->executeQuery($query, $pager); 217 - $view = $engine->renderResults($results, $saved); 218 - 219 - $title = pht('Active Repositories'); 220 - $href = '/diffusion/'; 221 - 222 - return $this->buildHomepagePanel($title, $href, $view); 145 + return id(new PhabricatorDashboardPanelRenderingEngine()) 146 + ->setViewer($viewer) 147 + ->setPanel($panel) 148 + ->setParentPanelPHIDs(array()) 149 + ->renderPanel(); 223 150 } 224 151 225 152 }