mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 16:52:41 +01:00
Add a "tabs" dashboard panel type
Summary: Ref T4986. Allows you to create a dashboard panel out of dashboard panels. bwahaha Test Plan: {F155472} {F155473} Reviewers: chad, btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T4986 Differential Revision: https://secure.phabricator.com/D9141
This commit is contained in:
parent
63acd90cef
commit
bf6e87da24
6 changed files with 129 additions and 7 deletions
|
@ -1481,6 +1481,7 @@ phutil_register_library_map(array(
|
|||
'PhabricatorDashboardPanelTransactionQuery' => 'applications/dashboard/query/PhabricatorDashboardPanelTransactionQuery.php',
|
||||
'PhabricatorDashboardPanelType' => 'applications/dashboard/paneltype/PhabricatorDashboardPanelType.php',
|
||||
'PhabricatorDashboardPanelTypeQuery' => 'applications/dashboard/paneltype/PhabricatorDashboardPanelTypeQuery.php',
|
||||
'PhabricatorDashboardPanelTypeTabs' => 'applications/dashboard/paneltype/PhabricatorDashboardPanelTypeTabs.php',
|
||||
'PhabricatorDashboardPanelTypeText' => 'applications/dashboard/paneltype/PhabricatorDashboardPanelTypeText.php',
|
||||
'PhabricatorDashboardPanelViewController' => 'applications/dashboard/controller/PhabricatorDashboardPanelViewController.php',
|
||||
'PhabricatorDashboardQuery' => 'applications/dashboard/query/PhabricatorDashboardQuery.php',
|
||||
|
@ -4268,6 +4269,7 @@ phutil_register_library_map(array(
|
|||
'PhabricatorDashboardPanelTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
|
||||
'PhabricatorDashboardPanelType' => 'Phobject',
|
||||
'PhabricatorDashboardPanelTypeQuery' => 'PhabricatorDashboardPanelType',
|
||||
'PhabricatorDashboardPanelTypeTabs' => 'PhabricatorDashboardPanelType',
|
||||
'PhabricatorDashboardPanelTypeText' => 'PhabricatorDashboardPanelType',
|
||||
'PhabricatorDashboardPanelViewController' => 'PhabricatorDashboardController',
|
||||
'PhabricatorDashboardQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
|
||||
|
|
|
@ -20,6 +20,10 @@ final class PhabricatorDashboardPanelRenderingEngine extends Phobject {
|
|||
return $this;
|
||||
}
|
||||
|
||||
public function getParentPanelPHIDs() {
|
||||
return $this->parentPanelPHIDs;
|
||||
}
|
||||
|
||||
public function setViewer(PhabricatorUser $viewer) {
|
||||
$this->viewer = $viewer;
|
||||
return $this;
|
||||
|
@ -59,7 +63,7 @@ final class PhabricatorDashboardPanelRenderingEngine extends Phobject {
|
|||
}
|
||||
}
|
||||
|
||||
return $panel_type->renderPanel($viewer, $panel);
|
||||
return $panel_type->renderPanel($viewer, $panel, $this);
|
||||
} catch (Exception $ex) {
|
||||
return $this->renderErrorPanel(
|
||||
$panel->getName(),
|
||||
|
@ -83,7 +87,7 @@ final class PhabricatorDashboardPanelRenderingEngine extends Phobject {
|
|||
'dashboard-async-panel',
|
||||
array(
|
||||
'panelID' => $panel_id,
|
||||
'parentPanelPHIDs' => $this->parentPanelPHIDs,
|
||||
'parentPanelPHIDs' => $this->getParentPanelPHIDs(),
|
||||
'uri' => '/dashboard/panel/render/'.$panel->getID().'/',
|
||||
));
|
||||
|
||||
|
|
|
@ -42,9 +42,10 @@ abstract class PhabricatorDashboardPanelType extends Phobject {
|
|||
|
||||
public function renderPanel(
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorDashboardPanel $panel) {
|
||||
PhabricatorDashboardPanel $panel,
|
||||
PhabricatorDashboardPanelRenderingEngine $engine) {
|
||||
|
||||
$content = $this->renderPanelContent($viewer, $panel);
|
||||
$content = $this->renderPanelContent($viewer, $panel, $engine);
|
||||
|
||||
return id(new PHUIObjectBoxView())
|
||||
->addSigil('dashboard-panel')
|
||||
|
@ -56,7 +57,8 @@ abstract class PhabricatorDashboardPanelType extends Phobject {
|
|||
|
||||
protected function renderPanelContent(
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorDashboardPanel $panel) {
|
||||
PhabricatorDashboardPanel $panel,
|
||||
PhabricatorDashboardPanelRenderingEngine $engine) {
|
||||
return pht('TODO: Panel content goes here.');
|
||||
}
|
||||
|
||||
|
|
|
@ -32,7 +32,8 @@ final class PhabricatorDashboardPanelTypeQuery
|
|||
|
||||
protected function renderPanelContent(
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorDashboardPanel $panel) {
|
||||
PhabricatorDashboardPanel $panel,
|
||||
PhabricatorDashboardPanelRenderingEngine $engine) {
|
||||
|
||||
$class = $panel->getProperty('class');
|
||||
|
||||
|
|
|
@ -0,0 +1,112 @@
|
|||
<?php
|
||||
|
||||
final class PhabricatorDashboardPanelTypeTabs
|
||||
extends PhabricatorDashboardPanelType {
|
||||
|
||||
public function getPanelTypeKey() {
|
||||
return 'tabs';
|
||||
}
|
||||
|
||||
public function getPanelTypeName() {
|
||||
return pht('Tab Panel');
|
||||
}
|
||||
|
||||
public function getPanelTypeDescription() {
|
||||
return pht(
|
||||
'Use tabs to switch between several other panels.');
|
||||
}
|
||||
|
||||
public function getFieldSpecifications() {
|
||||
return array(
|
||||
'config' => array(
|
||||
'name' => pht('JSON Config'),
|
||||
'type' => 'remarkup',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
protected function renderPanelContent(
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorDashboardPanel $panel,
|
||||
PhabricatorDashboardPanelRenderingEngine $engine) {
|
||||
|
||||
$config = phutil_json_decode($panel->getProperty('config'), null);
|
||||
if ($config === null) {
|
||||
throw new Exception(pht('The configuration is not valid JSON.'));
|
||||
}
|
||||
|
||||
$list = id(new PHUIListView())
|
||||
->setType(PHUIListView::NAVBAR_LIST);
|
||||
|
||||
$selected = 0;
|
||||
|
||||
// TODO: Instead of using reveal-content here, we should write some nice
|
||||
// JS which loads panels on demand, manages tab selected states, and maybe
|
||||
// saves the tab you selected.
|
||||
|
||||
$node_ids = array();
|
||||
foreach ($config as $idx => $tab_spec) {
|
||||
$node_ids[$idx] = celerity_generate_unique_node_id();
|
||||
}
|
||||
|
||||
Javelin::initBehavior('phabricator-reveal-content');
|
||||
|
||||
foreach ($config as $idx => $tab_spec) {
|
||||
$hide_ids = $node_ids;
|
||||
unset($hide_ids[$idx]);
|
||||
|
||||
$list->addMenuItem(
|
||||
id(new PHUIListItemView())
|
||||
->setHref('#')
|
||||
->addSigil('reveal-content')
|
||||
->setMetadata(
|
||||
array(
|
||||
'showIDs' => array(idx($node_ids, $idx)),
|
||||
'hideIDs' => array_values($hide_ids),
|
||||
))
|
||||
->setName(idx($tab_spec, 'name', pht('Nameless Tab'))));
|
||||
}
|
||||
|
||||
$ids = ipull($config, 'panelID');
|
||||
if ($ids) {
|
||||
$panels = id(new PhabricatorDashboardPanelQuery())
|
||||
->setViewer($viewer)
|
||||
->withIDs($ids)
|
||||
->execute();
|
||||
} else {
|
||||
$panels = array();
|
||||
}
|
||||
|
||||
$parent_phids = $engine->getParentPanelPHIDs();
|
||||
$parent_phids[] = $panel->getPHID();
|
||||
|
||||
$content = array();
|
||||
foreach ($config as $idx => $tab_spec) {
|
||||
$panel_id = idx($tab_spec, 'panelID');
|
||||
$panel = idx($panels, $panel_id);
|
||||
|
||||
if ($panel) {
|
||||
$panel_content = id(new PhabricatorDashboardPanelRenderingEngine())
|
||||
->setViewer($viewer)
|
||||
->setEnableAsyncRendering(true)
|
||||
->setParentPanelPHIDs($parent_phids)
|
||||
->setPanel($panel)
|
||||
->renderPanel();
|
||||
} else {
|
||||
$panel_content = 'nope';
|
||||
}
|
||||
|
||||
$content[] = phutil_tag(
|
||||
'div',
|
||||
array(
|
||||
'id' => $node_ids[$idx],
|
||||
'style' => ($idx == $selected) ? null : 'display: none',
|
||||
),
|
||||
$panel_content);
|
||||
}
|
||||
|
||||
|
||||
return array($list, $content);
|
||||
}
|
||||
|
||||
}
|
|
@ -28,7 +28,8 @@ final class PhabricatorDashboardPanelTypeText
|
|||
|
||||
protected function renderPanelContent(
|
||||
PhabricatorUser $viewer,
|
||||
PhabricatorDashboardPanel $panel) {
|
||||
PhabricatorDashboardPanel $panel,
|
||||
PhabricatorDashboardPanelRenderingEngine $engine) {
|
||||
|
||||
$text = $panel->getProperty('text', '');
|
||||
|
||||
|
|
Loading…
Reference in a new issue