Differential D20408 Diff 48715 src/applications/dashboard/controller/dashboard/PhabricatorDashboardAdjustController.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/dashboard/controller/dashboard/PhabricatorDashboardAdjustController.php
- This file was added.
| <?php | |||||
| final class PhabricatorDashboardAdjustController | |||||
| extends PhabricatorDashboardController { | |||||
| private $contextPHID; | |||||
| private $panelKey; | |||||
| private $columnKey; | |||||
| public function handleRequest(AphrontRequest $request) { | |||||
| $viewer = $this->getViewer(); | |||||
| $context_phid = $request->getStr('contextPHID'); | |||||
| $dashboard = id(new PhabricatorDashboardQuery()) | |||||
| ->setViewer($viewer) | |||||
| ->withPHIDs(array($context_phid)) | |||||
| ->requireCapabilities( | |||||
| array( | |||||
| PhabricatorPolicyCapability::CAN_VIEW, | |||||
| PhabricatorPolicyCapability::CAN_EDIT, | |||||
| )) | |||||
| ->executeOne(); | |||||
| if (!$dashboard) { | |||||
| return new Aphront404Response(); | |||||
| } | |||||
| $this->contextPHID = $context_phid; | |||||
| $done_uri = $dashboard->getURI(); | |||||
| $ref_list = $dashboard->getPanelRefList(); | |||||
| $panel_ref = null; | |||||
| $panel_key = $request->getStr('panelKey'); | |||||
| if (strlen($panel_key)) { | |||||
| $panel_ref = $ref_list->getPanelRef($panel_key); | |||||
| if (!$panel_ref) { | |||||
| return new Aphront404Response(); | |||||
| } | |||||
| $this->panelKey = $panel_key; | |||||
| } else { | |||||
| $panel_ref = null; | |||||
| } | |||||
| $column_key = $request->getStr('columnKey'); | |||||
| if (strlen($column_key)) { | |||||
| $columns = $ref_list->getColumns(); | |||||
| if (!isset($columns[$column_key])) { | |||||
| return new Aphront404Response(); | |||||
| } | |||||
| $this->columnKey = $column_key; | |||||
| } | |||||
| switch ($request->getURIData('op')) { | |||||
| case 'add': | |||||
| return $this->handleAddRequest($dashboard, $done_uri); | |||||
| case 'remove': | |||||
| if (!$panel_ref) { | |||||
| return new Aphront404Response(); | |||||
| } | |||||
| return $this->handleRemoveRequest($dashboard, $panel_ref, $done_uri); | |||||
| } | |||||
| } | |||||
| private function handleAddRequest( | |||||
| PhabricatorDashboard $dashboard, | |||||
| $done_uri) { | |||||
| $request = $this->getRequest(); | |||||
| $viewer = $this->getViewer(); | |||||
| $errors = array(); | |||||
| $panel_phid = null; | |||||
| $e_panel = true; | |||||
| if ($request->isFormPost()) { | |||||
| $panel_phid = head($request->getArr('panelPHIDs')); | |||||
| if (!$panel_phid) { | |||||
| $errors[] = pht('You must choose a panel to add to the dashboard.'); | |||||
| $e_panel = pht('Required'); | |||||
| } else { | |||||
| $panel = id(new PhabricatorDashboardPanelQuery()) | |||||
| ->setViewer($viewer) | |||||
| ->withPHIDs(array($panel_phid)) | |||||
| ->executeOne(); | |||||
| if (!$panel) { | |||||
| $errors[] = pht('You must choose a valid panel.'); | |||||
| $e_panel = pht('Invalid'); | |||||
| } | |||||
| } | |||||
| if (!$errors) { | |||||
| $xactions = array(); | |||||
| $ref_list = clone $dashboard->getPanelRefList(); | |||||
| $ref_list->newPanelRef($panel, $this->columnKey); | |||||
| $new_panels = $ref_list->toDictionary(); | |||||
| $xactions[] = $dashboard->getApplicationTransactionTemplate() | |||||
| ->setTransactionType( | |||||
| PhabricatorDashboardPanelsTransaction::TRANSACTIONTYPE) | |||||
| ->setNewValue($new_panels); | |||||
| $editor = $dashboard->getApplicationTransactionEditor() | |||||
| ->setActor($viewer) | |||||
| ->setContentSourceFromRequest($request) | |||||
| ->setContinueOnNoEffect(true) | |||||
| ->setContinueOnMissingFields(true); | |||||
| $editor->applyTransactions($dashboard, $xactions); | |||||
| return id(new AphrontRedirectResponse())->setURI($done_uri); | |||||
| } | |||||
| } | |||||
| if ($panel_phid) { | |||||
| $panel_phids = array($panel_phid); | |||||
| } else { | |||||
| $panel_phids = array(); | |||||
| } | |||||
| $form = id(new AphrontFormView()) | |||||
| ->setViewer($viewer) | |||||
| ->appendRemarkupInstructions( | |||||
| pht('Choose a panel to add to this dashboard:')) | |||||
| ->appendControl( | |||||
| id(new AphrontFormTokenizerControl()) | |||||
| ->setDatasource(new PhabricatorDashboardPanelDatasource()) | |||||
| ->setLimit(1) | |||||
| ->setName('panelPHIDs') | |||||
| ->setLabel(pht('Panel')) | |||||
| ->setError($e_panel) | |||||
| ->setValue($panel_phids)); | |||||
| return $this->newEditDialog() | |||||
| ->setTitle(pht('Add Panel')) | |||||
| ->setWidth(AphrontDialogView::WIDTH_FORM) | |||||
| ->setErrors($errors) | |||||
| ->appendForm($form) | |||||
| ->addCancelButton($done_uri) | |||||
| ->addSubmitButton(pht('Add Panel')); | |||||
| } | |||||
| private function handleRemoveRequest( | |||||
| PhabricatorDashboard $dashboard, | |||||
| PhabricatorDashboardPanelRef $panel_ref, | |||||
| $done_uri) { | |||||
| $request = $this->getRequest(); | |||||
| $viewer = $this->getViewer(); | |||||
| // NOTE: If you can edit a dashboard, you can remove panels from it even | |||||
| // if you don't have permission to see them or they aren't valid. We only | |||||
| // require that the panel be present on the dashboard. | |||||
| if ($request->isFormPost()) { | |||||
| $xactions = array(); | |||||
| $ref_list = clone $dashboard->getPanelRefList(); | |||||
| $ref_list->removePanelRef($panel_ref); | |||||
| $new_panels = $ref_list->toDictionary(); | |||||
| $xactions[] = $dashboard->getApplicationTransactionTemplate() | |||||
| ->setTransactionType( | |||||
| PhabricatorDashboardPanelsTransaction::TRANSACTIONTYPE) | |||||
| ->setNewValue($new_panels); | |||||
| $editor = $dashboard->getApplicationTransactionEditor() | |||||
| ->setActor($viewer) | |||||
| ->setContentSourceFromRequest($request) | |||||
| ->setContinueOnNoEffect(true) | |||||
| ->setContinueOnMissingFields(true); | |||||
| $editor->applyTransactions($dashboard, $xactions); | |||||
| return id(new AphrontRedirectResponse())->setURI($done_uri); | |||||
| } | |||||
| $panel_phid = $panel_ref->getPanelPHID(); | |||||
| $handles = $viewer->loadHandles(array($panel_phid)); | |||||
| $handle = $handles[$panel_phid]; | |||||
| $message = pht( | |||||
| 'Remove panel %s from dashboard %s?', | |||||
| phutil_tag('strong', array(), $handle->getFullName()), | |||||
| phutil_tag('strong', array(), $dashboard->getName())); | |||||
| return $this->newEditDialog() | |||||
| ->setTitle(pht('Remove Dashboard Panel')) | |||||
| ->appendParagraph($message) | |||||
| ->addCancelButton($done_uri) | |||||
| ->addSubmitButton(pht('Remove Panel')); | |||||
| } | |||||
| private function newEditDialog() { | |||||
| return $this->newDialog() | |||||
| ->addHiddenInput('contextPHID', $this->contextPHID) | |||||
| ->addHiddenInput('panelKey', $this->panelKey) | |||||
| ->addHiddenInput('columnKey', $this->columnKey); | |||||
| } | |||||
| } | |||||