@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.

Give dashboards basic rendering and Ajax support

Summary: Ref T3583. Let dashboards "render", sorta.

Test Plan: {F149187}

Reviewers: chad, btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T3583

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

+97
+2
src/__phutil_library_map__.php
··· 1454 1454 'PhabricatorDashboardPanelTypeText' => 'applications/dashboard/paneltype/PhabricatorDashboardPanelTypeText.php', 1455 1455 'PhabricatorDashboardPanelViewController' => 'applications/dashboard/controller/PhabricatorDashboardPanelViewController.php', 1456 1456 'PhabricatorDashboardQuery' => 'applications/dashboard/query/PhabricatorDashboardQuery.php', 1457 + 'PhabricatorDashboardRenderingEngine' => 'applications/dashboard/engine/PhabricatorDashboardRenderingEngine.php', 1457 1458 'PhabricatorDashboardSearchEngine' => 'applications/dashboard/query/PhabricatorDashboardSearchEngine.php', 1458 1459 'PhabricatorDashboardTransaction' => 'applications/dashboard/storage/PhabricatorDashboardTransaction.php', 1459 1460 'PhabricatorDashboardTransactionEditor' => 'applications/dashboard/editor/PhabricatorDashboardTransactionEditor.php', ··· 4267 4268 'PhabricatorDashboardPanelTypeText' => 'PhabricatorDashboardPanelType', 4268 4269 'PhabricatorDashboardPanelViewController' => 'PhabricatorDashboardController', 4269 4270 'PhabricatorDashboardQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 4271 + 'PhabricatorDashboardRenderingEngine' => 'Phobject', 4270 4272 'PhabricatorDashboardSearchEngine' => 'PhabricatorApplicationSearchEngine', 4271 4273 'PhabricatorDashboardTransaction' => 'PhabricatorApplicationTransaction', 4272 4274 'PhabricatorDashboardTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
+6
src/applications/dashboard/controller/PhabricatorDashboardViewController.php
··· 36 36 ->setHeader($header) 37 37 ->addPropertyList($properties); 38 38 39 + $rendered_dashboard = id(new PhabricatorDashboardRenderingEngine()) 40 + ->setViewer($viewer) 41 + ->setDashboard($dashboard) 42 + ->renderDashboard(); 43 + 39 44 return $this->buildApplicationPage( 40 45 array( 41 46 $crumbs, 42 47 $box, 43 48 $timeline, 49 + $rendered_dashboard, 44 50 ), 45 51 array( 46 52 'title' => $title,
+32
src/applications/dashboard/engine/PhabricatorDashboardPanelRenderingEngine.php
··· 4 4 5 5 private $panel; 6 6 private $viewer; 7 + private $enableAsyncRendering; 8 + 9 + /** 10 + * Allow the engine to render the panel via Ajax. 11 + */ 12 + public function setEnableAsyncRendering($enable) { 13 + $this->enableAsyncRendering = $enable; 14 + return $this; 15 + } 7 16 8 17 public function setViewer(PhabricatorUser $viewer) { 9 18 $this->viewer = $viewer; ··· 34 43 'Phabricator.', 35 44 $panel->getPanelType())); 36 45 } 46 + 47 + if ($this->enableAsyncRendering) { 48 + if ($panel_type->shouldRenderAsync()) { 49 + return $this->renderAsyncPanel($panel); 50 + } 51 + } 52 + 37 53 38 54 return $panel_type->renderPanel($viewer, $panel); 39 55 } ··· 42 58 return id(new PHUIObjectBoxView()) 43 59 ->setHeaderText($title) 44 60 ->setFormErrors(array($body)); 61 + } 62 + 63 + private function renderAsyncPanel(PhabricatorDashboardPanel $panel) { 64 + $panel_id = celerity_generate_unique_node_id(); 65 + 66 + Javelin::initBehavior( 67 + 'dashboard-async-panel', 68 + array( 69 + 'panelID' => $panel_id, 70 + 'uri' => '/dashboard/panel/render/'.$panel->getID().'/', 71 + )); 72 + 73 + return id(new PHUIObjectBoxView()) 74 + ->setHeaderText($panel->getName()) 75 + ->setID($panel_id) 76 + ->appendChild(pht('Loading...')); 45 77 } 46 78 47 79 }
+34
src/applications/dashboard/engine/PhabricatorDashboardRenderingEngine.php
··· 1 + <?php 2 + 3 + final class PhabricatorDashboardRenderingEngine extends Phobject { 4 + 5 + private $dashboard; 6 + private $viewer; 7 + 8 + public function setViewer(PhabricatorUser $viewer) { 9 + $this->viewer = $viewer; 10 + return $this; 11 + } 12 + 13 + public function setDashboard(PhabricatorDashboard $dashboard) { 14 + $this->dashboard = $dashboard; 15 + return $this; 16 + } 17 + 18 + public function renderDashboard() { 19 + $dashboard = $this->dashboard; 20 + $viewer = $this->viewer; 21 + 22 + $result = array(); 23 + foreach ($dashboard->getPanels() as $panel) { 24 + $result[] = id(new PhabricatorDashboardPanelRenderingEngine()) 25 + ->setViewer($viewer) 26 + ->setPanel($panel) 27 + ->setEnableAsyncRendering(true) 28 + ->renderPanel(); 29 + } 30 + 31 + return $result; 32 + } 33 + 34 + }
+6
src/applications/dashboard/paneltype/PhabricatorDashboardPanelType.php
··· 48 48 ->appendChild(pht('TODO: Panel content goes here.')); 49 49 } 50 50 51 + public function shouldRenderAsync() { 52 + // TODO: For now, just make these things random so we can catch anything 53 + // that breaks. 54 + return (mt_rand(0, 1) == 1); 55 + } 56 + 51 57 }
+17
webroot/rsrc/js/application/dashboard/behavior-dashboard-async-panel.js
··· 1 + /** 2 + * @provides javelin-behavior-dashboard-async-panel 3 + * @requires javelin-behavior 4 + * javelin-dom 5 + * javelin-workflow 6 + */ 7 + 8 + JX.behavior('dashboard-async-panel', function(config) { 9 + var panel = JX.$(config.panelID); 10 + panel.style.opacity = '0.5'; 11 + 12 + new JX.Workflow(config.uri) 13 + .setHandler(function(r) { 14 + JX.DOM.replace(panel, JX.$H(r.panelMarkup)); 15 + }) 16 + .start(); 17 + });