mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-10 00:42: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;
|
||||
} 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);
|
||||
|
||||
$is_new = true;
|
||||
|
@ -61,7 +74,7 @@ final class PhabricatorDashboardEditController
|
|||
$e_name = true;
|
||||
|
||||
$validation_exception = null;
|
||||
if ($request->isFormPost()) {
|
||||
if ($request->isFormPost() && $request->getStr('edit')) {
|
||||
$v_name = $request->getStr('name');
|
||||
$v_layout_mode = $request->getStr('layout_mode');
|
||||
$v_view_policy = $request->getStr('viewPolicy');
|
||||
|
@ -116,6 +129,7 @@ final class PhabricatorDashboardEditController
|
|||
PhabricatorDashboardLayoutConfig::getLayoutModeSelectOptions();
|
||||
$form = id(new AphrontFormView())
|
||||
->setUser($viewer)
|
||||
->addHiddenInput('edit', true)
|
||||
->appendChild(
|
||||
id(new AphrontFormTextControl())
|
||||
->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,
|
||||
PhabricatorPolicyCapability::CAN_EDIT);
|
||||
|
||||
$actions->addAction(
|
||||
id(new PhabricatorActionView())
|
||||
->setName(pht('View Dashboard'))
|
||||
->setIcon('fa-columns')
|
||||
->setHref($this->getApplicationURI("view/{$id}/")));
|
||||
|
||||
$actions->addAction(
|
||||
id(new PhabricatorActionView())
|
||||
->setName(pht('Edit Dashboard'))
|
||||
|
|
Loading…
Reference in a new issue