@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at recaptime-dev/main 124 lines 4.1 kB view raw
1<?php 2 3final class PhabricatorApplicationUninstallController 4 extends PhabricatorApplicationsController { 5 6 public function handleRequest(AphrontRequest $request) { 7 $viewer = $request->getViewer(); 8 $user = $request->getUser(); 9 $action = $request->getURIData('action'); 10 $application_name = $request->getURIData('application'); 11 12 $application = id(new PhabricatorApplicationQuery()) 13 ->setViewer($viewer) 14 ->withClasses(array($application_name)) 15 ->requireCapabilities( 16 array( 17 PhabricatorPolicyCapability::CAN_VIEW, 18 PhabricatorPolicyCapability::CAN_EDIT, 19 )) 20 ->executeOne(); 21 22 if (!$application) { 23 return new Aphront404Response(); 24 } 25 26 $view_uri = $this->getApplicationURI('view/'.$application_name); 27 28 $prototypes_enabled = PhabricatorEnv::getEnvConfig( 29 'phabricator.show-prototypes'); 30 31 $dialog = id(new AphrontDialogView()) 32 ->setUser($viewer) 33 ->addCancelButton($view_uri); 34 35 if ($application->isPrototype() && !$prototypes_enabled) { 36 $dialog 37 ->setTitle(pht('Prototypes Not Enabled')) 38 ->appendChild( 39 pht( 40 'To manage prototypes, enable them by setting %s in your '. 41 'configuration.', 42 phutil_tag('tt', array(), 'phabricator.show-prototypes'))); 43 return id(new AphrontDialogResponse())->setDialog($dialog); 44 } 45 46 if ($request->isFormOrHisecPost()) { 47 $xactions = array(); 48 $template = $application->getApplicationTransactionTemplate(); 49 $xactions[] = id(clone $template) 50 ->setTransactionType( 51 PhabricatorApplicationUninstallTransaction::TRANSACTIONTYPE) 52 ->setNewValue($action); 53 54 $editor = id(new PhabricatorApplicationEditor()) 55 ->setActor($user) 56 ->setContentSourceFromRequest($request) 57 ->setCancelURI($view_uri) 58 ->setContinueOnNoEffect(true) 59 ->setContinueOnMissingFields(true); 60 61 try { 62 $editor->applyTransactions($application, $xactions); 63 return id(new AphrontRedirectResponse())->setURI($view_uri); 64 } catch (PhabricatorApplicationTransactionValidationException $ex) { 65 $validation_exception = $ex; 66 } 67 68 return $this->newDialog() 69 ->setTitle(pht('Validation Failed')) 70 ->setValidationException($validation_exception) 71 ->addCancelButton($view_uri); 72 } 73 74 if ($action == 'install') { 75 if ($application->canUninstall()) { 76 $dialog 77 ->setTitle(pht('Confirmation')) 78 ->appendChild( 79 pht( 80 'Enable %s application?', 81 $application->getName())) 82 ->addSubmitButton(pht('Enable')); 83 84 } else { 85 $dialog 86 ->setTitle(pht('Information')) 87 ->appendChild(pht('You cannot enable an enabled application.')); 88 } 89 } else { 90 if ($application->canUninstall()) { 91 $dialog->setTitle(pht('Really Disable Application?')); 92 93 if ($application instanceof PhabricatorHomeApplication) { 94 $dialog 95 ->appendParagraph( 96 pht( 97 'Are you absolutely certain you want to disable the Home '. 98 'application?')) 99 ->appendParagraph( 100 pht( 101 'This is very unusual and will leave you without any '. 102 'content on the home page. You should only do this if you '. 103 'are certain you know what you are doing.')) 104 ->addSubmitButton(pht('Completely Break Everything')); 105 } else { 106 $dialog 107 ->appendParagraph( 108 pht( 109 'Really disable the %s application?', 110 $application->getName())) 111 ->addSubmitButton(pht('Disable')); 112 } 113 } else { 114 $dialog 115 ->setTitle(pht('Information')) 116 ->appendChild( 117 pht( 118 'This application is required and cannot be disabled.')); 119 } 120 } 121 return id(new AphrontDialogResponse())->setDialog($dialog); 122 } 123 124}