mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-26 16:52:41 +01:00
Mostly replace the old panel "Edit" controller with the new "Editpro" controller
Summary: Depends on D20370. Ref T13272. This tries to get panel editing fully on the newer "Modular Transactions" + "EditEngine" flow. This breaks tab panels a bit, but I'll fix that in a followup. And they weren't exactly in great shape before. Also makes the flow prettier. :3 Test Plan: {F6332746} Reviewers: amckinley Reviewed By: amckinley Maniphest Tasks: T13272 Differential Revision: https://secure.phabricator.com/D20371
This commit is contained in:
parent
81b58dba8f
commit
68d969094f
9 changed files with 131 additions and 447 deletions
|
@ -2933,7 +2933,6 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorDashboardPanelEditConduitAPIMethod' => 'applications/dashboard/conduit/PhabricatorDashboardPanelEditConduitAPIMethod.php',
|
'PhabricatorDashboardPanelEditConduitAPIMethod' => 'applications/dashboard/conduit/PhabricatorDashboardPanelEditConduitAPIMethod.php',
|
||||||
'PhabricatorDashboardPanelEditController' => 'applications/dashboard/controller/panel/PhabricatorDashboardPanelEditController.php',
|
'PhabricatorDashboardPanelEditController' => 'applications/dashboard/controller/panel/PhabricatorDashboardPanelEditController.php',
|
||||||
'PhabricatorDashboardPanelEditEngine' => 'applications/dashboard/editor/PhabricatorDashboardPanelEditEngine.php',
|
'PhabricatorDashboardPanelEditEngine' => 'applications/dashboard/editor/PhabricatorDashboardPanelEditEngine.php',
|
||||||
'PhabricatorDashboardPanelEditproController' => 'applications/dashboard/controller/panel/PhabricatorDashboardPanelEditproController.php',
|
|
||||||
'PhabricatorDashboardPanelHasDashboardEdgeType' => 'applications/dashboard/edge/PhabricatorDashboardPanelHasDashboardEdgeType.php',
|
'PhabricatorDashboardPanelHasDashboardEdgeType' => 'applications/dashboard/edge/PhabricatorDashboardPanelHasDashboardEdgeType.php',
|
||||||
'PhabricatorDashboardPanelListController' => 'applications/dashboard/controller/panel/PhabricatorDashboardPanelListController.php',
|
'PhabricatorDashboardPanelListController' => 'applications/dashboard/controller/panel/PhabricatorDashboardPanelListController.php',
|
||||||
'PhabricatorDashboardPanelNameTransaction' => 'applications/dashboard/xaction/panel/PhabricatorDashboardPanelNameTransaction.php',
|
'PhabricatorDashboardPanelNameTransaction' => 'applications/dashboard/xaction/panel/PhabricatorDashboardPanelNameTransaction.php',
|
||||||
|
@ -8915,7 +8914,6 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorDashboardPanelEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
'PhabricatorDashboardPanelEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod',
|
||||||
'PhabricatorDashboardPanelEditController' => 'PhabricatorDashboardController',
|
'PhabricatorDashboardPanelEditController' => 'PhabricatorDashboardController',
|
||||||
'PhabricatorDashboardPanelEditEngine' => 'PhabricatorEditEngine',
|
'PhabricatorDashboardPanelEditEngine' => 'PhabricatorEditEngine',
|
||||||
'PhabricatorDashboardPanelEditproController' => 'PhabricatorDashboardController',
|
|
||||||
'PhabricatorDashboardPanelHasDashboardEdgeType' => 'PhabricatorEdgeType',
|
'PhabricatorDashboardPanelHasDashboardEdgeType' => 'PhabricatorEdgeType',
|
||||||
'PhabricatorDashboardPanelListController' => 'PhabricatorDashboardController',
|
'PhabricatorDashboardPanelListController' => 'PhabricatorDashboardController',
|
||||||
'PhabricatorDashboardPanelNameTransaction' => 'PhabricatorDashboardPanelTransactionType',
|
'PhabricatorDashboardPanelNameTransaction' => 'PhabricatorDashboardPanelTransactionType',
|
||||||
|
|
|
@ -57,10 +57,8 @@ final class PhabricatorDashboardApplication extends PhabricatorApplication {
|
||||||
'PhabricatorDashboardQueryPanelInstallController',
|
'PhabricatorDashboardQueryPanelInstallController',
|
||||||
'(?:query/(?P<queryKey>[^/]+)/)?'
|
'(?:query/(?P<queryKey>[^/]+)/)?'
|
||||||
=> 'PhabricatorDashboardPanelListController',
|
=> 'PhabricatorDashboardPanelListController',
|
||||||
'create/' => 'PhabricatorDashboardPanelEditController',
|
$this->getEditRoutePattern('edit/')
|
||||||
$this->getEditRoutePattern('editpro/')
|
=> 'PhabricatorDashboardPanelEditController',
|
||||||
=> 'PhabricatorDashboardPanelEditproController',
|
|
||||||
'edit/(?:(?P<id>\d+)/)?' => 'PhabricatorDashboardPanelEditController',
|
|
||||||
'render/(?P<id>\d+)/' => 'PhabricatorDashboardPanelRenderController',
|
'render/(?P<id>\d+)/' => 'PhabricatorDashboardPanelRenderController',
|
||||||
'archive/(?P<id>\d+)/'
|
'archive/(?P<id>\d+)/'
|
||||||
=> 'PhabricatorDashboardPanelArchiveController',
|
=> 'PhabricatorDashboardPanelArchiveController',
|
||||||
|
|
|
@ -4,15 +4,17 @@ final class PhabricatorDashboardPanelEditController
|
||||||
extends PhabricatorDashboardController {
|
extends PhabricatorDashboardController {
|
||||||
|
|
||||||
public function handleRequest(AphrontRequest $request) {
|
public function handleRequest(AphrontRequest $request) {
|
||||||
$viewer = $request->getViewer();
|
$viewer = $this->getViewer();
|
||||||
|
|
||||||
|
$engine = id(new PhabricatorDashboardPanelEditEngine())
|
||||||
|
->setController($this);
|
||||||
|
|
||||||
$id = $request->getURIData('id');
|
$id = $request->getURIData('id');
|
||||||
|
if (!$id) {
|
||||||
|
$dashboard_id = $request->getStr('dashboardID');
|
||||||
|
$column_id = $request->getStr('columnID');
|
||||||
|
|
||||||
// If the user is trying to create a panel directly on a dashboard, make
|
if (strlen($dashboard_id)) {
|
||||||
// sure they have permission to see and edit the dashboard.
|
|
||||||
|
|
||||||
$dashboard_id = $request->getInt('dashboardID');
|
|
||||||
$dashboard = null;
|
|
||||||
if ($dashboard_id) {
|
|
||||||
$dashboard = id(new PhabricatorDashboardQuery())
|
$dashboard = id(new PhabricatorDashboardQuery())
|
||||||
->setViewer($viewer)
|
->setViewer($viewer)
|
||||||
->withIDs(array($dashboard_id))
|
->withIDs(array($dashboard_id))
|
||||||
|
@ -25,330 +27,67 @@ final class PhabricatorDashboardPanelEditController
|
||||||
if (!$dashboard) {
|
if (!$dashboard) {
|
||||||
return new Aphront404Response();
|
return new Aphront404Response();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
$manage_uri = $this->getApplicationURI('arrange/'.$dashboard_id.'/');
|
$dashboard = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($id) {
|
|
||||||
$is_create = false;
|
|
||||||
|
|
||||||
if ($dashboard) {
|
if ($dashboard) {
|
||||||
$capabilities = array(
|
$cancel_uri = $dashboard->getURI();
|
||||||
PhabricatorPolicyCapability::CAN_VIEW,
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
$capabilities = array(
|
|
||||||
PhabricatorPolicyCapability::CAN_VIEW,
|
|
||||||
PhabricatorPolicyCapability::CAN_EDIT,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$panel = id(new PhabricatorDashboardPanelQuery())
|
|
||||||
->setViewer($viewer)
|
|
||||||
->withIDs(array($id))
|
|
||||||
->requireCapabilities($capabilities)
|
|
||||||
->executeOne();
|
|
||||||
if (!$panel) {
|
|
||||||
return new Aphront404Response();
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
$is_create = true;
|
|
||||||
|
|
||||||
$panel = PhabricatorDashboardPanel::initializeNewPanel($viewer);
|
|
||||||
$types = PhabricatorDashboardPanelType::getAllPanelTypes();
|
|
||||||
$type = $request->getStr('type');
|
|
||||||
if (empty($types[$type])) {
|
|
||||||
return $this->processPanelTypeRequest($request);
|
|
||||||
}
|
|
||||||
|
|
||||||
$panel->setPanelType($type);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($is_create) {
|
|
||||||
$title = pht('Create New Panel');
|
|
||||||
$button = pht('Create Panel');
|
|
||||||
$header_icon = 'fa-plus-square';
|
|
||||||
if ($dashboard) {
|
|
||||||
$cancel_uri = $manage_uri;
|
|
||||||
} else {
|
} else {
|
||||||
$cancel_uri = $this->getApplicationURI('panel/');
|
$cancel_uri = $this->getApplicationURI('panel/');
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
$title = pht('Edit Panel: %s', $panel->getName());
|
$panel_type = $request->getStr('panelType');
|
||||||
$button = pht('Save Panel');
|
$panel_types = PhabricatorDashboardPanelType::getAllPanelTypes();
|
||||||
$header_icon = 'fa-pencil';
|
if (empty($panel_types[$panel_type])) {
|
||||||
if ($dashboard) {
|
return $this->buildPanelTypeResponse($cancel_uri);
|
||||||
$cancel_uri = $manage_uri;
|
|
||||||
} else {
|
|
||||||
$cancel_uri = '/'.$panel->getMonogram();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$v_name = $panel->getName();
|
$engine
|
||||||
$e_name = true;
|
->addContextParameter('panelType', $panel_type)
|
||||||
|
->addContextParameter('dashboardID', $dashboard_id)
|
||||||
|
->addContextParameter('columnID', $column_id)
|
||||||
|
->setPanelType($panel_type)
|
||||||
|
->setDashboard($dashboard)
|
||||||
|
->setColumnID($column_id);
|
||||||
|
}
|
||||||
|
|
||||||
$field_list = PhabricatorCustomField::getObjectFields(
|
return $engine->buildResponse();
|
||||||
$panel,
|
}
|
||||||
PhabricatorCustomField::ROLE_EDIT);
|
|
||||||
$field_list
|
private function buildPanelTypeResponse($cancel_uri) {
|
||||||
|
$viewer = $this->getViewer();
|
||||||
|
$request = $this->getRequest();
|
||||||
|
|
||||||
|
$base_uri = $request->getRequestURI();
|
||||||
|
$base_uri = new PhutilURI($base_uri);
|
||||||
|
|
||||||
|
$menu = id(new PHUIObjectItemListView())
|
||||||
->setViewer($viewer)
|
->setViewer($viewer)
|
||||||
->readFieldsFromStorage($panel);
|
->setFlush(true)
|
||||||
|
->setBig(true);
|
||||||
|
|
||||||
if ($is_create && !$request->isFormPost()) {
|
$panel_types = PhabricatorDashboardPanelType::getAllPanelTypes();
|
||||||
$panel->requireImplementation()->initializeFieldsFromRequest(
|
foreach ($panel_types as $panel_type) {
|
||||||
$panel,
|
$item = id(new PHUIObjectItemView())
|
||||||
$field_list,
|
->setClickable(true)
|
||||||
$request);
|
->setImageIcon($panel_type->getIcon())
|
||||||
|
->setHeader($panel_type->getPanelTypeName())
|
||||||
|
->addAttribute($panel_type->getPanelTypeDescription());
|
||||||
|
|
||||||
|
$type_uri = id(clone $base_uri)
|
||||||
|
->replaceQueryParam('panelType', $panel_type->getPanelTypeKey());
|
||||||
|
|
||||||
|
$item->setHref($type_uri);
|
||||||
|
|
||||||
|
$menu->addItem($item);
|
||||||
}
|
}
|
||||||
|
|
||||||
$validation_exception = null;
|
|
||||||
|
|
||||||
// NOTE: We require 'edit' to distinguish between the "Choose a Type"
|
|
||||||
// and "Create a Panel" dialogs.
|
|
||||||
|
|
||||||
if ($request->isFormPost() && $request->getBool('edit')) {
|
|
||||||
$v_name = $request->getStr('name');
|
|
||||||
$v_view_policy = $request->getStr('viewPolicy');
|
|
||||||
$v_edit_policy = $request->getStr('editPolicy');
|
|
||||||
|
|
||||||
$type_name = PhabricatorDashboardPanelNameTransaction::TRANSACTIONTYPE;
|
|
||||||
$type_view_policy = PhabricatorTransactions::TYPE_VIEW_POLICY;
|
|
||||||
$type_edit_policy = PhabricatorTransactions::TYPE_EDIT_POLICY;
|
|
||||||
|
|
||||||
$xactions = array();
|
|
||||||
|
|
||||||
$xactions[] = id(new PhabricatorDashboardPanelTransaction())
|
|
||||||
->setTransactionType($type_name)
|
|
||||||
->setNewValue($v_name);
|
|
||||||
|
|
||||||
$xactions[] = id(new PhabricatorDashboardPanelTransaction())
|
|
||||||
->setTransactionType($type_view_policy)
|
|
||||||
->setNewValue($v_view_policy);
|
|
||||||
|
|
||||||
$xactions[] = id(new PhabricatorDashboardPanelTransaction())
|
|
||||||
->setTransactionType($type_edit_policy)
|
|
||||||
->setNewValue($v_edit_policy);
|
|
||||||
|
|
||||||
$field_xactions = $field_list->buildFieldTransactionsFromRequest(
|
|
||||||
new PhabricatorDashboardPanelTransaction(),
|
|
||||||
$request);
|
|
||||||
$xactions = array_merge($xactions, $field_xactions);
|
|
||||||
|
|
||||||
try {
|
|
||||||
$editor = id(new PhabricatorDashboardPanelTransactionEditor())
|
|
||||||
->setActor($viewer)
|
|
||||||
->setContinueOnNoEffect(true)
|
|
||||||
->setContentSourceFromRequest($request)
|
|
||||||
->applyTransactions($panel, $xactions);
|
|
||||||
|
|
||||||
// If we're creating a panel directly on a dashboard, add it now.
|
|
||||||
if ($dashboard && $is_create) {
|
|
||||||
PhabricatorDashboardTransactionEditor::addPanelToDashboard(
|
|
||||||
$viewer,
|
|
||||||
PhabricatorContentSource::newFromRequest($request),
|
|
||||||
$panel,
|
|
||||||
$dashboard,
|
|
||||||
$request->getInt('column', 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($dashboard) {
|
|
||||||
$done_uri = $manage_uri;
|
|
||||||
} else {
|
|
||||||
$done_uri = '/'.$panel->getMonogram();
|
|
||||||
}
|
|
||||||
|
|
||||||
return id(new AphrontRedirectResponse())->setURI($done_uri);
|
|
||||||
} catch (PhabricatorApplicationTransactionValidationException $ex) {
|
|
||||||
$validation_exception = $ex;
|
|
||||||
|
|
||||||
$e_name = $validation_exception->getShortMessage($type_name);
|
|
||||||
|
|
||||||
$panel->setViewPolicy($v_view_policy);
|
|
||||||
$panel->setEditPolicy($v_edit_policy);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: We're setting the submit URI explicitly because we need to edit
|
|
||||||
// a different panel if we just cloned the original panel.
|
|
||||||
if ($is_create) {
|
|
||||||
$submit_uri = $this->getApplicationURI('panel/edit/');
|
|
||||||
} else {
|
|
||||||
$submit_uri = $this->getApplicationURI('panel/edit/'.$panel->getID().'/');
|
|
||||||
}
|
|
||||||
|
|
||||||
$policies = id(new PhabricatorPolicyQuery())
|
|
||||||
->setViewer($viewer)
|
|
||||||
->setObject($panel)
|
|
||||||
->execute();
|
|
||||||
|
|
||||||
$form = id(new AphrontFormView())
|
|
||||||
->setUser($viewer)
|
|
||||||
->setAction($submit_uri)
|
|
||||||
->addHiddenInput('edit', true)
|
|
||||||
->addHiddenInput('dashboardID', $request->getInt('dashboardID'))
|
|
||||||
->addHiddenInput('column', $request->getInt('column'))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormTextControl())
|
|
||||||
->setLabel(pht('Name'))
|
|
||||||
->setName('name')
|
|
||||||
->setValue($v_name)
|
|
||||||
->setError($e_name));
|
|
||||||
|
|
||||||
if (!$request->isAjax() || !$is_create) {
|
|
||||||
$form
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormPolicyControl())
|
|
||||||
->setName('viewPolicy')
|
|
||||||
->setPolicyObject($panel)
|
|
||||||
->setCapability(PhabricatorPolicyCapability::CAN_VIEW)
|
|
||||||
->setPolicies($policies))
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormPolicyControl())
|
|
||||||
->setName('editPolicy')
|
|
||||||
->setPolicyObject($panel)
|
|
||||||
->setCapability(PhabricatorPolicyCapability::CAN_EDIT)
|
|
||||||
->setPolicies($policies));
|
|
||||||
}
|
|
||||||
|
|
||||||
$field_list->appendFieldsToForm($form);
|
|
||||||
|
|
||||||
$crumbs = $this->buildApplicationCrumbs();
|
|
||||||
$crumbs->addTextCrumb(
|
|
||||||
pht('Panels'),
|
|
||||||
$this->getApplicationURI('panel/'));
|
|
||||||
if ($is_create) {
|
|
||||||
$crumbs->addTextCrumb(pht('New Panel'));
|
|
||||||
$form->addHiddenInput('type', $panel->getPanelType());
|
|
||||||
} else {
|
|
||||||
$crumbs->addTextCrumb(
|
|
||||||
$panel->getMonogram(),
|
|
||||||
'/'.$panel->getMonogram());
|
|
||||||
$crumbs->addTextCrumb(pht('Edit'));
|
|
||||||
}
|
|
||||||
$crumbs->setBorder(true);
|
|
||||||
|
|
||||||
if ($request->isAjax()) {
|
|
||||||
return $this->newDialog()
|
return $this->newDialog()
|
||||||
->setTitle($title)
|
->setTitle(pht('Choose Panel Type'))
|
||||||
->setSubmitURI($submit_uri)
|
|
||||||
->setWidth(AphrontDialogView::WIDTH_FORM)
|
->setWidth(AphrontDialogView::WIDTH_FORM)
|
||||||
->setValidationException($validation_exception)
|
->appendChild($menu)
|
||||||
->appendChild($form->buildLayoutView())
|
->addCancelButton($cancel_uri);
|
||||||
->addCancelButton($cancel_uri)
|
|
||||||
->addSubmitButton($button);
|
|
||||||
} else {
|
|
||||||
$form
|
|
||||||
->appendChild(
|
|
||||||
id(new AphrontFormSubmitControl())
|
|
||||||
->setValue($button)
|
|
||||||
->addCancelButton($cancel_uri));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$box = id(new PHUIObjectBoxView())
|
|
||||||
->setHeaderText(pht('Panel'))
|
|
||||||
->setValidationException($validation_exception)
|
|
||||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
|
||||||
->setForm($form);
|
|
||||||
|
|
||||||
$header = id(new PHUIHeaderView())
|
|
||||||
->setHeader($title)
|
|
||||||
->setHeaderIcon($header_icon);
|
|
||||||
|
|
||||||
$view = id(new PHUITwoColumnView())
|
|
||||||
->setHeader($header)
|
|
||||||
->setFooter($box);
|
|
||||||
|
|
||||||
return $this->newPage()
|
|
||||||
->setTitle($title)
|
|
||||||
->setCrumbs($crumbs)
|
|
||||||
->appendChild($view);
|
|
||||||
}
|
|
||||||
|
|
||||||
private function processPanelTypeRequest(AphrontRequest $request) {
|
|
||||||
$viewer = $request->getUser();
|
|
||||||
|
|
||||||
$types = PhabricatorDashboardPanelType::getAllPanelTypes();
|
|
||||||
|
|
||||||
$v_type = null;
|
|
||||||
$errors = array();
|
|
||||||
if ($request->isFormPost()) {
|
|
||||||
$v_type = $request->getStr('type');
|
|
||||||
if (!isset($types[$v_type])) {
|
|
||||||
$errors[] = pht('You must select a type of panel to create.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$cancel_uri = $this->getApplicationURI('panel/');
|
|
||||||
|
|
||||||
if (!$v_type) {
|
|
||||||
$v_type = key($types);
|
|
||||||
}
|
|
||||||
|
|
||||||
$panel_types = id(new AphrontFormRadioButtonControl())
|
|
||||||
->setName('type')
|
|
||||||
->setValue($v_type);
|
|
||||||
|
|
||||||
foreach ($types as $key => $type) {
|
|
||||||
$panel_types->addButton(
|
|
||||||
$key,
|
|
||||||
$type->getPanelTypeName(),
|
|
||||||
$type->getPanelTypeDescription());
|
|
||||||
}
|
|
||||||
|
|
||||||
$form = id(new AphrontFormView())
|
|
||||||
->setUser($viewer)
|
|
||||||
->addHiddenInput('dashboardID', $request->getInt('dashboardID'))
|
|
||||||
->addHiddenInput('column', $request->getInt('column'))
|
|
||||||
->appendRemarkupInstructions(
|
|
||||||
pht(
|
|
||||||
'Choose the type of dashboard panel to create:'))
|
|
||||||
->appendChild($panel_types);
|
|
||||||
|
|
||||||
if ($request->isAjax()) {
|
|
||||||
return $this->newDialog()
|
|
||||||
->setTitle(pht('Add New Panel'))
|
|
||||||
->setWidth(AphrontDialogView::WIDTH_FORM)
|
|
||||||
->setErrors($errors)
|
|
||||||
->appendChild($form->buildLayoutView())
|
|
||||||
->addCancelbutton($cancel_uri)
|
|
||||||
->addSubmitButton(pht('Continue'));
|
|
||||||
} else {
|
|
||||||
$form->appendChild(
|
|
||||||
id(new AphrontFormSubmitControl())
|
|
||||||
->setValue(pht('Continue'))
|
|
||||||
->addCancelButton($cancel_uri));
|
|
||||||
}
|
|
||||||
|
|
||||||
$title = pht('Create Dashboard Panel');
|
|
||||||
$header_icon = 'fa-plus-square';
|
|
||||||
|
|
||||||
$crumbs = $this->buildApplicationCrumbs();
|
|
||||||
$crumbs->addTextCrumb(
|
|
||||||
pht('Panels'),
|
|
||||||
$this->getApplicationURI('panel/'));
|
|
||||||
$crumbs->addTextCrumb(pht('New Panel'));
|
|
||||||
$crumbs->setBorder(true);
|
|
||||||
|
|
||||||
$box = id(new PHUIObjectBoxView())
|
|
||||||
->setHeaderText(pht('Panel'))
|
|
||||||
->setFormErrors($errors)
|
|
||||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
|
||||||
->setForm($form);
|
|
||||||
|
|
||||||
$header = id(new PHUIHeaderView())
|
|
||||||
->setHeader($title)
|
|
||||||
->setHeaderIcon($header_icon);
|
|
||||||
|
|
||||||
$view = id(new PHUITwoColumnView())
|
|
||||||
->setHeader($header)
|
|
||||||
->setFooter($box);
|
|
||||||
|
|
||||||
return $this->newPage()
|
|
||||||
->setTitle($title)
|
|
||||||
->setCrumbs($crumbs)
|
|
||||||
->appendChild($view);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,105 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
final class PhabricatorDashboardPanelEditproController
|
|
||||||
extends PhabricatorDashboardController {
|
|
||||||
|
|
||||||
public function handleRequest(AphrontRequest $request) {
|
|
||||||
$engine = id(new PhabricatorDashboardPanelEditEngine())
|
|
||||||
->setController($this);
|
|
||||||
|
|
||||||
$id = $request->getURIData('id');
|
|
||||||
if (!$id) {
|
|
||||||
$list_uri = $this->getApplicationURI('panel/');
|
|
||||||
|
|
||||||
$panel_type = $request->getStr('panelType');
|
|
||||||
$panel_types = PhabricatorDashboardPanelType::getAllPanelTypes();
|
|
||||||
if (empty($panel_types[$panel_type])) {
|
|
||||||
return $this->buildPanelTypeResponse($list_uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
$engine
|
|
||||||
->addContextParameter('panelType', $panel_type)
|
|
||||||
->setPanelType($panel_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $engine->buildResponse();
|
|
||||||
}
|
|
||||||
|
|
||||||
private function buildPanelTypeResponse($cancel_uri) {
|
|
||||||
$panel_types = PhabricatorDashboardPanelType::getAllPanelTypes();
|
|
||||||
|
|
||||||
$viewer = $this->getViewer();
|
|
||||||
$request = $this->getRequest();
|
|
||||||
|
|
||||||
$e_type = null;
|
|
||||||
$errors = array();
|
|
||||||
if ($request->isFormPost()) {
|
|
||||||
$e_type = pht('Required');
|
|
||||||
$errors[] = pht(
|
|
||||||
'To create a new dashboard panel, you must select a panel type.');
|
|
||||||
}
|
|
||||||
|
|
||||||
$type_control = id(new AphrontFormRadioButtonControl())
|
|
||||||
->setLabel(pht('Panel Type'))
|
|
||||||
->setName('panelType')
|
|
||||||
->setError($e_type);
|
|
||||||
|
|
||||||
foreach ($panel_types as $key => $type) {
|
|
||||||
$type_control->addButton(
|
|
||||||
$key,
|
|
||||||
$type->getPanelTypeName(),
|
|
||||||
$type->getPanelTypeDescription());
|
|
||||||
}
|
|
||||||
|
|
||||||
$form = id(new AphrontFormView())
|
|
||||||
->setUser($viewer)
|
|
||||||
->appendRemarkupInstructions(
|
|
||||||
pht('Choose the type of dashboard panel to create:'))
|
|
||||||
->appendChild($type_control);
|
|
||||||
|
|
||||||
if ($request->isAjax()) {
|
|
||||||
return $this->newDialog()
|
|
||||||
->setTitle(pht('Add New Panel'))
|
|
||||||
->setWidth(AphrontDialogView::WIDTH_FORM)
|
|
||||||
->setErrors($errors)
|
|
||||||
->appendForm($form)
|
|
||||||
->addCancelButton($cancel_uri)
|
|
||||||
->addSubmitButton(pht('Continue'));
|
|
||||||
}
|
|
||||||
|
|
||||||
$form->appendChild(
|
|
||||||
id(new AphrontFormSubmitControl())
|
|
||||||
->setValue(pht('Continue'))
|
|
||||||
->addCancelButton($cancel_uri));
|
|
||||||
|
|
||||||
$title = pht('Create Dashboard Panel');
|
|
||||||
$header_icon = 'fa-plus-square';
|
|
||||||
|
|
||||||
$crumbs = $this->buildApplicationCrumbs();
|
|
||||||
$crumbs->addTextCrumb(
|
|
||||||
pht('Panels'),
|
|
||||||
$this->getApplicationURI('panel/'));
|
|
||||||
$crumbs->addTextCrumb(pht('New Panel'));
|
|
||||||
$crumbs->setBorder(true);
|
|
||||||
|
|
||||||
$box = id(new PHUIObjectBoxView())
|
|
||||||
->setHeaderText(pht('Panel'))
|
|
||||||
->setFormErrors($errors)
|
|
||||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
|
||||||
->setForm($form);
|
|
||||||
|
|
||||||
$header = id(new PHUIHeaderView())
|
|
||||||
->setHeader($title)
|
|
||||||
->setHeaderIcon($header_icon);
|
|
||||||
|
|
||||||
$view = id(new PHUITwoColumnView())
|
|
||||||
->setHeader($header)
|
|
||||||
->setFooter($box);
|
|
||||||
|
|
||||||
return $this->newPage()
|
|
||||||
->setTitle($title)
|
|
||||||
->setCrumbs($crumbs)
|
|
||||||
->appendChild($view);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -43,7 +43,7 @@ final class PhabricatorDashboardPanelListController
|
||||||
id(new PHUIListItemView())
|
id(new PHUIListItemView())
|
||||||
->setIcon('fa-plus-square')
|
->setIcon('fa-plus-square')
|
||||||
->setName(pht('Create Panel'))
|
->setName(pht('Create Panel'))
|
||||||
->setHref($this->getApplicationURI().'panel/create/'));
|
->setHref($this->getApplicationURI().'panel/edit/'));
|
||||||
|
|
||||||
return $crumbs;
|
return $crumbs;
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ final class PhabricatorDashboardPanelListController
|
||||||
$create_button = id(new PHUIButtonView())
|
$create_button = id(new PHUIButtonView())
|
||||||
->setTag('a')
|
->setTag('a')
|
||||||
->setText(pht('Create a Panel'))
|
->setText(pht('Create a Panel'))
|
||||||
->setHref('/dashboard/panel/create/')
|
->setHref('/dashboard/panel/edit/')
|
||||||
->setColor(PHUIButtonView::GREEN);
|
->setColor(PHUIButtonView::GREEN);
|
||||||
|
|
||||||
$icon = $this->getApplication()->getIcon();
|
$icon = $this->getApplication()->getIcon();
|
||||||
|
|
|
@ -6,6 +6,8 @@ final class PhabricatorDashboardPanelEditEngine
|
||||||
const ENGINECONST = 'dashboard.panel';
|
const ENGINECONST = 'dashboard.panel';
|
||||||
|
|
||||||
private $panelType;
|
private $panelType;
|
||||||
|
private $dashboard;
|
||||||
|
private $columnID;
|
||||||
|
|
||||||
public function setPanelType($panel_type) {
|
public function setPanelType($panel_type) {
|
||||||
$this->panelType = $panel_type;
|
$this->panelType = $panel_type;
|
||||||
|
@ -16,6 +18,24 @@ final class PhabricatorDashboardPanelEditEngine
|
||||||
return $this->panelType;
|
return $this->panelType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setDashboard(PhabricatorDashboard $dashboard) {
|
||||||
|
$this->dashboard = $dashboard;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDashboard() {
|
||||||
|
return $this->dashboard;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setColumnID($column_id) {
|
||||||
|
$this->columnID = $column_id;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getColumnID() {
|
||||||
|
return $this->columnID;
|
||||||
|
}
|
||||||
|
|
||||||
public function isEngineConfigurable() {
|
public function isEngineConfigurable() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -63,6 +83,24 @@ final class PhabricatorDashboardPanelEditEngine
|
||||||
return pht('Create Panel');
|
return pht('Create Panel');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function getObjectCreateCancelURI($object) {
|
||||||
|
$dashboard = $this->getDashboard();
|
||||||
|
if ($dashboard) {
|
||||||
|
return $dashboard->getURI();
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::getObjectCreateCancelURI($object);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getEffectiveObjectEditDoneURI($object) {
|
||||||
|
$dashboard = $this->getDashboard();
|
||||||
|
if ($dashboard) {
|
||||||
|
return $dashboard->getURI();
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::getEffectiveObjectDoneURI($object);
|
||||||
|
}
|
||||||
|
|
||||||
protected function getObjectEditTitleText($object) {
|
protected function getObjectEditTitleText($object) {
|
||||||
return pht('Edit Panel: %s', $object->getName());
|
return pht('Edit Panel: %s', $object->getName());
|
||||||
}
|
}
|
||||||
|
@ -83,6 +121,22 @@ final class PhabricatorDashboardPanelEditEngine
|
||||||
return $object->getURI();
|
return $object->getURI();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function didApplyTransactions($object, array $xactions) {
|
||||||
|
$dashboard = $this->getDashboard();
|
||||||
|
if ($dashboard) {
|
||||||
|
$viewer = $this->getViewer();
|
||||||
|
$controller = $this->getController();
|
||||||
|
$request = $controller->getRequest();
|
||||||
|
|
||||||
|
PhabricatorDashboardTransactionEditor::addPanelToDashboard(
|
||||||
|
$viewer,
|
||||||
|
PhabricatorContentSource::newFromRequest($request),
|
||||||
|
$object,
|
||||||
|
$dashboard,
|
||||||
|
(int)$this->getColumnID());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected function buildCustomEditFields($object) {
|
protected function buildCustomEditFields($object) {
|
||||||
return array(
|
return array(
|
||||||
id(new PhabricatorTextEditField())
|
id(new PhabricatorTextEditField())
|
||||||
|
|
|
@ -112,12 +112,12 @@ final class PhabricatorDashboardRenderingEngine extends Phobject {
|
||||||
private function renderAddPanelUI($column) {
|
private function renderAddPanelUI($column) {
|
||||||
$dashboard_id = $this->dashboard->getID();
|
$dashboard_id = $this->dashboard->getID();
|
||||||
|
|
||||||
$create_uri = id(new PhutilURI('/dashboard/panel/create/'))
|
$create_uri = id(new PhutilURI('/dashboard/panel/edit/'))
|
||||||
->replaceQueryParam('dashboardID', $dashboard_id)
|
->replaceQueryParam('dashboardID', $dashboard_id)
|
||||||
->replaceQueryParam('column', $column);
|
->replaceQueryParam('columnID', $column);
|
||||||
|
|
||||||
$add_uri = id(new PhutilURI('/dashboard/addpanel/'.$dashboard_id.'/'))
|
$add_uri = id(new PhutilURI('/dashboard/addpanel/'.$dashboard_id.'/'))
|
||||||
->replaceQueryParam('column', $column);
|
->replaceQueryParam('columnID', $column);
|
||||||
|
|
||||||
$create_button = id(new PHUIButtonView())
|
$create_button = id(new PHUIButtonView())
|
||||||
->setTag('a')
|
->setTag('a')
|
||||||
|
|
|
@ -12,7 +12,7 @@ final class PhabricatorDashboardTabsPanelType
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getIcon() {
|
public function getIcon() {
|
||||||
return 'fa-window-maximize';
|
return 'fa-columns';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getPanelTypeDescription() {
|
public function getPanelTypeDescription() {
|
||||||
|
|
|
@ -12,13 +12,13 @@ final class PhabricatorDashboardTextPanelType
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getIcon() {
|
public function getIcon() {
|
||||||
return 'fa-paragraph';
|
return 'fa-file-text-o';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getPanelTypeDescription() {
|
public function getPanelTypeDescription() {
|
||||||
return pht(
|
return pht(
|
||||||
'Add some static text to the dashboard. This can be used to '.
|
'Add a text panel to the dashboard to provide instructions or '.
|
||||||
'provide instructions or context.');
|
'context.');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getFieldSpecifications() {
|
public function getFieldSpecifications() {
|
||||||
|
|
Loading…
Reference in a new issue