@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
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Support disabling calendar imports

Summary: Ref T10747. This doesn't do much for ICS file imports (you can't disable them since it doesn't do anything meaningful) but will matter more for ICS-subscription imports later.

Test Plan: Clicked "Disable" on an ICS file import, got explanatory dialog.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10747

Differential Revision: https://secure.phabricator.com/D16702

+102 -1
+2
src/__phutil_library_map__.php
··· 2102 2102 'PhabricatorCalendarICSWriter' => 'applications/calendar/util/PhabricatorCalendarICSWriter.php', 2103 2103 'PhabricatorCalendarIconSet' => 'applications/calendar/icon/PhabricatorCalendarIconSet.php', 2104 2104 'PhabricatorCalendarImport' => 'applications/calendar/storage/PhabricatorCalendarImport.php', 2105 + 'PhabricatorCalendarImportDisableController' => 'applications/calendar/controller/PhabricatorCalendarImportDisableController.php', 2105 2106 'PhabricatorCalendarImportDisableTransaction' => 'applications/calendar/xaction/PhabricatorCalendarImportDisableTransaction.php', 2106 2107 'PhabricatorCalendarImportEditController' => 'applications/calendar/controller/PhabricatorCalendarImportEditController.php', 2107 2108 'PhabricatorCalendarImportEditEngine' => 'applications/calendar/editor/PhabricatorCalendarImportEditEngine.php', ··· 6905 6906 'PhabricatorApplicationTransactionInterface', 6906 6907 'PhabricatorDestructibleInterface', 6907 6908 ), 6909 + 'PhabricatorCalendarImportDisableController' => 'PhabricatorCalendarController', 6908 6910 'PhabricatorCalendarImportDisableTransaction' => 'PhabricatorCalendarImportTransactionType', 6909 6911 'PhabricatorCalendarImportEditController' => 'PhabricatorCalendarController', 6910 6912 'PhabricatorCalendarImportEditEngine' => 'PhabricatorEditEngine',
+71
src/applications/calendar/controller/PhabricatorCalendarImportDisableController.php
··· 1 + <?php 2 + 3 + final class PhabricatorCalendarImportDisableController 4 + extends PhabricatorCalendarController { 5 + 6 + public function handleRequest(AphrontRequest $request) { 7 + $viewer = $request->getViewer(); 8 + 9 + $import = id(new PhabricatorCalendarImportQuery()) 10 + ->setViewer($viewer) 11 + ->withIDs(array($request->getURIData('id'))) 12 + ->requireCapabilities( 13 + array( 14 + PhabricatorPolicyCapability::CAN_VIEW, 15 + PhabricatorPolicyCapability::CAN_EDIT, 16 + )) 17 + ->executeOne(); 18 + if (!$import) { 19 + return new Aphront404Response(); 20 + } 21 + 22 + $import_uri = $import->getURI(); 23 + $is_disable = !$import->getIsDisabled(); 24 + 25 + if (!$import->getEngine()->canDisable($viewer, $import)) { 26 + $reason = $import->getEngine()->explainCanDisable($viewer, $import); 27 + return $this->newDialog() 28 + ->setTitle(pht('Unable to Disable')) 29 + ->appendParagraph($reason) 30 + ->addCancelButton($import_uri); 31 + } 32 + 33 + if ($request->isFormPost()) { 34 + $xactions = array(); 35 + $xactions[] = id(new PhabricatorCalendarImportTransaction()) 36 + ->setTransactionType( 37 + PhabricatorCalendarImportDisableTransaction::TRANSACTIONTYPE) 38 + ->setNewValue($is_disable ? 1 : 0); 39 + 40 + $editor = id(new PhabricatorCalendarImportEditor()) 41 + ->setActor($viewer) 42 + ->setContinueOnNoEffect(true) 43 + ->setContinueOnMissingFields(true) 44 + ->setContentSourceFromRequest($request); 45 + 46 + $editor->applyTransactions($import, $xactions); 47 + 48 + return id(new AphrontRedirectResponse())->setURI($import_uri); 49 + } 50 + 51 + if ($is_disable) { 52 + $title = pht('Disable Import'); 53 + $body = pht( 54 + 'Disable this import? Events from this source will no longer be '. 55 + 'updated.'); 56 + $button = pht('Disable Import'); 57 + } else { 58 + $title = pht('Enable Import'); 59 + $body = pht( 60 + 'Enable this import? Events from this source will be updated again.'); 61 + $button = pht('Enable Import'); 62 + } 63 + 64 + return $this->newDialog() 65 + ->setTitle($title) 66 + ->appendParagraph($body) 67 + ->addCancelButton($import_uri) 68 + ->addSubmitButton($button); 69 + } 70 + 71 + }
+4 -1
src/applications/calendar/controller/PhabricatorCalendarImportViewController.php
··· 80 80 $id = $import->getID(); 81 81 82 82 $curtain = $this->newCurtainView($import); 83 + $engine = $import->getEngine(); 83 84 84 85 $can_edit = PhabricatorPolicyFilter::hasCapability( 85 86 $viewer, ··· 88 89 89 90 $edit_uri = "import/edit/{$id}/"; 90 91 $edit_uri = $this->getApplicationURI($edit_uri); 92 + 93 + $can_disable = ($can_edit && $engine->canDisable($viewer, $import)); 91 94 92 95 $curtain->addAction( 93 96 id(new PhabricatorActionView()) ··· 111 114 id(new PhabricatorActionView()) 112 115 ->setName($disable_name) 113 116 ->setIcon($disable_icon) 114 - ->setDisabled(!$can_edit) 117 + ->setDisabled(!$can_disable) 115 118 ->setWorkflow(true) 116 119 ->setHref($disable_uri)); 117 120
+15
src/applications/calendar/import/PhabricatorCalendarICSImportEngine.php
··· 70 70 } 71 71 72 72 73 + public function canDisable( 74 + PhabricatorUser $viewer, 75 + PhabricatorCalendarImport $import) { 76 + return false; 77 + } 78 + 79 + public function explainCanDisable( 80 + PhabricatorUser $viewer, 81 + PhabricatorCalendarImport $import) { 82 + return pht( 83 + 'You can not disable import of an ICS file because the entire import '. 84 + 'occurs immediately when you upload the file. There is no further '. 85 + 'activity to disable.'); 86 + } 87 + 73 88 74 89 }
+10
src/applications/calendar/import/PhabricatorCalendarImportEngine.php
··· 21 21 PhabricatorUser $viewer, 22 22 PhabricatorCalendarImport $import); 23 23 24 + abstract public function canDisable( 25 + PhabricatorUser $viewer, 26 + PhabricatorCalendarImport $import); 27 + 28 + public function explainCanDisable( 29 + PhabricatorUser $viewer, 30 + PhabricatorCalendarImport $import) { 31 + throw new PhutilMethodNotImplementedException(); 32 + } 33 + 24 34 final public static function getAllImportEngines() { 25 35 return id(new PhutilClassMapQuery()) 26 36 ->setAncestorClass(__CLASS__)