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

Formalize and fully modularize settings panel groups

Summary:
Ref T4103. Settings panels are grouped into categories of similar panels (like "Email" or "Sessions and Logs").

Currently, this is done informally, by just grouping and ordering by strings. This won't work well with translations, since it means the ordering is entirely dependent on the language order, so the first settings panel you see might be something irrelvant or confusing. We'd also potentially break third-party stuff by changing strings, but do so in a silent hard-to-detect way.

Provide formal objects and modularize the panel groups completely.

Test Plan: Verified all panels still appear properly and in the same groups and order.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T4103

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

+240 -75
+14
src/__phutil_library_map__.php
··· 3371 3371 'PhabricatorSendGridConfigOptions' => 'applications/config/option/PhabricatorSendGridConfigOptions.php', 3372 3372 'PhabricatorSessionsSettingsPanel' => 'applications/settings/panel/PhabricatorSessionsSettingsPanel.php', 3373 3373 'PhabricatorSetting' => 'applications/settings/setting/PhabricatorSetting.php', 3374 + 'PhabricatorSettingsAccountPanelGroup' => 'applications/settings/panelgroup/PhabricatorSettingsAccountPanelGroup.php', 3374 3375 'PhabricatorSettingsAddEmailAction' => 'applications/settings/action/PhabricatorSettingsAddEmailAction.php', 3375 3376 'PhabricatorSettingsAdjustController' => 'applications/settings/controller/PhabricatorSettingsAdjustController.php', 3376 3377 'PhabricatorSettingsApplication' => 'applications/settings/application/PhabricatorSettingsApplication.php', 3378 + 'PhabricatorSettingsApplicationsPanelGroup' => 'applications/settings/panelgroup/PhabricatorSettingsApplicationsPanelGroup.php', 3379 + 'PhabricatorSettingsAuthenticationPanelGroup' => 'applications/settings/panelgroup/PhabricatorSettingsAuthenticationPanelGroup.php', 3380 + 'PhabricatorSettingsDeveloperPanelGroup' => 'applications/settings/panelgroup/PhabricatorSettingsDeveloperPanelGroup.php', 3377 3381 'PhabricatorSettingsEditController' => 'applications/settings/controller/PhabricatorSettingsEditController.php', 3378 3382 'PhabricatorSettingsEditEngine' => 'applications/settings/editor/PhabricatorSettingsEditEngine.php', 3383 + 'PhabricatorSettingsEmailPanelGroup' => 'applications/settings/panelgroup/PhabricatorSettingsEmailPanelGroup.php', 3384 + 'PhabricatorSettingsLogsPanelGroup' => 'applications/settings/panelgroup/PhabricatorSettingsLogsPanelGroup.php', 3379 3385 'PhabricatorSettingsMainController' => 'applications/settings/controller/PhabricatorSettingsMainController.php', 3380 3386 'PhabricatorSettingsMainMenuBarExtension' => 'applications/settings/extension/PhabricatorSettingsMainMenuBarExtension.php', 3381 3387 'PhabricatorSettingsPanel' => 'applications/settings/panel/PhabricatorSettingsPanel.php', 3388 + 'PhabricatorSettingsPanelGroup' => 'applications/settings/panelgroup/PhabricatorSettingsPanelGroup.php', 3382 3389 'PhabricatorSettingsTimezoneController' => 'applications/settings/controller/PhabricatorSettingsTimezoneController.php', 3383 3390 'PhabricatorSetupCheck' => 'applications/config/check/PhabricatorSetupCheck.php', 3384 3391 'PhabricatorSetupCheckTestCase' => 'applications/config/check/__tests__/PhabricatorSetupCheckTestCase.php', ··· 8125 8132 'PhabricatorSendGridConfigOptions' => 'PhabricatorApplicationConfigOptions', 8126 8133 'PhabricatorSessionsSettingsPanel' => 'PhabricatorSettingsPanel', 8127 8134 'PhabricatorSetting' => 'Phobject', 8135 + 'PhabricatorSettingsAccountPanelGroup' => 'PhabricatorSettingsPanelGroup', 8128 8136 'PhabricatorSettingsAddEmailAction' => 'PhabricatorSystemAction', 8129 8137 'PhabricatorSettingsAdjustController' => 'PhabricatorController', 8130 8138 'PhabricatorSettingsApplication' => 'PhabricatorApplication', 8139 + 'PhabricatorSettingsApplicationsPanelGroup' => 'PhabricatorSettingsPanelGroup', 8140 + 'PhabricatorSettingsAuthenticationPanelGroup' => 'PhabricatorSettingsPanelGroup', 8141 + 'PhabricatorSettingsDeveloperPanelGroup' => 'PhabricatorSettingsPanelGroup', 8131 8142 'PhabricatorSettingsEditController' => 'PhabricatorController', 8132 8143 'PhabricatorSettingsEditEngine' => 'PhabricatorEditEngine', 8144 + 'PhabricatorSettingsEmailPanelGroup' => 'PhabricatorSettingsPanelGroup', 8145 + 'PhabricatorSettingsLogsPanelGroup' => 'PhabricatorSettingsPanelGroup', 8133 8146 'PhabricatorSettingsMainController' => 'PhabricatorController', 8134 8147 'PhabricatorSettingsMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension', 8135 8148 'PhabricatorSettingsPanel' => 'Phobject', 8149 + 'PhabricatorSettingsPanelGroup' => 'Phobject', 8136 8150 'PhabricatorSettingsTimezoneController' => 'PhabricatorController', 8137 8151 'PhabricatorSetupCheck' => 'Phobject', 8138 8152 'PhabricatorSetupCheckTestCase' => 'PhabricatorTestCase',
+2 -2
src/applications/conduit/settings/PhabricatorConduitTokensSettingsPanel.php
··· 15 15 return pht('Conduit API Tokens'); 16 16 } 17 17 18 - public function getPanelGroup() { 19 - return pht('Sessions and Logs'); 18 + public function getPanelGroupKey() { 19 + return PhabricatorSettingsLogsPanelGroup::PANELGROUPKEY; 20 20 } 21 21 22 22 public function isEnabled() {
+2 -2
src/applications/diffusion/panel/DiffusionSetPasswordSettingsPanel.php
··· 14 14 return pht('VCS Password'); 15 15 } 16 16 17 - public function getPanelGroup() { 18 - return pht('Authentication'); 17 + public function getPanelGroupKey() { 18 + return PhabricatorSettingsAuthenticationPanelGroup::PANELGROUPKEY; 19 19 } 20 20 21 21 public function isEnabled() {
+2 -2
src/applications/oauthserver/panel/PhabricatorOAuthServerAuthorizationsSettingsPanel.php
··· 11 11 return pht('OAuth Authorizations'); 12 12 } 13 13 14 - public function getPanelGroup() { 15 - return pht('Sessions and Logs'); 14 + public function getPanelGroupKey() { 15 + return PhabricatorSettingsLogsPanelGroup::PANELGROUPKEY; 16 16 } 17 17 18 18 public function isEnabled() {
+5 -4
src/applications/settings/controller/PhabricatorSettingsMainController.php
··· 80 80 } 81 81 82 82 private function buildPanels() { 83 - $panels = PhabricatorSettingsPanel::getAllPanels(); 83 + $panels = PhabricatorSettingsPanel::getAllDisplayPanels(); 84 84 85 85 $result = array(); 86 86 foreach ($panels as $key => $panel) { ··· 125 125 126 126 $nav->setBaseURI(new PhutilURI($this->getApplicationURI($base_uri))); 127 127 128 - $group = null; 128 + $group_key = null; 129 129 foreach ($panels as $panel) { 130 - if ($panel->getPanelGroup() != $group) { 130 + if ($panel->getPanelGroupKey() != $group_key) { 131 + $group_key = $panel->getPanelGroupKey(); 131 132 $group = $panel->getPanelGroup(); 132 - $nav->addLabel($group); 133 + $nav->addLabel($group->getPanelGroupName()); 133 134 } 134 135 135 136 $nav->addFilter($panel->getPanelKey(), $panel->getPanelName());
+2 -2
src/applications/settings/panel/PhabricatorAccountSettingsPanel.php
··· 9 9 return pht('Account'); 10 10 } 11 11 12 - public function getPanelGroup() { 13 - return pht('Account Information'); 12 + public function getPanelGroupKey() { 13 + return PhabricatorSettingsAccountPanelGroup::PANELGROUPKEY; 14 14 } 15 15 16 16 public function isEditableByAdministrators() {
+2 -6
src/applications/settings/panel/PhabricatorActivitySettingsPanel.php
··· 14 14 return pht('Activity Logs'); 15 15 } 16 16 17 - public function getPanelGroup() { 18 - return pht('Sessions and Logs'); 19 - } 20 - 21 - public function isEnabled() { 22 - return true; 17 + public function getPanelGroupKey() { 18 + return PhabricatorSettingsLogsPanelGroup::PANELGROUPKEY; 23 19 } 24 20 25 21 public function processRequest(AphrontRequest $request) {
+2 -2
src/applications/settings/panel/PhabricatorConpherencePreferencesSettingsPanel.php
··· 16 16 return pht('Conpherence Preferences'); 17 17 } 18 18 19 - public function getPanelGroup() { 20 - return pht('Application Settings'); 19 + public function getPanelGroupKey() { 20 + return PhabricatorSettingsApplicationsPanelGroup::PANELGROUPKEY; 21 21 } 22 22 23 23 public function processRequest(AphrontRequest $request) {
+2 -2
src/applications/settings/panel/PhabricatorDateTimeSettingsPanel.php
··· 9 9 return pht('Date and Time'); 10 10 } 11 11 12 - public function getPanelGroup() { 13 - return pht('Account Information'); 12 + public function getPanelGroupKey() { 13 + return PhabricatorSettingsAccountPanelGroup::PANELGROUPKEY; 14 14 } 15 15 16 16 public function isEditableByAdministrators() {
+2 -2
src/applications/settings/panel/PhabricatorDesktopNotificationsSettingsPanel.php
··· 21 21 return pht('Desktop Notifications'); 22 22 } 23 23 24 - public function getPanelGroup() { 25 - return pht('Application Settings'); 24 + public function getPanelGroupKey() { 25 + return PhabricatorSettingsApplicationsPanelGroup::PANELGROUPKEY; 26 26 } 27 27 28 28 public function processRequest(AphrontRequest $request) {
+2 -2
src/applications/settings/panel/PhabricatorDeveloperPreferencesSettingsPanel.php
··· 11 11 return pht('Developer Settings'); 12 12 } 13 13 14 - public function getPanelGroup() { 15 - return pht('Developer'); 14 + public function getPanelGroupKey() { 15 + return PhabricatorSettingsDeveloperPanelGroup::PANELGROUPKEY; 16 16 } 17 17 18 18 public function processRequest(AphrontRequest $request) {
+2 -2
src/applications/settings/panel/PhabricatorDiffPreferencesSettingsPanel.php
··· 11 11 return pht('Diff Preferences'); 12 12 } 13 13 14 - public function getPanelGroup() { 15 - return pht('Application Settings'); 14 + public function getPanelGroupKey() { 15 + return PhabricatorSettingsApplicationsPanelGroup::PANELGROUPKEY; 16 16 } 17 17 18 18 public function processRequest(AphrontRequest $request) {
+2 -2
src/applications/settings/panel/PhabricatorDisplayPreferencesSettingsPanel.php
··· 11 11 return pht('Display Preferences'); 12 12 } 13 13 14 - public function getPanelGroup() { 15 - return pht('Application Settings'); 14 + public function getPanelGroupKey() { 15 + return PhabricatorSettingsApplicationsPanelGroup::PANELGROUPKEY; 16 16 } 17 17 18 18 public function processRequest(AphrontRequest $request) {
+2 -2
src/applications/settings/panel/PhabricatorEmailAddressesSettingsPanel.php
··· 11 11 return pht('Email Addresses'); 12 12 } 13 13 14 - public function getPanelGroup() { 15 - return pht('Email'); 14 + public function getPanelGroupKey() { 15 + return PhabricatorSettingsEmailPanelGroup::PANELGROUPKEY; 16 16 } 17 17 18 18 public function isEditableByAdministrators() {
+2 -2
src/applications/settings/panel/PhabricatorEmailFormatSettingsPanel.php
··· 11 11 return pht('Email Format'); 12 12 } 13 13 14 - public function getPanelGroup() { 15 - return pht('Email'); 14 + public function getPanelGroupKey() { 15 + return PhabricatorSettingsEmailPanelGroup::PANELGROUPKEY; 16 16 } 17 17 18 18 public function isEditableByAdministrators() {
+2 -2
src/applications/settings/panel/PhabricatorEmailPreferencesSettingsPanel.php
··· 11 11 return pht('Email Preferences'); 12 12 } 13 13 14 - public function getPanelGroup() { 15 - return pht('Email'); 14 + public function getPanelGroupKey() { 15 + return PhabricatorSettingsEmailPanelGroup::PANELGROUPKEY; 16 16 } 17 17 18 18 public function isEditableByAdministrators() {
+2 -6
src/applications/settings/panel/PhabricatorExternalAccountsSettingsPanel.php
··· 11 11 return pht('External Accounts'); 12 12 } 13 13 14 - public function getPanelGroup() { 15 - return pht('Authentication'); 16 - } 17 - 18 - public function isEnabled() { 19 - return true; 14 + public function getPanelGroupKey() { 15 + return PhabricatorSettingsAuthenticationPanelGroup::PANELGROUPKEY; 20 16 } 21 17 22 18 public function processRequest(AphrontRequest $request) {
+2 -2
src/applications/settings/panel/PhabricatorHomePreferencesSettingsPanel.php
··· 11 11 return pht('Home Page'); 12 12 } 13 13 14 - public function getPanelGroup() { 15 - return pht('Application Settings'); 14 + public function getPanelGroupKey() { 15 + return PhabricatorSettingsApplicationsPanelGroup::PANELGROUPKEY; 16 16 } 17 17 18 18 public function processRequest(AphrontRequest $request) {
+2 -2
src/applications/settings/panel/PhabricatorMultiFactorSettingsPanel.php
··· 11 11 return pht('Multi-Factor Auth'); 12 12 } 13 13 14 - public function getPanelGroup() { 15 - return pht('Authentication'); 14 + public function getPanelGroupKey() { 15 + return PhabricatorSettingsAuthenticationPanelGroup::PANELGROUPKEY; 16 16 } 17 17 18 18 public function processRequest(AphrontRequest $request) {
+2 -2
src/applications/settings/panel/PhabricatorPasswordSettingsPanel.php
··· 10 10 return pht('Password'); 11 11 } 12 12 13 - public function getPanelGroup() { 14 - return pht('Authentication'); 13 + public function getPanelGroupKey() { 14 + return PhabricatorSettingsAuthenticationPanelGroup::PANELGROUPKEY; 15 15 } 16 16 17 17 public function isEnabled() {
+2 -2
src/applications/settings/panel/PhabricatorSSHKeysSettingsPanel.php
··· 14 14 return pht('SSH Public Keys'); 15 15 } 16 16 17 - public function getPanelGroup() { 18 - return pht('Authentication'); 17 + public function getPanelGroupKey() { 18 + return PhabricatorSettingsAuthenticationPanelGroup::PANELGROUPKEY; 19 19 } 20 20 21 21 public function isEnabled() {
+2 -2
src/applications/settings/panel/PhabricatorSessionsSettingsPanel.php
··· 10 10 return pht('Sessions'); 11 11 } 12 12 13 - public function getPanelGroup() { 14 - return pht('Sessions and Logs'); 13 + public function getPanelGroupKey() { 14 + return PhabricatorSettingsLogsPanelGroup::PANELGROUPKEY; 15 15 } 16 16 17 17 public function isEnabled() {
+35 -17
src/applications/settings/panel/PhabricatorSettingsPanel.php
··· 7 7 * submits the form. By extending this class, you can add new settings 8 8 * panels. 9 9 * 10 - * NOTE: This stuff is new and might not be completely stable. 11 - * 12 10 * @task config Panel Configuration 13 11 * @task panel Panel Implementation 14 12 * @task internal Internals ··· 63 61 } 64 62 65 63 final public static function getAllPanels() { 66 - return id(new PhutilClassMapQuery()) 64 + $panels = id(new PhutilClassMapQuery()) 67 65 ->setAncestorClass(__CLASS__) 68 66 ->setUniqueMethod('getPanelKey') 69 - ->setSortMethod('getPanelSortKey') 70 67 ->execute(); 68 + return msortv($panels, 'getPanelOrderVector'); 69 + } 70 + 71 + final public static function getAllDisplayPanels() { 72 + $panels = array(); 73 + $groups = PhabricatorSettingsPanelGroup::getAllPanelGroupsWithPanels(); 74 + foreach ($groups as $group) { 75 + foreach ($group->getPanels() as $key => $panel) { 76 + $panels[$key] = $panel; 77 + } 78 + } 79 + 80 + return $panels; 81 + } 82 + 83 + final public function getPanelGroup() { 84 + $group_key = $this->getPanelGroupKey(); 85 + 86 + $groups = PhabricatorSettingsPanelGroup::getAllPanelGroupsWithPanels(); 87 + $group = idx($groups, $group_key); 88 + if (!$group) { 89 + throw new Exception( 90 + pht( 91 + 'No settings panel group with key "%s" exists!', 92 + $group_key)); 93 + } 94 + 95 + return $group; 71 96 } 72 97 73 98 ··· 97 122 98 123 99 124 /** 100 - * Return a human-readable group name for this panel. For instance, if you 101 - * had several related panels like "Volume Settings" and 102 - * "Microphone Settings", you might put them in a group called "Audio". 125 + * Return a panel group key constant for this panel. 103 126 * 104 - * When displayed, panels are grouped with other panels that have the same 105 - * group name. 106 - * 107 - * @return string Human-readable panel group name. 127 + * @return const Panel group key. 108 128 * @task config 109 129 */ 110 - abstract public function getPanelGroup(); 130 + abstract public function getPanelGroupKey(); 111 131 112 132 113 133 /** ··· 192 212 * @return string Sortable key. 193 213 * @task internal 194 214 */ 195 - final public function getPanelSortKey() { 196 - return sprintf( 197 - '%s'.chr(255).'%s', 198 - $this->getPanelGroup(), 199 - $this->getPanelName()); 215 + final public function getPanelOrderVector() { 216 + return id(new PhutilSortVector()) 217 + ->addString($this->getPanelName()); 200 218 } 201 219 202 220 }
+2 -6
src/applications/settings/panel/PhabricatorTokensSettingsPanel.php
··· 10 10 return pht('Temporary Tokens'); 11 11 } 12 12 13 - public function getPanelGroup() { 14 - return pht('Sessions and Logs'); 15 - } 16 - 17 - public function isEnabled() { 18 - return true; 13 + public function getPanelGroupKey() { 14 + return PhabricatorSettingsLogsPanelGroup::PANELGROUPKEY; 19 15 } 20 16 21 17 public function processRequest(AphrontRequest $request) {
+16
src/applications/settings/panelgroup/PhabricatorSettingsAccountPanelGroup.php
··· 1 + <?php 2 + 3 + final class PhabricatorSettingsAccountPanelGroup 4 + extends PhabricatorSettingsPanelGroup { 5 + 6 + const PANELGROUPKEY = 'account'; 7 + 8 + public function getPanelGroupName() { 9 + return pht('Account'); 10 + } 11 + 12 + protected function getPanelGroupOrder() { 13 + return 100; 14 + } 15 + 16 + }
+16
src/applications/settings/panelgroup/PhabricatorSettingsApplicationsPanelGroup.php
··· 1 + <?php 2 + 3 + final class PhabricatorSettingsApplicationsPanelGroup 4 + extends PhabricatorSettingsPanelGroup { 5 + 6 + const PANELGROUPKEY = 'applications'; 7 + 8 + public function getPanelGroupName() { 9 + return pht('Applications'); 10 + } 11 + 12 + protected function getPanelGroupOrder() { 13 + return 200; 14 + } 15 + 16 + }
+16
src/applications/settings/panelgroup/PhabricatorSettingsAuthenticationPanelGroup.php
··· 1 + <?php 2 + 3 + final class PhabricatorSettingsAuthenticationPanelGroup 4 + extends PhabricatorSettingsPanelGroup { 5 + 6 + const PANELGROUPKEY = 'authentication'; 7 + 8 + public function getPanelGroupName() { 9 + return pht('Authentication'); 10 + } 11 + 12 + protected function getPanelGroupOrder() { 13 + return 300; 14 + } 15 + 16 + }
+16
src/applications/settings/panelgroup/PhabricatorSettingsDeveloperPanelGroup.php
··· 1 + <?php 2 + 3 + final class PhabricatorSettingsDeveloperPanelGroup 4 + extends PhabricatorSettingsPanelGroup { 5 + 6 + const PANELGROUPKEY = 'developer'; 7 + 8 + public function getPanelGroupName() { 9 + return pht('Developer'); 10 + } 11 + 12 + protected function getPanelGroupOrder() { 13 + return 400; 14 + } 15 + 16 + }
+16
src/applications/settings/panelgroup/PhabricatorSettingsEmailPanelGroup.php
··· 1 + <?php 2 + 3 + final class PhabricatorSettingsEmailPanelGroup 4 + extends PhabricatorSettingsPanelGroup { 5 + 6 + const PANELGROUPKEY = 'email'; 7 + 8 + public function getPanelGroupName() { 9 + return pht('Email'); 10 + } 11 + 12 + protected function getPanelGroupOrder() { 13 + return 500; 14 + } 15 + 16 + }
+16
src/applications/settings/panelgroup/PhabricatorSettingsLogsPanelGroup.php
··· 1 + <?php 2 + 3 + final class PhabricatorSettingsLogsPanelGroup 4 + extends PhabricatorSettingsPanelGroup { 5 + 6 + const PANELGROUPKEY = 'logs'; 7 + 8 + public function getPanelGroupName() { 9 + return pht('Sessions and Logs'); 10 + } 11 + 12 + protected function getPanelGroupOrder() { 13 + return 600; 14 + } 15 + 16 + }
+48
src/applications/settings/panelgroup/PhabricatorSettingsPanelGroup.php
··· 1 + <?php 2 + 3 + abstract class PhabricatorSettingsPanelGroup extends Phobject { 4 + 5 + private $panels; 6 + 7 + abstract public function getPanelGroupName(); 8 + 9 + protected function getPanelGroupOrder() { 10 + return 1000; 11 + } 12 + 13 + final public function getPanelGroupOrderVector() { 14 + return id(new PhutilSortVector()) 15 + ->addInt($this->getPanelGroupOrder()) 16 + ->addString($this->getPanelGroupName()); 17 + } 18 + 19 + final public function getPanelGroupKey() { 20 + return $this->getPhobjectClassConstant('PANELGROUPKEY'); 21 + } 22 + 23 + final public static function getAllPanelGroups() { 24 + $groups = id(new PhutilClassMapQuery()) 25 + ->setAncestorClass(__CLASS__) 26 + ->setUniqueMethod('getPanelGroupKey') 27 + ->execute(); 28 + 29 + return msortv($groups, 'getPanelGroupOrderVector'); 30 + } 31 + 32 + final public static function getAllPanelGroupsWithPanels() { 33 + $groups = self::getAllPanelGroups(); 34 + 35 + $panels = PhabricatorSettingsPanel::getAllPanels(); 36 + $panels = mgroup($panels, 'getPanelGroupKey'); 37 + foreach ($groups as $key => $group) { 38 + $group->panels = idx($panels, $key, array()); 39 + } 40 + 41 + return $groups; 42 + } 43 + 44 + public function getPanels() { 45 + return $this->panels; 46 + } 47 + 48 + }