diff --git a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php index 0fa192f5a3..370fdb97ca 100644 --- a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php +++ b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php @@ -1,118 +1,121 @@ application = $data['application']; } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $selected = PhabricatorApplication::getByClass($this->application); if (!$selected) { return new Aphront404Response(); } $title = $selected->getName(); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addCrumb( id(new PhabricatorCrumbView()) ->setName(pht('Applications')) ->setHref($this->getApplicationURI())); $header = id(new PhabricatorHeaderView()) ->setHeader($title); $status_tag = id(new PhabricatorTagView()) ->setType(PhabricatorTagView::TYPE_STATE); if ($selected->isInstalled()) { $status_tag->setName(pht('Installed')); $status_tag->setBackgroundColor(PhabricatorTagView::COLOR_GREEN); } else { $status_tag->setName(pht('Uninstalled')); $status_tag->setBackgroundColor(PhabricatorTagView::COLOR_RED); } if ($selected->isBeta()) { $beta_tag = id(new PhabricatorTagView()) ->setType(PhabricatorTagView::TYPE_STATE) ->setName(pht('Beta')) ->setBackgroundColor(PhabricatorTagView::COLOR_GREY); $header->addTag($beta_tag); } $header->addTag($status_tag); $properties = $this->buildPropertyView($selected); $actions = $this->buildActionView($user, $selected); return $this->buildApplicationPage( array( $crumbs, $header, $actions, $properties, ), array( 'title' => $title, 'device' => true, )); } private function buildPropertyView(PhabricatorApplication $selected) { $properties = id(new PhabricatorPropertyListView()) ->addProperty( pht('Description'), $selected->getShortDescription() ); return $properties; } private function buildActionView( PhabricatorUser $user, PhabricatorApplication $selected) { $view = id(new PhabricatorActionListView()) ->setUser($user); if ($selected->canUninstall()) { if ($selected->isInstalled()) { $view->addAction( id(new PhabricatorActionView()) ->setName(pht('Uninstall')) ->setIcon('delete') + ->setWorkflow(true) ->setHref( $this->getApplicationURI(get_class($selected).'/uninstall/')) ); } else { $view->addAction( id(new PhabricatorActionView()) ->setName(pht('Install')) ->setIcon('new') + ->setWorkflow(true) ->setHref( $this->getApplicationURI(get_class($selected).'/install/')) ); } } else { $view->addAction( id(new PhabricatorActionView()) ->setName(pht('Uninstall')) ->setIcon('delete') + ->setWorkflow(true) ->setDisabled(true) ->setHref( $this->getApplicationURI(get_class($selected).'/uninstall/')) ); } return $view; } } diff --git a/src/applications/meta/controller/PhabricatorApplicationUninstallController.php b/src/applications/meta/controller/PhabricatorApplicationUninstallController.php index 51b03cb08b..feebbed9c8 100644 --- a/src/applications/meta/controller/PhabricatorApplicationUninstallController.php +++ b/src/applications/meta/controller/PhabricatorApplicationUninstallController.php @@ -1,112 +1,114 @@ application = $data['application']; $this->action = $data['action']; } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $selected = PhabricatorApplication::getByClass($this->application); if (!$selected) { return new Aphront404Response(); } + $view_uri = $this->getApplicationURI('view/'.$this->application); + if ($request->isDialogFormPost()) { $this->manageApplication(); - return id(new AphrontRedirectResponse())->setURI('/applications/'); + return id(new AphrontRedirectResponse())->setURI($view_uri); } $dialog = id(new AphrontDialogView()) ->setUser($user) - ->addCancelButton('/applications/view/'.$this->application); + ->addCancelButton($view_uri); if ($this->action == 'install') { if ($selected->canUninstall()) { $dialog->setTitle('Confirmation') ->appendChild( 'Install '. $selected->getName(). ' application ?' ) ->addSubmitButton('Install'); } else { $dialog->setTitle('Information') ->appendChild('You cannot install a installed application.'); } } else { if ($selected->canUninstall()) { $dialog->setTitle('Confirmation') ->appendChild( 'Really Uninstall '. $selected->getName(). ' application ?' ) ->addSubmitButton('Uninstall'); } else { $dialog->setTitle('Information') ->appendChild( 'This application cannot be uninstalled, because it is required for Phabricator to work.' ); } } return id(new AphrontDialogResponse())->setDialog($dialog); } public function manageApplication() { $key = 'phabricator.uninstalled-applications'; $config_entry = id(new PhabricatorConfigEntry()) ->loadOneWhere( 'configKey = %s AND namespace = %s', $key, 'default'); if (!$config_entry) { $config_entry = id(new PhabricatorConfigEntry()) ->setConfigKey($key) ->setNamespace('default'); } $list = $config_entry->getValue(); $uninstalled = PhabricatorEnv::getEnvConfig($key); if ($uninstalled[$this->application]) { unset($list[$this->application]); } else { $list[$this->application] = true; } $xaction = id(new PhabricatorConfigTransaction()) ->setTransactionType(PhabricatorConfigTransaction::TYPE_EDIT) ->setNewValue( array( 'deleted' => false, 'value' => $list )); $editor = id(new PhabricatorConfigEditor()) ->setActor($this->getRequest()->getUser()) ->setContinueOnNoEffect(true) ->setContentSource( PhabricatorContentSource::newForSource( PhabricatorContentSource::SOURCE_WEB, array( 'ip' => $this->getRequest()->getRemoteAddr(), ))); $editor->applyTransactions($config_entry, array($xaction)); } }