diff --git a/src/applications/dashboard/application/PhabricatorDashboardApplication.php b/src/applications/dashboard/application/PhabricatorDashboardApplication.php index 1e76c1e57b..5e55ade04e 100644 --- a/src/applications/dashboard/application/PhabricatorDashboardApplication.php +++ b/src/applications/dashboard/application/PhabricatorDashboardApplication.php @@ -1,62 +1,58 @@ \d+)' => 'PhabricatorDashboardPanelViewController', '/dashboard/' => array( '(?:query/(?P[^/]+)/)?' => 'PhabricatorDashboardListController', 'view/(?P\d+)/' => 'PhabricatorDashboardViewController', 'manage/(?P\d+)/' => 'PhabricatorDashboardManageController', 'history/(?P\d+)/' => 'PhabricatorDashboardHistoryController', 'create/' => 'PhabricatorDashboardEditController', 'copy/(?:(?P\d+)/)?' => 'PhabricatorDashboardCopyController', 'edit/(?:(?P\d+)/)?' => 'PhabricatorDashboardEditController', 'install/(?P\d+)/' => 'PhabricatorDashboardInstallController', 'uninstall/(?P\d+)/' => 'PhabricatorDashboardUninstallController', 'addpanel/(?P\d+)/' => 'PhabricatorDashboardAddPanelController', 'movepanel/(?P\d+)/' => 'PhabricatorDashboardMovePanelController', 'removepanel/(?P\d+)/' => 'PhabricatorDashboardRemovePanelController', 'panel/' => array( '(?:query/(?P[^/]+)/)?' => 'PhabricatorDashboardPanelListController', 'create/' => 'PhabricatorDashboardPanelEditController', 'edit/(?:(?P\d+)/)?' => 'PhabricatorDashboardPanelEditController', 'render/(?P\d+)/' => 'PhabricatorDashboardPanelRenderController', 'archive/(?P\d+)/' => 'PhabricatorDashboardPanelArchiveController', ), ), ); } public function getRemarkupRules() { return array( new PhabricatorDashboardRemarkupRule(), ); } - public function canUninstall() { - return false; - } - } diff --git a/src/applications/home/application/PhabricatorHomeApplication.php b/src/applications/home/application/PhabricatorHomeApplication.php index 88329023da..b2b77f7c30 100644 --- a/src/applications/home/application/PhabricatorHomeApplication.php +++ b/src/applications/home/application/PhabricatorHomeApplication.php @@ -1,124 +1,120 @@ 'PhabricatorHomeMainController', '/(?Phome)/' => 'PhabricatorHomeMainController', '/home/' => array( 'create/' => 'PhabricatorHomeQuickCreateController', ), ); } public function isLaunchable() { return false; } - public function canUninstall() { - return false; - } - public function getApplicationOrder() { return 9; } public function buildMainMenuItems( PhabricatorUser $user, PhabricatorController $controller = null) { $quick_create_items = $this->loadAllQuickCreateItems($user); $items = array(); if ($user->isLoggedIn() && $user->isUserActivated() && $quick_create_items) { $create_id = celerity_generate_unique_node_id(); Javelin::initBehavior( 'aphlict-dropdown', array( 'bubbleID' => $create_id, 'dropdownID' => 'phabricator-quick-create-menu', 'local' => true, 'desktop' => true, 'right' => true, )); $item = id(new PHUIListItemView()) ->setName(pht('Create New...')) ->setIcon('fa-plus') ->addClass('core-menu-item') ->setHref('/home/create/') ->addSigil('quick-create-menu') ->setID($create_id) ->setAural(pht('Quick Create')) ->setOrder(300); $items[] = $item; } return $items; } public function loadAllQuickCreateItems(PhabricatorUser $viewer) { $applications = id(new PhabricatorApplicationQuery()) ->setViewer($viewer) ->withInstalled(true) ->execute(); $items = array(); foreach ($applications as $application) { $app_items = $application->getQuickCreateItems($viewer); foreach ($app_items as $app_item) { $items[] = $app_item; } } return $items; } public function buildMainMenuExtraNodes( PhabricatorUser $viewer, PhabricatorController $controller = null) { $items = $this->loadAllQuickCreateItems($viewer); $view = null; if ($items) { $view = new PHUIListView(); $view->newLabel(pht('Create New...')); foreach ($items as $item) { $view->addMenuItem($item); } return phutil_tag( 'div', array( 'id' => 'phabricator-quick-create-menu', 'class' => 'phabricator-main-menu-dropdown phui-list-sidenav', 'style' => 'display: none', ), $view); } return $view; } } diff --git a/src/applications/meta/controller/PhabricatorApplicationUninstallController.php b/src/applications/meta/controller/PhabricatorApplicationUninstallController.php index 883d1d6ba0..744e9598f8 100644 --- a/src/applications/meta/controller/PhabricatorApplicationUninstallController.php +++ b/src/applications/meta/controller/PhabricatorApplicationUninstallController.php @@ -1,99 +1,117 @@ 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); $prototypes_enabled = PhabricatorEnv::getEnvConfig( 'phabricator.show-prototypes'); $dialog = id(new AphrontDialogView()) ->setUser($user) ->addCancelButton($view_uri); if ($selected->isPrototype() && !$prototypes_enabled) { $dialog ->setTitle(pht('Prototypes Not Enabled')) ->appendChild( pht( 'To manage prototypes, enable them by setting %s in your '. 'Phabricator configuration.', phutil_tag('tt', array(), 'phabricator.show-prototypes'))); return id(new AphrontDialogResponse())->setDialog($dialog); } if ($request->isDialogFormPost()) { $this->manageApplication(); return id(new AphrontRedirectResponse())->setURI($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 an installed application.'); } } else { if ($selected->canUninstall()) { - $dialog->setTitle('Confirmation') - ->appendChild( - 'Really Uninstall '.$selected->getName().' application?') - ->addSubmitButton('Uninstall'); + $dialog->setTitle(pht('Really Uninstall Application?')); + + if ($selected instanceof PhabricatorHomeApplication) { + $dialog + ->appendParagraph( + pht( + 'Are you absolutely certain you want to uninstall the Home '. + 'application?')) + ->appendParagraph( + pht( + 'This is very unusual and will leave you without any '. + 'content on the Phabricator home page. You should only '. + 'do this if you are certain you know what you are doing.')) + ->addSubmitButton(pht('Completely Break Phabricator')); + } else { + $dialog + ->appendParagraph( + pht( + 'Really uninstall the %s application?', + $selected->getName())) + ->addSubmitButton(pht('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 = PhabricatorConfigEntry::loadConfigEntry($key); $list = $config_entry->getValue(); $uninstalled = PhabricatorEnv::getEnvConfig($key); if (isset($uninstalled[$this->application])) { unset($list[$this->application]); } else { $list[$this->application] = true; } PhabricatorConfigEditor::storeNewValue( $this->getRequest()->getUser(), $config_entry, $list, PhabricatorContentSource::newFromRequest($this->getRequest())); } }