@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.

Modernize "mailable" typeahead datasources

Summary: Ref T4420. Modernize the mailing list datasource, then build a composite "mailable" datasource.

Test Plan:
- Edited "subscribers" field in Differential revision edit.
- Edited "subscribers" field in Differential search.
- Edited "add subscribers" field in differential revision view.
- Edited "add ccs" field in Diffusion commit view.
- Edited "add emails to CC" in a Herald rule.
- Edited "add ccs" in maniphest bulk editor.
- Edited "add ccs" in maniphest task detail view.
- Edited "CC" on maniphest edit view.
- Edited "subscribers" on maniphest task earch view.
- Edited "CC" on pholio mock edit.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T4420

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

+79 -43
+4
src/__phutil_library_map__.php
··· 1768 1768 'PhabricatorMailReceiverTestCase' => 'applications/metamta/receiver/__tests__/PhabricatorMailReceiverTestCase.php', 1769 1769 'PhabricatorMailReplyHandler' => 'applications/metamta/replyhandler/PhabricatorMailReplyHandler.php', 1770 1770 'PhabricatorMailgunConfigOptions' => 'applications/config/option/PhabricatorMailgunConfigOptions.php', 1771 + 'PhabricatorMailingListDatasource' => 'applications/mailinglists/typeahead/PhabricatorMailingListDatasource.php', 1771 1772 'PhabricatorMailingListPHIDTypeList' => 'applications/mailinglists/phid/PhabricatorMailingListPHIDTypeList.php', 1772 1773 'PhabricatorMailingListQuery' => 'applications/mailinglists/query/PhabricatorMailingListQuery.php', 1773 1774 'PhabricatorMailingListSearchEngine' => 'applications/mailinglists/query/PhabricatorMailingListSearchEngine.php', ··· 1800 1801 'PhabricatorMetaMTAMailBody' => 'applications/metamta/view/PhabricatorMetaMTAMailBody.php', 1801 1802 'PhabricatorMetaMTAMailBodyTestCase' => 'applications/metamta/view/__tests__/PhabricatorMetaMTAMailBodyTestCase.php', 1802 1803 'PhabricatorMetaMTAMailTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMetaMTAMailTestCase.php', 1804 + 'PhabricatorMetaMTAMailableDatasource' => 'applications/metamta/typeahead/PhabricatorMetaMTAMailableDatasource.php', 1803 1805 'PhabricatorMetaMTAMailgunReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTAMailgunReceiveController.php', 1804 1806 'PhabricatorMetaMTAMailingList' => 'applications/mailinglists/storage/PhabricatorMetaMTAMailingList.php', 1805 1807 'PhabricatorMetaMTAMemberQuery' => 'applications/metamta/query/PhabricatorMetaMTAMemberQuery.php', ··· 4567 4569 'PhabricatorMailManagementWorkflow' => 'PhabricatorManagementWorkflow', 4568 4570 'PhabricatorMailReceiverTestCase' => 'PhabricatorTestCase', 4569 4571 'PhabricatorMailgunConfigOptions' => 'PhabricatorApplicationConfigOptions', 4572 + 'PhabricatorMailingListDatasource' => 'PhabricatorTypeaheadDatasource', 4570 4573 'PhabricatorMailingListPHIDTypeList' => 'PhabricatorPHIDType', 4571 4574 'PhabricatorMailingListQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 4572 4575 'PhabricatorMailingListSearchEngine' => 'PhabricatorApplicationSearchEngine', ··· 4593 4596 'PhabricatorMetaMTAMail' => 'PhabricatorMetaMTADAO', 4594 4597 'PhabricatorMetaMTAMailBodyTestCase' => 'PhabricatorTestCase', 4595 4598 'PhabricatorMetaMTAMailTestCase' => 'PhabricatorTestCase', 4599 + 'PhabricatorMetaMTAMailableDatasource' => 'PhabricatorTypeaheadCompositeDatasource', 4596 4600 'PhabricatorMetaMTAMailgunReceiveController' => 'PhabricatorMetaMTAController', 4597 4601 'PhabricatorMetaMTAMailingList' => array( 4598 4602 0 => 'PhabricatorMetaMTADAO',
+1 -1
src/applications/differential/customfield/DifferentialSubscribersField.php
··· 44 44 public function renderEditControl(array $handles) { 45 45 return id(new AphrontFormTokenizerControl()) 46 46 ->setName($this->getFieldKey()) 47 - ->setDatasource('/typeahead/common/mailable/') 47 + ->setDatasource(new PhabricatorMetaMTAMailableDatasource()) 48 48 ->setValue($handles) 49 49 ->setError($this->getFieldError()) 50 50 ->setLabel($this->getFieldName());
+1 -1
src/applications/differential/query/DifferentialRevisionSearchEngine.php
··· 161 161 id(new AphrontFormTokenizerControl()) 162 162 ->setLabel(pht('Subscribers')) 163 163 ->setName('subscribers') 164 - ->setDatasource('/typeahead/common/allmailable/') 164 + ->setDatasource(new PhabricatorMetaMTAMailableDatasource()) 165 165 ->setValue(array_select_keys($handles, $subscriber_phids))) 166 166 ->appendChild( 167 167 id(new AphrontFormTokenizerControl())
+4 -2
src/applications/differential/view/DifferentialAddCommentView.php
··· 108 108 id(new AphrontFormSubmitControl()) 109 109 ->setValue(pht('Submit'))); 110 110 111 + $mailable_source = new PhabricatorMetaMTAMailableDatasource(); 112 + 111 113 Javelin::initBehavior( 112 114 'differential-add-reviewers-and-ccs', 113 115 array( ··· 126 128 ), 127 129 'add-ccs-tokenizer' => array( 128 130 'actions' => array('add_ccs' => 1), 129 - 'src' => '/typeahead/common/mailable/', 131 + 'src' => $mailable_source->getDatasourceURI(), 130 132 'value' => $this->ccs, 131 133 'row' => 'add-ccs', 132 - 'placeholder' => pht('Type a user or mailing list...'), 134 + 'placeholder' => $mailable_source->getPlaceholderText(), 133 135 ), 134 136 ), 135 137 'select' => 'comment-action',
+4 -2
src/applications/diffusion/controller/DiffusionCommitController.php
··· 771 771 772 772 require_celerity_resource('phabricator-transaction-view-css'); 773 773 774 + $mailable_source = new PhabricatorMetaMTAMailableDatasource(); 775 + 774 776 Javelin::initBehavior( 775 777 'differential-add-reviewers-and-ccs', 776 778 array( ··· 783 785 ), 784 786 'add-ccs-tokenizer' => array( 785 787 'actions' => array('add_ccs' => 1), 786 - 'src' => '/typeahead/common/mailable/', 788 + 'src' => $mailable_source->getDatasourceURI(), 787 789 'row' => 'add-ccs', 788 - 'placeholder' => pht('Type a user or mailing list...'), 790 + 'placeholder' => $mailable_source->getPlaceholderText(), 789 791 ), 790 792 ), 791 793 'select' => 'audit-action',
+1 -1
src/applications/herald/controller/HeraldRuleController.php
··· 597 597 'package' => new PhabricatorOwnersPackageDatasource(), 598 598 'project' => new PhabricatorProjectDatasource(), 599 599 'user' => new PhabricatorPeopleDatasource(), 600 + 'email' => new PhabricatorMetaMTAMailableDatasource(), 600 601 ); 601 602 602 603 $sources = mpull($sources, 'getDatasourceURI'); 603 604 $sources += array( 604 - 'email' => '/typeahead/common/mailable/', 605 605 'userorproject' => '/typeahead/common/accountsorprojects/', 606 606 ); 607 607
+33
src/applications/mailinglists/typeahead/PhabricatorMailingListDatasource.php
··· 1 + <?php 2 + 3 + final class PhabricatorMailingListDatasource 4 + extends PhabricatorTypeaheadDatasource { 5 + 6 + public function getPlaceholderText() { 7 + return pht('Type a mailing list name...'); 8 + } 9 + 10 + public function getDatasourceApplicationClass() { 11 + return 'PhabricatorApplicationMailingLists'; 12 + } 13 + 14 + public function loadResults() { 15 + $viewer = $this->getViewer(); 16 + $raw_query = $this->getRawQuery(); 17 + 18 + $results = array(); 19 + 20 + $lists = id(new PhabricatorMailingListQuery()) 21 + ->setViewer($viewer) 22 + ->execute(); 23 + foreach ($lists as $list) { 24 + $results[] = id(new PhabricatorTypeaheadResult()) 25 + ->setName($list->getName()) 26 + ->setURI($list->getURI()) 27 + ->setPHID($list->getPHID()); 28 + } 29 + 30 + return $results; 31 + } 32 + 33 + }
+3 -2
src/applications/maniphest/controller/ManiphestBatchEditController.php
··· 62 62 $template = $template->render(); 63 63 64 64 $projects_source = new PhabricatorProjectDatasource(); 65 + $mailable_source = new PhabricatorMetaMTAMailableDatasource(); 65 66 66 67 require_celerity_resource('maniphest-batch-editor'); 67 68 Javelin::initBehavior( ··· 81 82 'limit' => 1, 82 83 ), 83 84 'cc' => array( 84 - 'src' => '/typeahead/common/mailable/', 85 - 'placeholder' => pht('Type a user name...'), 85 + 'src' => $mailable_source->getDatasourceURI(), 86 + 'placeholder' => $mailable_source->getPlaceholderText(), 86 87 ) 87 88 ), 88 89 'input' => 'batch-form-actions',
+3 -2
src/applications/maniphest/controller/ManiphestTaskDetailController.php
··· 284 284 285 285 $projects_source = new PhabricatorProjectDatasource(); 286 286 $users_source = new PhabricatorPeopleDatasource(); 287 + $mailable_source = new PhabricatorMetaMTAMailableDatasource(); 287 288 288 289 $tokenizer_map = array( 289 290 ManiphestTransaction::TYPE_PROJECTS => array( ··· 300 301 ), 301 302 ManiphestTransaction::TYPE_CCS => array( 302 303 'id' => 'cc-tokenizer', 303 - 'src' => '/typeahead/common/mailable/', 304 - 'placeholder' => pht('Type a user or mailing list...'), 304 + 'src' => $mailable_source->getDatasourceURI(), 305 + 'placeholder' => $mailable_source->getPlaceholderText(), 305 306 ), 306 307 ); 307 308
+1 -1
src/applications/maniphest/controller/ManiphestTaskEditController.php
··· 613 613 ->setName('cc') 614 614 ->setValue($cc_value) 615 615 ->setUser($user) 616 - ->setDatasource('/typeahead/common/mailable/')); 616 + ->setDatasource(new PhabricatorMetaMTAMailableDatasource())); 617 617 618 618 if ($can_edit_priority) { 619 619 $form
+1 -1
src/applications/maniphest/query/ManiphestTaskSearchEngine.php
··· 365 365 ->setValue($author_handles)) 366 366 ->appendChild( 367 367 id(new AphrontFormTokenizerControl()) 368 - ->setDatasource('/typeahead/common/mailable/') 368 + ->setDatasource(new PhabricatorMetaMTAMailableDatasource()) 369 369 ->setName('subscribers') 370 370 ->setLabel(pht('Subscribers')) 371 371 ->setValue($subscriber_handles))
+22
src/applications/metamta/typeahead/PhabricatorMetaMTAMailableDatasource.php
··· 1 + <?php 2 + 3 + final class PhabricatorMetaMTAMailableDatasource 4 + extends PhabricatorTypeaheadCompositeDatasource { 5 + 6 + public function getPlaceholderText() { 7 + return pht('Type a user, project, or mailing list name...'); 8 + } 9 + 10 + public function getDatasourceApplicationClass() { 11 + return 'PhabricatorApplicationMetaMTA'; 12 + } 13 + 14 + public function getComponentDatasources() { 15 + return array( 16 + new PhabricatorPeopleDatasource(), 17 + new PhabricatorProjectDatasource(), 18 + new PhabricatorMailingListDatasource(), 19 + ); 20 + } 21 + 22 + }
+1 -1
src/applications/pholio/controller/PholioMockEditController.php
··· 354 354 ->setName('cc') 355 355 ->setValue($handles) 356 356 ->setUser($user) 357 - ->setDatasource('/typeahead/common/mailable/')) 357 + ->setDatasource(new PhabricatorMetaMTAMailableDatasource())) 358 358 ->appendChild( 359 359 id(new AphrontFormPolicyControl()) 360 360 ->setUser($user)
-19
src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php
··· 24 24 $need_users = false; 25 25 $need_agents = false; 26 26 $need_applications = false; 27 - $need_lists = false; 28 27 $need_projs = false; 29 28 $need_packages = false; 30 29 $need_upforgrabs = false; ··· 47 46 case 'searchproject': 48 47 $need_projs = true; 49 48 $need_noproject = true; 50 - break; 51 - case 'mailable': 52 - case 'allmailable': 53 - $need_users = true; 54 - $need_lists = true; 55 - $need_projs = true; 56 49 break; 57 50 case 'usersorprojects': 58 51 case 'accountsorprojects': ··· 176 169 $result->setImageURI($handles[$user->getPHID()]->getImageURI()); 177 170 } 178 171 $results[] = $result; 179 - } 180 - } 181 - 182 - if ($need_lists) { 183 - $lists = id(new PhabricatorMailingListQuery()) 184 - ->setViewer($viewer) 185 - ->execute(); 186 - foreach ($lists as $list) { 187 - $results[] = id(new PhabricatorTypeaheadResult()) 188 - ->setName($list->getName()) 189 - ->setURI($list->getURI()) 190 - ->setPHID($list->getPHID()); 191 172 } 192 173 } 193 174
-10
src/view/form/control/AphrontFormTokenizerControl.php
··· 95 95 $request = $matches[1]; 96 96 97 97 $map = array( 98 - 'users' => pht('Type a user name...'), 99 - 'authors' => pht('Type a user name...'), 100 98 'usersorprojects' => pht('Type a user or project name...'), 101 99 'searchowner' => pht('Type a user name...'), 102 - 'accounts' => pht('Type a user name...'), 103 - 'mailable' => pht('Type a user, project, or mailing list...'), 104 - 'allmailable' => pht('Type a user, project, or mailing list...'), 105 100 'searchproject' => pht('Type a project name...'), 106 - 'projects' => pht('Type a project name...'), 107 - 'repositories' => pht('Type a repository name...'), 108 - 'packages' => pht('Type a package name...'), 109 - 'macros' => pht('Type a macro name...'), 110 - 'arcanistproject' => pht('Type an arc project name...'), 111 101 'accountsorprojects' => pht('Type a user or project name...'), 112 102 'usersprojectsorpackages' => 113 103 pht('Type a user, project, or package name...'),