mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-23 15:22:41 +01:00
Add a "start with a template" option when creating dashboards
Summary: Ref T5317. This primarily makes it easier for new administrators to build a dashboard for the first time, without going too crazy on technical complexity. Test Plan: See screenshots. Reviewers: btrahan, chad Reviewed By: chad Subscribers: epriestley Maniphest Tasks: T5317 Differential Revision: https://secure.phabricator.com/D9651
This commit is contained in:
parent
cfa4156441
commit
f52075d8aa
2 changed files with 189 additions and 1 deletions
|
@ -30,6 +30,19 @@ final class PhabricatorDashboardEditController
|
||||||
|
|
||||||
$is_new = false;
|
$is_new = false;
|
||||||
} else {
|
} else {
|
||||||
|
if (!$request->getStr('edit')) {
|
||||||
|
if ($request->isFormPost()) {
|
||||||
|
switch ($request->getStr('template')) {
|
||||||
|
case 'empty':
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return $this->processBuildTemplateRequest($request);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return $this->processTemplateRequest($request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$dashboard = PhabricatorDashboard::initializeNewDashboard($viewer);
|
$dashboard = PhabricatorDashboard::initializeNewDashboard($viewer);
|
||||||
|
|
||||||
$is_new = true;
|
$is_new = true;
|
||||||
|
@ -61,7 +74,7 @@ final class PhabricatorDashboardEditController
|
||||||
$e_name = true;
|
$e_name = true;
|
||||||
|
|
||||||
$validation_exception = null;
|
$validation_exception = null;
|
||||||
if ($request->isFormPost()) {
|
if ($request->isFormPost() && $request->getStr('edit')) {
|
||||||
$v_name = $request->getStr('name');
|
$v_name = $request->getStr('name');
|
||||||
$v_layout_mode = $request->getStr('layout_mode');
|
$v_layout_mode = $request->getStr('layout_mode');
|
||||||
$v_view_policy = $request->getStr('viewPolicy');
|
$v_view_policy = $request->getStr('viewPolicy');
|
||||||
|
@ -116,6 +129,7 @@ final class PhabricatorDashboardEditController
|
||||||
PhabricatorDashboardLayoutConfig::getLayoutModeSelectOptions();
|
PhabricatorDashboardLayoutConfig::getLayoutModeSelectOptions();
|
||||||
$form = id(new AphrontFormView())
|
$form = id(new AphrontFormView())
|
||||||
->setUser($viewer)
|
->setUser($viewer)
|
||||||
|
->addHiddenInput('edit', true)
|
||||||
->appendChild(
|
->appendChild(
|
||||||
id(new AphrontFormTextControl())
|
id(new AphrontFormTextControl())
|
||||||
->setLabel(pht('Name'))
|
->setLabel(pht('Name'))
|
||||||
|
@ -161,4 +175,172 @@ final class PhabricatorDashboardEditController
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function processTemplateRequest(AphrontRequest $request) {
|
||||||
|
$viewer = $request->getUser();
|
||||||
|
|
||||||
|
$template_control = id(new AphrontFormRadioButtonControl())
|
||||||
|
->setName(pht('template'))
|
||||||
|
->setValue($request->getStr('template', 'empty'))
|
||||||
|
->addButton(
|
||||||
|
'empty',
|
||||||
|
pht('Empty'),
|
||||||
|
pht('Start with a blank canvas.'))
|
||||||
|
->addButton(
|
||||||
|
'simple',
|
||||||
|
pht('Simple Template'),
|
||||||
|
pht(
|
||||||
|
'Start with a simple dashboard with a welcome message, a feed of '.
|
||||||
|
'recent events, and a few starter panels.'));
|
||||||
|
|
||||||
|
$form = id(new AphrontFormView())
|
||||||
|
->setUser($viewer)
|
||||||
|
->appendRemarkupInstructions(
|
||||||
|
pht('Choose a dashboard template to start with.'))
|
||||||
|
->appendChild($template_control);
|
||||||
|
|
||||||
|
return $this->newDialog()
|
||||||
|
->setTitle(pht('Create Dashboard'))
|
||||||
|
->setWidth(AphrontDialogView::WIDTH_FORM)
|
||||||
|
->appendChild($form->buildLayoutView())
|
||||||
|
->addCancelButton('/dashboard/')
|
||||||
|
->addSubmitButton(pht('Continue'));
|
||||||
|
}
|
||||||
|
|
||||||
|
private function processBuildTemplateRequest(AphrontRequest $request) {
|
||||||
|
$viewer = $request->getUser();
|
||||||
|
$template = $request->getStr('template');
|
||||||
|
|
||||||
|
$bare_panel = PhabricatorDashboardPanel::initializeNewPanel($viewer);
|
||||||
|
$panel_phids = array();
|
||||||
|
|
||||||
|
switch ($template) {
|
||||||
|
case 'simple':
|
||||||
|
$v_name = pht('New Simple Dashboard');
|
||||||
|
|
||||||
|
$welcome_panel = $this->newPanel(
|
||||||
|
$request,
|
||||||
|
$viewer,
|
||||||
|
'text',
|
||||||
|
pht('Welcome'),
|
||||||
|
array(
|
||||||
|
'text' => pht(
|
||||||
|
"This is a simple template dashboard. You can edit this panel ".
|
||||||
|
"to change this text and replace it with a welcome message, or ".
|
||||||
|
"leave this placeholder text as-is to give your dashboard a ".
|
||||||
|
"rustic, authentic feel.".
|
||||||
|
"\n\n".
|
||||||
|
"You can drag, remove, add, and edit panels to customize the ".
|
||||||
|
"rest of this dashboard to show the information you want.".
|
||||||
|
"\n\n".
|
||||||
|
"To install this dashboard on the home page, use the ".
|
||||||
|
"**Install Dashboard** action link above."),
|
||||||
|
));
|
||||||
|
$panel_phids[] = $welcome_panel->getPHID();
|
||||||
|
|
||||||
|
$feed_panel = $this->newPanel(
|
||||||
|
$request,
|
||||||
|
$viewer,
|
||||||
|
'query',
|
||||||
|
pht('Recent Activity'),
|
||||||
|
array(
|
||||||
|
'class' => 'PhabricatorFeedSearchEngine',
|
||||||
|
'key' => 'all',
|
||||||
|
));
|
||||||
|
$panel_phids[] = $feed_panel->getPHID();
|
||||||
|
|
||||||
|
$task_panel = $this->newPanel(
|
||||||
|
$request,
|
||||||
|
$viewer,
|
||||||
|
'query',
|
||||||
|
pht('Recent Tasks'),
|
||||||
|
array(
|
||||||
|
'class' => 'ManiphestTaskSearchEngine',
|
||||||
|
'key' => 'all',
|
||||||
|
));
|
||||||
|
$panel_phids[] = $task_panel->getPHID();
|
||||||
|
|
||||||
|
$commit_panel = $this->newPanel(
|
||||||
|
$request,
|
||||||
|
$viewer,
|
||||||
|
'query',
|
||||||
|
pht('Recent Commits'),
|
||||||
|
array(
|
||||||
|
'class' => 'PhabricatorCommitSearchEngine',
|
||||||
|
'key' => 'all',
|
||||||
|
));
|
||||||
|
$panel_phids[] = $commit_panel->getPHID();
|
||||||
|
|
||||||
|
$mode_2_and_1 = PhabricatorDashboardLayoutConfig::MODE_THIRDS_AND_THIRD;
|
||||||
|
$layout = id(new PhabricatorDashboardLayoutConfig())
|
||||||
|
->setLayoutMode($mode_2_and_1)
|
||||||
|
->setPanelLocation(0, $welcome_panel->getPHID())
|
||||||
|
->setPanelLocation(0, $task_panel->getPHID())
|
||||||
|
->setPanelLocation(0, $commit_panel->getPHID())
|
||||||
|
->setPanelLocation(1, $feed_panel->getPHID());
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Exception(pht('Unknown dashboard template %s!', $template));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the dashboard.
|
||||||
|
|
||||||
|
$dashboard = PhabricatorDashboard::initializeNewDashboard($viewer)
|
||||||
|
->setLayoutConfigFromObject($layout);
|
||||||
|
|
||||||
|
$xactions = array();
|
||||||
|
|
||||||
|
$xactions[] = id(new PhabricatorDashboardTransaction())
|
||||||
|
->setTransactionType(PhabricatorDashboardTransaction::TYPE_NAME)
|
||||||
|
->setNewValue($v_name);
|
||||||
|
|
||||||
|
$xactions[] = id(new PhabricatorDashboardTransaction())
|
||||||
|
->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
|
||||||
|
->setMetadataValue(
|
||||||
|
'edge:type',
|
||||||
|
PhabricatorEdgeConfig::TYPE_DASHBOARD_HAS_PANEL)
|
||||||
|
->setNewValue(
|
||||||
|
array(
|
||||||
|
'+' => array_fuse($panel_phids),
|
||||||
|
));
|
||||||
|
|
||||||
|
$editor = id(new PhabricatorDashboardTransactionEditor())
|
||||||
|
->setActor($viewer)
|
||||||
|
->setContinueOnNoEffect(true)
|
||||||
|
->setContentSourceFromRequest($request)
|
||||||
|
->applyTransactions($dashboard, $xactions);
|
||||||
|
|
||||||
|
$manage_uri = $this->getApplicationURI('manage/'.$dashboard->getID().'/');
|
||||||
|
|
||||||
|
return id(new AphrontRedirectResponse())
|
||||||
|
->setURI($manage_uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function newPanel(
|
||||||
|
AphrontRequest $request,
|
||||||
|
PhabricatorUser $viewer,
|
||||||
|
$type,
|
||||||
|
$name,
|
||||||
|
array $properties) {
|
||||||
|
|
||||||
|
$panel = PhabricatorDashboardPanel::initializeNewPanel($viewer)
|
||||||
|
->setPanelType($type)
|
||||||
|
->setProperties($properties);
|
||||||
|
|
||||||
|
$xactions = array();
|
||||||
|
|
||||||
|
$xactions[] = id(new PhabricatorDashboardPanelTransaction())
|
||||||
|
->setTransactionType(PhabricatorDashboardPanelTransaction::TYPE_NAME)
|
||||||
|
->setNewValue($name);
|
||||||
|
|
||||||
|
$editor = id(new PhabricatorDashboardPanelTransactionEditor())
|
||||||
|
->setActor($viewer)
|
||||||
|
->setContinueOnNoEffect(true)
|
||||||
|
->setContentSourceFromRequest($request)
|
||||||
|
->applyTransactions($panel, $xactions);
|
||||||
|
|
||||||
|
return $panel;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,6 +101,12 @@ final class PhabricatorDashboardManageController
|
||||||
$dashboard,
|
$dashboard,
|
||||||
PhabricatorPolicyCapability::CAN_EDIT);
|
PhabricatorPolicyCapability::CAN_EDIT);
|
||||||
|
|
||||||
|
$actions->addAction(
|
||||||
|
id(new PhabricatorActionView())
|
||||||
|
->setName(pht('View Dashboard'))
|
||||||
|
->setIcon('fa-columns')
|
||||||
|
->setHref($this->getApplicationURI("view/{$id}/")));
|
||||||
|
|
||||||
$actions->addAction(
|
$actions->addAction(
|
||||||
id(new PhabricatorActionView())
|
id(new PhabricatorActionView())
|
||||||
->setName(pht('Edit Dashboard'))
|
->setName(pht('Edit Dashboard'))
|
||||||
|
|
Loading…
Reference in a new issue