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

Move "Mailing Lists" to a separate application

Summary:
There's currently no way to get here from the UI since nav tabs don't exist anymore. It's also always been hard to find this feature even when we had the tabs, since it's surprising that it's inside "MetaMTA".

- Move mailing lists to a separate application.
- Add `buildApplicationPage()`, since we don't really need `buildStandardPageResponse()` any more -- we can infer all the information from `PhabricatorApplication`. This will let us get rid of a lot of the `PhabricatorXXXController` classes which just define application information.
- Add `getApplicationURI()` to reduce code duplication, and in case we want to let you move applications around some day.

Test Plan: Looked/edited/saved mailing lists.

Reviewers: btrahan, vrana

Reviewed By: btrahan

CC: aran

Maniphest Tasks: T631

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

+132 -41
+1 -1
src/__celerity_resource_map__.php
··· 2564 2564 ), 2565 2565 'phabricator-nav-view-css' => 2566 2566 array( 2567 - 'uri' => '/res/82636b80/rsrc/css/aphront/phabricator-nav-view.css', 2567 + 'uri' => '/res/051b6ab6/rsrc/css/aphront/phabricator-nav-view.css', 2568 2568 'type' => 'css', 2569 2569 'requires' => 2570 2570 array(
+8 -6
src/__phutil_library_map__.php
··· 551 551 'PhabricatorApplicationFact' => 'applications/fact/application/PhabricatorApplicationFact.php', 552 552 'PhabricatorApplicationFlags' => 'applications/flag/application/PhabricatorApplicationFlags.php', 553 553 'PhabricatorApplicationLaunchView' => 'applications/meta/view/PhabricatorApplicationLaunchView.php', 554 + 'PhabricatorApplicationMailingLists' => 'applications/mailinglists/application/PhabricatorApplicationMailingLists.php', 554 555 'PhabricatorApplicationManiphest' => 'applications/maniphest/application/PhabricatorApplicationManiphest.php', 555 556 'PhabricatorApplicationPeople' => 'applications/people/application/PhabricatorApplicationPeople.php', 556 557 'PhabricatorApplicationPhriction' => 'applications/phriction/application/PhabricatorApplicationPhriction.php', ··· 777 778 'PhabricatorMailImplementationSendGridAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationSendGridAdapter.php', 778 779 'PhabricatorMailImplementationTestAdapter' => 'applications/metamta/adapter/PhabricatorMailImplementationTestAdapter.php', 779 780 'PhabricatorMailReplyHandler' => 'applications/metamta/replyhandler/PhabricatorMailReplyHandler.php', 781 + 'PhabricatorMailingListsEditController' => 'applications/mailinglists/controller/PhabricatorMailingListsEditController.php', 782 + 'PhabricatorMailingListsListController' => 'applications/mailinglists/controller/PhabricatorMailingListsListController.php', 780 783 'PhabricatorMainMenuGroupView' => 'view/page/menu/PhabricatorMainMenuGroupView.php', 781 784 'PhabricatorMainMenuIconView' => 'view/page/menu/PhabricatorMainMenuIconView.php', 782 785 'PhabricatorMainMenuSearchView' => 'view/page/menu/PhabricatorMainMenuSearchView.php', ··· 795 798 'PhabricatorMetaMTAMailBody' => 'applications/metamta/view/PhabricatorMetaMTAMailBody.php', 796 799 'PhabricatorMetaMTAMailBodyTestCase' => 'applications/metamta/view/__tests__/PhabricatorMetaMTAMailBodyTestCase.php', 797 800 'PhabricatorMetaMTAMailTestCase' => 'applications/metamta/storage/__tests__/PhabricatorMetaMTAMailTestCase.php', 798 - 'PhabricatorMetaMTAMailingList' => 'applications/metamta/storage/PhabricatorMetaMTAMailingList.php', 799 - 'PhabricatorMetaMTAMailingListEditController' => 'applications/metamta/controller/PhabricatorMetaMTAMailingListEditController.php', 800 - 'PhabricatorMetaMTAMailingListsController' => 'applications/metamta/controller/PhabricatorMetaMTAMailingListsController.php', 801 + 'PhabricatorMetaMTAMailingList' => 'applications/mailinglists/storage/PhabricatorMetaMTAMailingList.php', 801 802 'PhabricatorMetaMTAReceiveController' => 'applications/metamta/controller/PhabricatorMetaMTAReceiveController.php', 802 803 'PhabricatorMetaMTAReceivedListController' => 'applications/metamta/controller/PhabricatorMetaMTAReceivedListController.php', 803 804 'PhabricatorMetaMTAReceivedMail' => 'applications/metamta/storage/PhabricatorMetaMTAReceivedMail.php', ··· 1670 1671 'PhabricatorApplicationFact' => 'PhabricatorApplication', 1671 1672 'PhabricatorApplicationFlags' => 'PhabricatorApplication', 1672 1673 'PhabricatorApplicationLaunchView' => 'AphrontView', 1674 + 'PhabricatorApplicationMailingLists' => 'PhabricatorApplication', 1673 1675 'PhabricatorApplicationManiphest' => 'PhabricatorApplication', 1674 1676 'PhabricatorApplicationPeople' => 'PhabricatorApplication', 1675 1677 'PhabricatorApplicationPhriction' => 'PhabricatorApplication', ··· 1678 1680 'PhabricatorApplicationSettings' => 'PhabricatorApplication', 1679 1681 'PhabricatorApplicationStatusView' => 'AphrontView', 1680 1682 'PhabricatorApplicationsController' => 'PhabricatorController', 1681 - 'PhabricatorApplicationsListController' => 'PhabricatorApplicationsController', 1683 + 'PhabricatorApplicationsListController' => 'PhabricatorController', 1682 1684 'PhabricatorAuditAddCommentController' => 'PhabricatorAuditController', 1683 1685 'PhabricatorAuditComment' => 'PhabricatorAuditDAO', 1684 1686 'PhabricatorAuditCommitListView' => 'AphrontView', ··· 1869 1871 'PhabricatorMailImplementationPHPMailerLiteAdapter' => 'PhabricatorMailImplementationAdapter', 1870 1872 'PhabricatorMailImplementationSendGridAdapter' => 'PhabricatorMailImplementationAdapter', 1871 1873 'PhabricatorMailImplementationTestAdapter' => 'PhabricatorMailImplementationAdapter', 1874 + 'PhabricatorMailingListsEditController' => 'PhabricatorController', 1875 + 'PhabricatorMailingListsListController' => 'PhabricatorController', 1872 1876 'PhabricatorMainMenuGroupView' => 'AphrontView', 1873 1877 'PhabricatorMainMenuIconView' => 'AphrontView', 1874 1878 'PhabricatorMainMenuSearchView' => 'AphrontView', ··· 1882 1886 'PhabricatorMetaMTAMailBodyTestCase' => 'PhabricatorTestCase', 1883 1887 'PhabricatorMetaMTAMailTestCase' => 'PhabricatorTestCase', 1884 1888 'PhabricatorMetaMTAMailingList' => 'PhabricatorMetaMTADAO', 1885 - 'PhabricatorMetaMTAMailingListEditController' => 'PhabricatorMetaMTAController', 1886 - 'PhabricatorMetaMTAMailingListsController' => 'PhabricatorMetaMTAController', 1887 1889 'PhabricatorMetaMTAReceiveController' => 'PhabricatorMetaMTAController', 1888 1890 'PhabricatorMetaMTAReceivedListController' => 'PhabricatorMetaMTAController', 1889 1891 'PhabricatorMetaMTAReceivedMail' => 'PhabricatorMetaMTADAO',
-3
src/aphront/configuration/AphrontDefaultApplicationConfiguration.php
··· 85 85 '' => 'PhabricatorMetaMTAListController', 86 86 'send/' => 'PhabricatorMetaMTASendController', 87 87 'view/(?P<id>\d+)/' => 'PhabricatorMetaMTAViewController', 88 - 'lists/' => 'PhabricatorMetaMTAMailingListsController', 89 - 'lists/edit/(?:(?P<id>\d+)/)?' 90 - => 'PhabricatorMetaMTAMailingListEditController', 91 88 'receive/' => 'PhabricatorMetaMTAReceiveController', 92 89 'received/' => 'PhabricatorMetaMTAReceivedListController', 93 90 'sendgrid/' => 'PhabricatorMetaMTASendGridReceiveController',
+4
src/applications/base/PhabricatorApplication.php
··· 66 66 return null; 67 67 } 68 68 69 + public function getTitleGlyph() { 70 + return null; 71 + } 72 + 69 73 70 74 /* -( URI Routing )-------------------------------------------------------- */ 71 75
+38
src/applications/base/controller/PhabricatorController.php
··· 128 128 return $response; 129 129 } 130 130 131 + public function getApplicationURI($path = '') { 132 + if (!$this->getCurrentApplication()) { 133 + throw new Exception("No application!"); 134 + } 135 + return $this->getCurrentApplication()->getBaseURI().ltrim($path, '/'); 136 + } 137 + 138 + public function buildApplicationPage($view, array $options) { 139 + $page = $this->buildStandardPageView(); 140 + 141 + $application = $this->getCurrentApplication(); 142 + if ($application) { 143 + $page->setApplicationName($application->getName()); 144 + $page->setTitle(idx($options, 'title')); 145 + if ($application->getTitleGlyph()) { 146 + $page->setGlyph($application->getTitleGlyph()); 147 + } 148 + } 149 + 150 + if (!($view instanceof AphrontSideNavFilterView)) { 151 + $nav = new AphrontSideNavFilterView(); 152 + if ($application) { 153 + $nav->setCurrentApplication($application); 154 + } 155 + $nav->setUser($this->getRequest()->getUser()); 156 + $nav->setFlexNav(true); 157 + $nav->setShowApplicationMenu(true); 158 + $nav->appendChild($view); 159 + 160 + $view = $nav; 161 + } 162 + 163 + $page->appendChild($view); 164 + 165 + $response = new AphrontWebpageResponse(); 166 + return $response->setContent($page->render()); 167 + } 168 + 131 169 public function didProcessRequest($response) { 132 170 $request = $this->getRequest(); 133 171 $response->setRequest($request);
+46
src/applications/mailinglists/application/PhabricatorApplicationMailingLists.php
··· 1 + <?php 2 + 3 + /* 4 + * Copyright 2012 Facebook, Inc. 5 + * 6 + * Licensed under the Apache License, Version 2.0 (the "License"); 7 + * you may not use this file except in compliance with the License. 8 + * You may obtain a copy of the License at 9 + * 10 + * http://www.apache.org/licenses/LICENSE-2.0 11 + * 12 + * Unless required by applicable law or agreed to in writing, software 13 + * distributed under the License is distributed on an "AS IS" BASIS, 14 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 + * See the License for the specific language governing permissions and 16 + * limitations under the License. 17 + */ 18 + 19 + final class PhabricatorApplicationMailingLists extends PhabricatorApplication { 20 + 21 + public function getName() { 22 + return 'Mailing Lists'; 23 + } 24 + 25 + public function getBaseURI() { 26 + return '/mailinglists/'; 27 + } 28 + 29 + public function getShortDescription() { 30 + return 'Manage External Lists'; 31 + } 32 + 33 + public function getRoutes() { 34 + return array( 35 + '/mailinglists/' => array( 36 + '' => 'PhabricatorMailingListsListController', 37 + 'edit/(?:(?P<id>\d+)/)?' => 'PhabricatorMailingListsEditController', 38 + ), 39 + ); 40 + } 41 + 42 + public function getTitleGlyph() { 43 + return '@'; 44 + } 45 + 46 + }
+4
src/applications/meta/application/PhabricatorApplicationApplications.php
··· 38 38 ); 39 39 } 40 40 41 + public function getTitleGlyph() { 42 + return "\xE0\xBC\x84"; 43 + } 44 + 41 45 public function shouldAppearInLaunchView() { 42 46 return false; 43 47 }
+2 -2
src/applications/meta/controller/PhabricatorApplicationsListController.php
··· 17 17 */ 18 18 19 19 final class PhabricatorApplicationsListController 20 - extends PhabricatorApplicationsController { 20 + extends PhabricatorController { 21 21 22 22 public function processRequest() { 23 23 $request = $this->getRequest(); ··· 52 52 ), 53 53 id(new AphrontNullView())->appendChild($views)->render()); 54 54 55 - return $this->buildStandardPageResponse( 55 + return $this->buildApplicationPage( 56 56 $view, 57 57 array( 58 58 'title' => 'Applications',
+11 -12
src/applications/metamta/controller/PhabricatorMetaMTAMailingListEditController.php src/applications/mailinglists/controller/PhabricatorMailingListsEditController.php
··· 16 16 * limitations under the License. 17 17 */ 18 18 19 - final class PhabricatorMetaMTAMailingListEditController 20 - extends PhabricatorMetaMTAController { 19 + final class PhabricatorMailingListsEditController 20 + extends PhabricatorController { 21 21 22 22 private $id; 23 23 ··· 74 74 try { 75 75 $list->save(); 76 76 return id(new AphrontRedirectResponse()) 77 - ->setURI('/mail/lists/'); 77 + ->setURI($this->getApplicationURI()); 78 78 } catch (AphrontQueryDuplicateKeyException $ex) { 79 79 $e_email = 'Duplicate'; 80 80 $errors[] = 'Another mailing list already uses that address.'; ··· 92 92 $form = new AphrontFormView(); 93 93 $form->setUser($request->getUser()); 94 94 if ($list->getID()) { 95 - $form->setAction('/mail/lists/edit/'.$list->getID().'/'); 95 + $form->setAction($this->getApplicationURI('/edit/'.$list->getID().'/')); 96 96 } else { 97 - $form->setAction('/mail/lists/edit/'); 97 + $form->setAction($this->getApplicationURI('/edit/')); 98 98 } 99 99 100 100 $form ··· 121 121 ->setValue($list->getURI())) 122 122 ->appendChild( 123 123 id(new AphrontFormStaticControl()) 124 - ->setLabel('ID') 125 - ->setValue(nonempty($list->getID(), '-'))) 126 - ->appendChild( 127 - id(new AphrontFormStaticControl()) 128 124 ->setLabel('PHID') 129 125 ->setValue(nonempty($list->getPHID(), '-'))) 130 126 ->appendChild( 131 127 id(new AphrontFormSubmitControl()) 132 128 ->setValue('Save') 133 - ->addCancelButton('/mail/lists/')); 129 + ->addCancelButton($this->getApplicationURI())); 134 130 135 131 $panel = new AphrontPanelView(); 136 132 if ($list->getID()) { ··· 142 138 $panel->appendChild($form); 143 139 $panel->setWidth(AphrontPanelView::WIDTH_FORM); 144 140 145 - return $this->buildStandardPageResponse( 146 - array($error_view, $panel), 141 + return $this->buildApplicationPage( 142 + array( 143 + $error_view, 144 + $panel, 145 + ), 147 146 array( 148 147 'title' => 'Edit Mailing List', 149 148 ));
+8 -11
src/applications/metamta/controller/PhabricatorMetaMTAMailingListsController.php src/applications/mailinglists/controller/PhabricatorMailingListsListController.php
··· 16 16 * limitations under the License. 17 17 */ 18 18 19 - final class PhabricatorMetaMTAMailingListsController 20 - extends PhabricatorMetaMTAController { 19 + final class PhabricatorMailingListsListController 20 + extends PhabricatorController { 21 21 22 22 public function processRequest() { 23 23 $request = $this->getRequest(); ··· 25 25 $offset = $request->getInt('offset', 0); 26 26 27 27 $pager = new AphrontPagerView(); 28 - $pager->setPageSize(1000); 28 + $pager->setPageSize(250); 29 29 $pager->setOffset($offset); 30 30 $pager->setURI($request->getRequestURI(), 'offset'); 31 31 ··· 45 45 $rows = array(); 46 46 foreach ($lists as $list) { 47 47 $rows[] = array( 48 - phutil_escape_html($list->getPHID()), 48 + phutil_escape_html($list->getName()), 49 49 phutil_escape_html($list->getEmail()), 50 - phutil_escape_html($list->getName()), 51 50 phutil_render_tag( 52 51 'a', 53 52 array( 54 53 'class' => 'button grey small', 55 - 'href' => '/mail/lists/edit/'.$list->getID().'/', 54 + 'href' => $this->getApplicationURI('/edit/'.$list->getID().'/'), 56 55 ), 57 56 'Edit'), 58 57 ); ··· 61 60 $table = new AphrontTableView($rows); 62 61 $table->setHeaders( 63 62 array( 64 - 'PHID', 63 + 'Name', 65 64 'Email', 66 - 'Name', 67 65 '', 68 66 )); 69 67 $table->setColumnClasses( 70 68 array( 71 - null, 72 69 null, 73 70 'wide', 74 71 'action', ··· 77 74 $panel = new AphrontPanelView(); 78 75 $panel->appendChild($table); 79 76 $panel->setHeader('Mailing Lists'); 80 - $panel->setCreateButton('Add New List', '/mail/lists/edit/'); 77 + $panel->setCreateButton('Add New List', $this->getApplicationURI('/edit/')); 81 78 $panel->appendChild($pager); 82 79 83 - return $this->buildStandardPageResponse( 80 + return $this->buildApplicationPage( 84 81 $panel, 85 82 array( 86 83 'title' => 'Mailing Lists',
src/applications/metamta/storage/PhabricatorMetaMTAMailingList.php src/applications/mailinglists/storage/PhabricatorMetaMTAMailingList.php
+7 -5
src/view/layout/AphrontSideNavFilterView.php
··· 137 137 } 138 138 139 139 public function render() { 140 - if (!$this->baseURI) { 141 - throw new Exception("Call setBaseURI() before render()!"); 142 - } 143 - if ($this->selectedFilter === false) { 144 - throw new Exception("Call selectFilter() before render()!"); 140 + if ($this->items) { 141 + if (!$this->baseURI) { 142 + throw new Exception("Call setBaseURI() before render()!"); 143 + } 144 + if ($this->selectedFilter === false) { 145 + throw new Exception("Call selectFilter() before render()!"); 146 + } 145 147 } 146 148 147 149 $view = new AphrontSideNavView();
+3 -1
src/view/layout/AphrontSideNavView.php
··· 73 73 $content_id = celerity_generate_unique_node_id(); 74 74 $collapse_id = null; 75 75 $expand_id = null; 76 + $local_id = null; 77 + $local_menu = null; 76 78 $main_id = celerity_generate_unique_node_id(); 77 79 78 80 $apps = $this->renderApplications(); ··· 227 229 $core = mpull($core, null, 'getPHID'); 228 230 229 231 if ($current && empty($core[$current->getPHID()])) { 230 - array_unshift($core, $this->current); 232 + array_unshift($core, $current); 231 233 } 232 234 233 235 $apps = array();