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

Config re-design

Summary:
This is a full UI pass at a cleaner "Config" application. The main idea is to simplify the UI, center it, and have a different feel than other UI, a sort of "manage" UI theme for objects with loads of settings. Also adds a new minimalistic "WHITE_CONFIG" box type which may get re-used in Diffusion settings. This is a 90% pass, I'll have a few follow up diffs. Specifically:

- Build breadcrumbs as a flexible UI to go into headers.
- One click ObjectItemView option, for hover states.
- Sidenav doesn't always select (AphrontFilter issue)
- Mobile touchups, though it's pretty reasonable.

Test Plan:
Click through every page here, edit options, see new navigation UI. Test a few various setup issue layouts including fatals.

{F5163228}

{F5163229}

{F5163230}

{F5163231}

{F5163232}

{F5163233}

{F5163234}

Reviewers: epriestley

Reviewed By: epriestley

Spies: Korvin, epriestley

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

+427 -506
+12 -14
resources/celerity/map.php
··· 9 9 'names' => array( 10 10 'conpherence.pkg.css' => 'e68cf1fa', 11 11 'conpherence.pkg.js' => 'b5b51108', 12 - 'core.pkg.css' => '1071e7a2', 12 + 'core.pkg.css' => '042e1782', 13 13 'core.pkg.js' => '6c085267', 14 14 'darkconsole.pkg.js' => '1f9a31bc', 15 15 'differential.pkg.css' => '45951e9e', ··· 45 45 'rsrc/css/application/base/standard-page-view.css' => '34ee718b', 46 46 'rsrc/css/application/chatlog/chatlog.css' => 'd295b020', 47 47 'rsrc/css/application/conduit/conduit-api.css' => '7bc725c4', 48 - 'rsrc/css/application/config/config-options.css' => 'd55ed093', 49 - 'rsrc/css/application/config/config-page.css' => 'c1d5121b', 48 + 'rsrc/css/application/config/config-options.css' => '4615667b', 50 49 'rsrc/css/application/config/config-template.css' => '8f18fa41', 51 50 'rsrc/css/application/config/setup-issue.css' => '7dae7f18', 52 51 'rsrc/css/application/config/unhandled-exception.css' => '4c96257a', ··· 132 131 'rsrc/css/phui/calendar/phui-calendar-list.css' => '576be600', 133 132 'rsrc/css/phui/calendar/phui-calendar-month.css' => '21154caf', 134 133 'rsrc/css/phui/calendar/phui-calendar.css' => 'f1ddf11c', 135 - 'rsrc/css/phui/object-item/phui-oi-big-ui.css' => '19f9369b', 134 + 'rsrc/css/phui/object-item/phui-oi-big-ui.css' => '628f59de', 136 135 'rsrc/css/phui/object-item/phui-oi-color.css' => 'cd2b9b77', 137 136 'rsrc/css/phui/object-item/phui-oi-drag-ui.css' => '08f4ccc3', 138 137 'rsrc/css/phui/object-item/phui-oi-flush-ui.css' => '9d9685d6', ··· 143 142 'rsrc/css/phui/phui-badge.css' => '22c0cf4f', 144 143 'rsrc/css/phui/phui-basic-nav-view.css' => '98c11ab3', 145 144 'rsrc/css/phui/phui-big-info-view.css' => 'acc3492c', 146 - 'rsrc/css/phui/phui-box.css' => '745e881d', 145 + 'rsrc/css/phui/phui-box.css' => '4165eb0d', 147 146 'rsrc/css/phui/phui-chart.css' => '6bf6f78e', 148 147 'rsrc/css/phui/phui-cms.css' => '504b4b23', 149 148 'rsrc/css/phui/phui-comment-form.css' => 'ac68149f', ··· 158 157 'rsrc/css/phui/phui-form-view.css' => 'ae9f8d16', 159 158 'rsrc/css/phui/phui-form.css' => '7aaa04e3', 160 159 'rsrc/css/phui/phui-head-thing.css' => 'fd311e5f', 161 - 'rsrc/css/phui/phui-header-view.css' => '859c5150', 160 + 'rsrc/css/phui/phui-header-view.css' => '3c722648', 162 161 'rsrc/css/phui/phui-hovercard.css' => 'f0592bcf', 163 162 'rsrc/css/phui/phui-icon-set-selector.css' => '87db8fee', 164 163 'rsrc/css/phui/phui-icon.css' => '5c4a5de6', ··· 551 550 'auth-css' => '0877ed6e', 552 551 'bulk-job-css' => 'df9c1d4a', 553 552 'conduit-api-css' => '7bc725c4', 554 - 'config-options-css' => 'd55ed093', 555 - 'config-page-css' => 'c1d5121b', 553 + 'config-options-css' => '4615667b', 556 554 'conpherence-color-css' => 'abb4c358', 557 555 'conpherence-durable-column-view' => '89ea6bef', 558 556 'conpherence-header-pane-css' => 'cb6f4e19', ··· 822 820 'phui-badge-view-css' => '22c0cf4f', 823 821 'phui-basic-nav-view-css' => '98c11ab3', 824 822 'phui-big-info-view-css' => 'acc3492c', 825 - 'phui-box-css' => '745e881d', 823 + 'phui-box-css' => '4165eb0d', 826 824 'phui-button-bar-css' => 'f1ff5494', 827 825 'phui-button-css' => '1863cc6e', 828 826 'phui-button-simple-css' => '8e1baf68', ··· 845 843 'phui-form-css' => '7aaa04e3', 846 844 'phui-form-view-css' => 'ae9f8d16', 847 845 'phui-head-thing-view-css' => 'fd311e5f', 848 - 'phui-header-view-css' => '859c5150', 846 + 'phui-header-view-css' => '3c722648', 849 847 'phui-hovercard' => '1bd28176', 850 848 'phui-hovercard-view-css' => 'f0592bcf', 851 849 'phui-icon-set-selector-css' => '87db8fee', ··· 858 856 'phui-lightbox-css' => '0a035e40', 859 857 'phui-list-view-css' => '38f8c9bd', 860 858 'phui-object-box-css' => '9cff003c', 861 - 'phui-oi-big-ui-css' => '19f9369b', 859 + 'phui-oi-big-ui-css' => '628f59de', 862 860 'phui-oi-color-css' => 'cd2b9b77', 863 861 'phui-oi-drag-ui-css' => '08f4ccc3', 864 862 'phui-oi-flush-ui-css' => '9d9685d6', ··· 997 995 '185bbd53' => array( 998 996 'javelin-install', 999 997 ), 1000 - '19f9369b' => array( 1001 - 'phui-oi-list-view-css', 1002 - ), 1003 998 '1ad0a787' => array( 1004 999 'javelin-install', 1005 1000 'javelin-reactor', ··· 1365 1360 '61cbc29a' => array( 1366 1361 'javelin-magical-init', 1367 1362 'javelin-util', 1363 + ), 1364 + '628f59de' => array( 1365 + 'phui-oi-list-view-css', 1368 1366 ), 1369 1367 '62dfea03' => array( 1370 1368 'javelin-install',
-2
src/__phutil_library_map__.php
··· 2445 2445 'PhabricatorConfigOption' => 'applications/config/option/PhabricatorConfigOption.php', 2446 2446 'PhabricatorConfigOptionType' => 'applications/config/custom/PhabricatorConfigOptionType.php', 2447 2447 'PhabricatorConfigPHIDModule' => 'applications/config/module/PhabricatorConfigPHIDModule.php', 2448 - 'PhabricatorConfigPageView' => 'applications/config/view/PhabricatorConfigPageView.php', 2449 2448 'PhabricatorConfigProxySource' => 'infrastructure/env/PhabricatorConfigProxySource.php', 2450 2449 'PhabricatorConfigPurgeCacheController' => 'applications/config/controller/PhabricatorConfigPurgeCacheController.php', 2451 2450 'PhabricatorConfigRegexOptionType' => 'applications/config/custom/PhabricatorConfigRegexOptionType.php', ··· 7734 7733 ), 7735 7734 'PhabricatorConfigOptionType' => 'Phobject', 7736 7735 'PhabricatorConfigPHIDModule' => 'PhabricatorConfigModule', 7737 - 'PhabricatorConfigPageView' => 'AphrontTagView', 7738 7736 'PhabricatorConfigProxySource' => 'PhabricatorConfigSource', 7739 7737 'PhabricatorConfigPurgeCacheController' => 'PhabricatorConfigController', 7740 7738 'PhabricatorConfigRegexOptionType' => 'PhabricatorConfigJSONOptionType',
+11 -2
src/applications/config/constants/PhabricatorConfigGroupConstants.php
··· 28 28 public static function getGroupURI($group) { 29 29 $map = array( 30 30 self::GROUP_CORE => '/', 31 - self::GROUP_APPLICATION => pht('application/'), 32 - self::GROUP_DEVELOPER => pht('developer/'), 31 + self::GROUP_APPLICATION => 'application/', 32 + self::GROUP_DEVELOPER => 'developer/', 33 + ); 34 + return idx($map, $group, '#'); 35 + } 36 + 37 + public static function getGroupFullURI($group) { 38 + $map = array( 39 + self::GROUP_CORE => '/config/', 40 + self::GROUP_APPLICATION => '/config/application/', 41 + self::GROUP_DEVELOPER => '/config/developer/', 33 42 ); 34 43 return idx($map, $group, '#'); 35 44 }
+14 -14
src/applications/config/controller/PhabricatorConfigAllController.php
··· 49 49 )); 50 50 51 51 $title = pht('Current Settings'); 52 - 53 - $crumbs = $this 54 - ->buildApplicationCrumbs() 55 - ->addTextCrumb($title) 56 - ->setBorder(true); 57 - 58 - $header = id(new PHUIHeaderView()) 59 - ->setHeader($title) 60 - ->setProfileHeader(true); 52 + $header = $this->buildHeaderView($title); 61 53 62 54 $nav = $this->buildSideNavView(); 63 55 $nav->selectFilter('all/'); 64 56 65 - $content = id(new PhabricatorConfigPageView()) 57 + $view = $this->buildConfigBoxView( 58 + pht('All Settings'), 59 + $table); 60 + 61 + $crumbs = $this->buildApplicationCrumbs() 62 + ->addTextCrumb($title) 63 + ->setBorder(true); 64 + 65 + $content = id(new PHUITwoColumnView()) 66 66 ->setHeader($header) 67 - ->setContent($table); 67 + ->setNavigation($nav) 68 + ->setFixed(true) 69 + ->setMainColumn($view); 68 70 69 71 return $this->newPage() 70 72 ->setTitle($title) 71 73 ->setCrumbs($crumbs) 72 - ->setNavigation($nav) 73 - ->appendChild($content) 74 - ->addClass('white-background'); 74 + ->appendChild($content); 75 75 76 76 } 77 77
+10 -13
src/applications/config/controller/PhabricatorConfigApplicationController.php
··· 11 11 12 12 $groups = PhabricatorApplicationConfigOptions::loadAll(); 13 13 $apps_list = $this->buildConfigOptionsList($groups, 'apps'); 14 + $apps_list = $this->buildConfigBoxView(pht('Applications'), $apps_list); 14 15 15 16 $title = pht('Application Settings'); 17 + $header = $this->buildHeaderView($title); 16 18 17 - $header = id(new PHUIHeaderView()) 18 - ->setHeader($title) 19 - ->setProfileHeader(true); 19 + $content = id(new PHUITwoColumnView()) 20 + ->setHeader($header) 21 + ->setNavigation($nav) 22 + ->setFixed(true) 23 + ->setMainColumn($apps_list); 20 24 21 - $crumbs = $this 22 - ->buildApplicationCrumbs() 23 - ->addTextCrumb(pht('Applications')) 25 + $crumbs = $this->buildApplicationCrumbs() 26 + ->addTextCrumb($title) 24 27 ->setBorder(true); 25 28 26 - $content = id(new PhabricatorConfigPageView()) 27 - ->setHeader($header) 28 - ->setContent($apps_list); 29 - 30 29 return $this->newPage() 31 30 ->setTitle($title) 32 31 ->setCrumbs($crumbs) 33 - ->setNavigation($nav) 34 - ->appendChild($content) 35 - ->addClass('white-background'); 32 + ->appendChild($content); 36 33 } 37 34 38 35 private function buildConfigOptionsList(array $groups, $type) {
+21 -37
src/applications/config/controller/PhabricatorConfigCacheController.php
··· 9 9 $nav = $this->buildSideNavView(); 10 10 $nav->selectFilter('cache/'); 11 11 12 + $purge_button = id(new PHUIButtonView()) 13 + ->setText(pht('Purge Caches')) 14 + ->setHref('/config/cache/purge/') 15 + ->setTag('a') 16 + ->setWorkflow(true) 17 + ->setIcon('fa-exclamation-triangle'); 18 + 12 19 $title = pht('Cache Status'); 13 - 14 - $header = id(new PHUIHeaderView()) 15 - ->setHeader($title) 16 - ->setProfileHeader(true); 17 - 18 - $crumbs = $this 19 - ->buildApplicationCrumbs() 20 - ->addTextCrumb(pht('Cache Status')) 21 - ->setBorder(true); 20 + $header = $this->buildHeaderView($title, $purge_button); 22 21 23 22 $code_box = $this->renderCodeBox(); 24 23 $data_box = $this->renderDataBox(); ··· 28 27 $data_box, 29 28 ); 30 29 31 - $content = id(new PhabricatorConfigPageView()) 30 + $crumbs = $this->buildApplicationCrumbs() 31 + ->addTextCrumb($title) 32 + ->setBorder(true); 33 + 34 + $content = id(new PHUITwoColumnView()) 32 35 ->setHeader($header) 33 - ->setContent($page); 36 + ->setNavigation($nav) 37 + ->setFixed(true) 38 + ->setMainColumn($page); 34 39 35 40 return $this->newPage() 36 41 ->setTitle($title) 37 42 ->setCrumbs($crumbs) 38 - ->setNavigation($nav) 39 - ->appendChild($content) 40 - ->addClass('white-background'); 43 + ->appendChild($content); 41 44 } 42 45 43 46 private function renderCodeBox() { 44 47 $cache = PhabricatorOpcodeCacheSpec::getActiveCacheSpec(); 45 - 46 48 $properties = id(new PHUIPropertyListView()); 47 - 48 49 $this->renderCommonProperties($properties, $cache); 49 - 50 - $purge_button = id(new PHUIButtonView()) 51 - ->setText(pht('Purge Caches')) 52 - ->setHref('/config/cache/purge/') 53 - ->setTag('a') 54 - ->setWorkflow(true) 55 - ->setIcon('fa-exclamation-triangle'); 56 - 57 - $header = id(new PHUIHeaderView()) 58 - ->setHeader(pht('Opcode Cache')) 59 - ->addActionLink($purge_button); 60 - 61 - return id(new PHUIObjectBoxView()) 62 - ->setHeader($header) 63 - ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 64 - ->addPropertyList($properties); 50 + return $this->buildConfigBoxView(pht('Opcode Cache'), $properties); 65 51 } 66 52 67 53 private function renderDataBox() { ··· 109 95 )); 110 96 } 111 97 112 - return id(new PHUIObjectBoxView()) 113 - ->setHeaderText(pht('Data Cache')) 114 - ->addPropertyList($properties) 115 - ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 116 - ->setTable($table); 98 + $properties = $this->buildConfigBoxView(pht('Data Cache'), $properties); 99 + $table = $this->buildConfigBoxView(pht('Cache Storage'), $table); 100 + return array($properties, $table); 117 101 } 118 102 119 103 private function renderCommonProperties(
+15 -18
src/applications/config/controller/PhabricatorConfigClusterDatabasesController.php
··· 9 9 10 10 $title = pht('Cluster Database Status'); 11 11 $doc_href = PhabricatorEnv::getDoclink('Cluster: Databases'); 12 + $button = id(new PHUIButtonView()) 13 + ->setIcon('fa-book') 14 + ->setHref($doc_href) 15 + ->setTag('a') 16 + ->setText(pht('Documentation')); 12 17 13 - $header = id(new PHUIHeaderView()) 14 - ->setHeader($title) 15 - ->setProfileHeader(true) 16 - ->addActionLink( 17 - id(new PHUIButtonView()) 18 - ->setIcon('fa-book') 19 - ->setHref($doc_href) 20 - ->setTag('a') 21 - ->setText(pht('Documentation'))); 18 + $header = $this->buildHeaderView($title, $button); 19 + 20 + $database_status = $this->buildClusterDatabaseStatus(); 21 + $status = $this->buildConfigBoxView(pht('Status'), $database_status); 22 22 23 - $crumbs = $this 24 - ->buildApplicationCrumbs() 23 + $crumbs = $this->buildApplicationCrumbs() 25 24 ->addTextCrumb($title) 26 25 ->setBorder(true); 27 26 28 - $database_status = $this->buildClusterDatabaseStatus(); 29 - 30 - $content = id(new PhabricatorConfigPageView()) 27 + $content = id(new PHUITwoColumnView()) 31 28 ->setHeader($header) 32 - ->setContent($database_status); 29 + ->setNavigation($nav) 30 + ->setFixed(true) 31 + ->setMainColumn($status); 33 32 34 33 return $this->newPage() 35 34 ->setTitle($title) 36 35 ->setCrumbs($crumbs) 37 - ->setNavigation($nav) 38 - ->appendChild($content) 39 - ->addClass('white-background'); 36 + ->appendChild($content); 40 37 } 41 38 42 39 private function buildClusterDatabaseStatus() {
+17 -18
src/applications/config/controller/PhabricatorConfigClusterNotificationsController.php
··· 9 9 10 10 $title = pht('Cluster Notifications'); 11 11 $doc_href = PhabricatorEnv::getDoclink('Cluster: Notifications'); 12 + $button = id(new PHUIButtonView()) 13 + ->setIcon('fa-book') 14 + ->setHref($doc_href) 15 + ->setTag('a') 16 + ->setText(pht('Documentation')); 12 17 13 - $header = id(new PHUIHeaderView()) 14 - ->setHeader($title) 15 - ->setProfileHeader(true) 16 - ->addActionLink( 17 - id(new PHUIButtonView()) 18 - ->setIcon('fa-book') 19 - ->setHref($doc_href) 20 - ->setTag('a') 21 - ->setText(pht('Documentation'))); 18 + $header = $this->buildHeaderView($title, $button); 19 + 20 + $notification_status = $this->buildClusterNotificationStatus(); 21 + $status = $this->buildConfigBoxView( 22 + pht('Notifications Status'), 23 + $notification_status); 22 24 23 - $crumbs = $this 24 - ->buildApplicationCrumbs() 25 + $crumbs = $this->buildApplicationCrumbs() 25 26 ->addTextCrumb($title) 26 27 ->setBorder(true); 27 28 28 - $notification_status = $this->buildClusterNotificationStatus(); 29 - 30 - $content = id(new PhabricatorConfigPageView()) 29 + $content = id(new PHUITwoColumnView()) 31 30 ->setHeader($header) 32 - ->setContent($notification_status); 31 + ->setNavigation($nav) 32 + ->setFixed(true) 33 + ->setMainColumn($status); 33 34 34 35 return $this->newPage() 35 36 ->setTitle($title) 36 37 ->setCrumbs($crumbs) 37 - ->setNavigation($nav) 38 - ->appendChild($content) 39 - ->addClass('white-background'); 38 + ->appendChild($content); 40 39 } 41 40 42 41 private function buildClusterNotificationStatus() {
+23 -23
src/applications/config/controller/PhabricatorConfigClusterRepositoriesController.php
··· 10 10 $title = pht('Cluster Repository Status'); 11 11 12 12 $doc_href = PhabricatorEnv::getDoclink('Cluster: Repositories'); 13 + $button = id(new PHUIButtonView()) 14 + ->setIcon('fa-book') 15 + ->setHref($doc_href) 16 + ->setTag('a') 17 + ->setText(pht('Documentation')); 13 18 14 - $header = id(new PHUIHeaderView()) 15 - ->setHeader($title) 16 - ->setProfileHeader(true) 17 - ->addActionLink( 18 - id(new PHUIButtonView()) 19 - ->setIcon('fa-book') 20 - ->setHref($doc_href) 21 - ->setTag('a') 22 - ->setText(pht('Documentation'))); 19 + $header = $this->buildHeaderView($title, $button); 23 20 24 - $crumbs = $this 25 - ->buildApplicationCrumbs() 26 - ->addTextCrumb(pht('Repository Servers')) 27 - ->setBorder(true); 21 + $repository_status = $this->buildClusterRepositoryStatus(); 22 + $repo_status = $this->buildConfigBoxView( 23 + pht('Repository Status'), $repository_status); 28 24 29 - $repository_status = $this->buildClusterRepositoryStatus(); 30 25 $repository_errors = $this->buildClusterRepositoryErrors(); 26 + $repo_errors = $this->buildConfigBoxView( 27 + pht('Repository Errors'), $repository_errors); 31 28 32 - $content = id(new PhabricatorConfigPageView()) 29 + $crumbs = $this->buildApplicationCrumbs() 30 + ->addTextCrumb($title) 31 + ->setBorder(true); 32 + 33 + $content = id(new PHUITwoColumnView()) 33 34 ->setHeader($header) 34 - ->setContent( 35 - array( 36 - $repository_status, 37 - $repository_errors, 38 - )); 35 + ->setNavigation($nav) 36 + ->setFixed(true) 37 + ->setMainColumn(array( 38 + $repo_status, 39 + $repo_errors, 40 + )); 39 41 40 42 return $this->newPage() 41 43 ->setTitle($title) 42 44 ->setCrumbs($crumbs) 43 - ->setNavigation($nav) 44 - ->appendChild($content) 45 - ->addClass('white-background'); 45 + ->appendChild($content); 46 46 } 47 47 48 48 private function buildClusterRepositoryStatus() {
+23 -25
src/applications/config/controller/PhabricatorConfigClusterSearchController.php
··· 10 10 $title = pht('Cluster Search'); 11 11 $doc_href = PhabricatorEnv::getDoclink('Cluster: Search'); 12 12 13 - $header = id(new PHUIHeaderView()) 14 - ->setHeader($title) 15 - ->setProfileHeader(true) 16 - ->addActionLink( 17 - id(new PHUIButtonView()) 18 - ->setIcon('fa-book') 19 - ->setHref($doc_href) 20 - ->setTag('a') 21 - ->setText(pht('Documentation'))); 13 + $button = id(new PHUIButtonView()) 14 + ->setIcon('fa-book') 15 + ->setHref($doc_href) 16 + ->setTag('a') 17 + ->setText(pht('Documentation')); 18 + 19 + $header = $this->buildHeaderView($title, $button); 20 + 21 + $search_status = $this->buildClusterSearchStatus(); 22 22 23 - $crumbs = $this 24 - ->buildApplicationCrumbs($nav) 23 + $crumbs = $this->buildApplicationCrumbs() 25 24 ->addTextCrumb($title) 26 25 ->setBorder(true); 27 26 28 - $search_status = $this->buildClusterSearchStatus(); 29 - 30 - $content = id(new PhabricatorConfigPageView()) 27 + $content = id(new PHUITwoColumnView()) 31 28 ->setHeader($header) 32 - ->setContent($search_status); 29 + ->setNavigation($nav) 30 + ->setFixed(true) 31 + ->setMainColumn($search_status); 33 32 34 33 return $this->newPage() 35 34 ->setTitle($title) 36 35 ->setCrumbs($crumbs) 37 - ->setNavigation($nav) 38 - ->appendChild($content) 39 - ->addClass('white-background'); 36 + ->appendChild($content); 40 37 } 41 38 42 39 private function buildClusterSearchStatus() { ··· 105 102 ->setNoDataString(pht('No search servers are configured.')) 106 103 ->setHeaders($head); 107 104 108 - $view = id(new PHUIObjectBoxView()) 109 - ->setHeaderText($service->getDisplayName()) 110 - ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 111 - ->setTable($table); 105 + $view = $this->buildConfigBoxView(pht('Search Servers'), $table); 112 106 113 - if ($stats_view) { 114 - $view->addPropertyList($stats_view); 107 + $stats = null; 108 + if ($stats_view->hasAnyProperties()) { 109 + $stats = $this->buildConfigBoxView( 110 + pht('%s Stats', $service->getDisplayName()), 111 + $stats_view); 115 112 } 116 - return $view; 113 + 114 + return array($stats, $view); 117 115 } 118 116 119 117 private function renderIndexStats($stats) {
+34 -2
src/applications/config/controller/PhabricatorConfigController.php
··· 8 8 9 9 public function buildSideNavView($filter = null, $for_app = false) { 10 10 11 + 11 12 $guide_href = new PhutilURI('/guides/'); 12 13 $nav = new AphrontSideNavFilterView(); 13 14 $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); 14 - $nav->addLabel(pht('Configuration')); 15 15 $nav->addFilter('/', 16 16 pht('Core Settings'), null, 'fa-gear'); 17 17 $nav->addFilter('application/', ··· 46 46 pht('Search Servers'), null, 'fa-search'); 47 47 $nav->addLabel(pht('Modules')); 48 48 49 - 50 49 $modules = PhabricatorConfigModule::getAllModules(); 51 50 foreach ($modules as $key => $module) { 52 51 $nav->addFilter('module/'.$key.'/', ··· 58 57 59 58 public function buildApplicationMenu() { 60 59 return $this->buildSideNavView(null, true)->getMenu(); 60 + } 61 + 62 + public function buildHeaderView($text, $action = null) { 63 + $viewer = $this->getViewer(); 64 + 65 + $file = PhabricatorFile::loadBuiltin($viewer, 'projects/v3/manage.png'); 66 + $image = $file->getBestURI($file); 67 + $header = id(new PHUIHeaderView()) 68 + ->setHeader($text) 69 + ->setProfileHeader(true) 70 + ->setImage($image); 71 + 72 + if ($action) { 73 + $header->addActionLink($action); 74 + } 75 + 76 + return $header; 77 + } 78 + 79 + public function buildConfigBoxView($title, $content, $action = null) { 80 + $header = id(new PHUIHeaderView()) 81 + ->setHeader($title); 82 + 83 + if ($action) { 84 + $header->addActionItem($action); 85 + } 86 + 87 + $view = id(new PHUIObjectBoxView()) 88 + ->setHeader($header) 89 + ->appendChild($content) 90 + ->setBackground(PHUIObjectBoxView::WHITE_CONFIG); 91 + 92 + return $view; 61 93 } 62 94 63 95 }
+12 -13
src/applications/config/controller/PhabricatorConfigDatabaseIssueController.php
··· 12 12 $expect = $query->loadExpectedSchemata(); 13 13 $comp_servers = $query->buildComparisonSchemata($expect, $actual); 14 14 15 - $crumbs = $this->buildApplicationCrumbs(); 16 - $crumbs->addTextCrumb(pht('Database Issues')); 17 - $crumbs->setBorder(true); 18 - 19 15 // Collect all open issues. 20 16 $issues = array(); 21 17 foreach ($comp_servers as $ref_name => $comp) { ··· 158 154 } 159 155 160 156 $title = pht('Database Issues'); 161 - 162 - $header = id(new PHUIHeaderView()) 163 - ->setHeader($title) 164 - ->setProfileHeader(true); 157 + $header = $this->buildHeaderView($title); 165 158 166 159 $nav = $this->buildSideNavView(); 167 160 $nav->selectFilter('dbissue/'); 168 161 169 - $content = id(new PhabricatorConfigPageView()) 162 + $view = $this->buildConfigBoxView(pht('Issues'), $table); 163 + 164 + $crumbs = $this->buildApplicationCrumbs() 165 + ->addTextCrumb($title) 166 + ->setBorder(true); 167 + 168 + $content = id(new PHUITwoColumnView()) 170 169 ->setHeader($header) 171 - ->setContent($table); 170 + ->setNavigation($nav) 171 + ->setFixed(true) 172 + ->setMainColumn($view); 172 173 173 174 return $this->newPage() 174 175 ->setTitle($title) 175 176 ->setCrumbs($crumbs) 176 - ->setNavigation($nav) 177 - ->appendChild($content) 178 - ->addClass('white-background'); 177 + ->appendChild($content); 179 178 } 180 179 181 180 }
+31 -20
src/applications/config/controller/PhabricatorConfigDatabaseStatusController.php
··· 132 132 } 133 133 134 134 $doc_link = PhabricatorEnv::getDoclink('Managing Storage Adjustments'); 135 + $button = id(new PHUIButtonView()) 136 + ->setTag('a') 137 + ->setIcon('fa-book') 138 + ->setHref($doc_link) 139 + ->setText(pht('Documentation')); 135 140 136 - $header = id(new PHUIHeaderView()) 137 - ->setHeader($title) 138 - ->setProfileHeader(true) 139 - ->addActionLink( 140 - id(new PHUIButtonView()) 141 - ->setTag('a') 142 - ->setIcon('fa-book') 143 - ->setHref($doc_link) 144 - ->setText(pht('Learn More'))); 141 + $header = $this->buildHeaderView($title, $button); 145 142 146 - $content = id(new PhabricatorConfigPageView()) 143 + $content = id(new PHUITwoColumnView()) 147 144 ->setHeader($header) 148 - ->setContent($body); 145 + ->setNavigation($nav) 146 + ->setFixed(true) 147 + ->setMainColumn($body); 149 148 150 149 return $this->newPage() 151 150 ->setTitle($title) 152 151 ->setCrumbs($crumbs) 153 - ->setNavigation($nav) 154 - ->appendChild($content) 155 - ->addClass('white-background'); 152 + ->appendChild($content); 156 153 } 157 154 158 155 ··· 221 218 )); 222 219 223 220 $title = pht('Database Status'); 224 - 225 221 $properties = $this->buildProperties( 226 222 array( 227 223 ), 228 224 $comp->getIssues()); 225 + $properties = $this->buildConfigBoxView(pht('Properties'), $properties); 226 + $table = $this->buildConfigBoxView(pht('Database'), $table); 229 227 230 228 return $this->buildResponse($title, array($properties, $table)); 231 229 } ··· 280 278 null, 281 279 )); 282 280 283 - $title = pht('Database: %s', $database_name); 281 + $title = $database_name; 284 282 285 283 $actual_database = $actual->getDatabase($database_name); 286 284 if ($actual_database) { ··· 324 322 ), 325 323 ), 326 324 $database->getIssues()); 325 + 326 + $properties = $this->buildConfigBoxView(pht('Properties'), $properties); 327 + $table = $this->buildConfigBoxView(pht('Database'), $table); 327 328 328 329 return $this->buildResponse($title, array($properties, $table)); 329 330 } ··· 503 504 null, 504 505 )); 505 506 506 - $title = pht('Database: %s.%s', $database_name, $table_name); 507 + $title = pht('%s.%s', $database_name, $table_name); 507 508 508 509 if ($actual_table) { 509 510 $actual_collation = $actual_table->getCollation(); ··· 534 535 ), 535 536 $table->getIssues()); 536 537 538 + $box_header = pht('%s.%s', $database_name, $table_name); 539 + 540 + $properties = $this->buildConfigBoxView(pht('Properties'), $properties); 541 + $table = $this->buildConfigBoxView(pht('Database'), $table_view); 542 + $keys = $this->buildConfigBoxView(pht('Keys'), $keys_view); 543 + 537 544 return $this->buildResponse( 538 - $title, array($properties, $table_view, $keys_view)); 545 + $title, array($properties, $table, $keys)); 539 546 } 540 547 541 548 private function renderColumn( ··· 613 620 614 621 615 622 $title = pht( 616 - 'Database Status: %s.%s.%s', 623 + '%s.%s.%s', 617 624 $database_name, 618 625 $table_name, 619 626 $column_name); ··· 671 678 ), 672 679 $column->getIssues()); 673 680 681 + $properties = $this->buildConfigBoxView(pht('Properties'), $properties); 682 + 674 683 return $this->buildResponse($title, $properties); 675 684 } 676 685 ··· 734 743 } 735 744 736 745 $title = pht( 737 - 'Database Status: %s.%s (%s)', 746 + '%s.%s (%s)', 738 747 $database_name, 739 748 $table_name, 740 749 $key_name); ··· 763 772 ), 764 773 ), 765 774 $key->getIssues()); 775 + 776 + $properties = $this->buildConfigBoxView(pht('Properties'), $properties); 766 777 767 778 return $this->buildResponse($title, $properties); 768 779 }
+68 -66
src/applications/config/controller/PhabricatorConfigEditController.php
··· 7 7 $viewer = $request->getViewer(); 8 8 $key = $request->getURIData('key'); 9 9 10 - 11 10 $options = PhabricatorApplicationConfigOptions::loadAllOptions(); 12 11 if (empty($options[$key])) { 13 12 $ancient = PhabricatorExtraConfigSetupCheck::getAncientConfig(); ··· 104 103 $error_view = null; 105 104 if ($errors) { 106 105 $error_view = id(new PHUIInfoView()) 106 + ->setSeverity(PHUIInfoView::SEVERITY_ERROR) 107 107 ->setErrors($errors); 108 108 } 109 109 110 + $doc_href = PhabricatorEnv::getDoclink( 111 + 'Configuration Guide: Locked and Hidden Configuration'); 112 + 113 + $doc_link = phutil_tag( 114 + 'a', 115 + array( 116 + 'href' => $doc_href, 117 + 'target' => '_blank', 118 + ), 119 + pht('Learn more about locked and hidden options.')); 120 + 110 121 $status_items = array(); 122 + $tag = null; 111 123 if ($option->getHidden()) { 124 + $tag = id(new PHUITagView()) 125 + ->setName(pht('Hidden')) 126 + ->setColor(PHUITagView::COLOR_GREY) 127 + ->setBorder(PHUITagView::BORDER_NONE) 128 + ->setType(PHUITagView::TYPE_SHADE); 129 + 112 130 $message = pht( 113 131 'This configuration is hidden and can not be edited or viewed from '. 114 132 'the web interface.'); 115 - 116 - $status_items[] = id(new PHUIStatusItemView()) 117 - ->setIcon('fa-eye-slash red') 118 - ->setTarget(phutil_tag('strong', array(), pht('Configuration Hidden'))) 119 - ->setNote($message); 133 + $status_items[] = id(new PHUIInfoView()) 134 + ->appendChild(array($message, ' ', $doc_link)); 120 135 } else if ($option->getLocked()) { 121 - $message = $option->getLockedMessage(); 122 - 123 - $status_items[] = id(new PHUIStatusItemView()) 124 - ->setIcon('fa-lock red') 125 - ->setTarget(phutil_tag('strong', array(), pht('Configuration Locked'))) 126 - ->setNote($message); 127 - } 128 - 129 - if ($status_items) { 130 - $doc_href = PhabricatorEnv::getDoclink( 131 - 'Configuration Guide: Locked and Hidden Configuration'); 132 - 133 - $doc_link = phutil_tag( 134 - 'a', 135 - array( 136 - 'href' => $doc_href, 137 - 'target' => '_blank', 138 - ), 139 - pht('Configuration Guide: Locked and Hidden Configuration')); 136 + $tag = id(new PHUITagView()) 137 + ->setName(pht('Locked')) 138 + ->setColor(PHUITagView::COLOR_RED) 139 + ->setBorder(PHUITagView::BORDER_NONE) 140 + ->setType(PHUITagView::TYPE_SHADE); 140 141 141 - $status_items[] = id(new PHUIStatusItemView()) 142 - ->setIcon('fa-book') 143 - ->setTarget(phutil_tag('strong', array(), pht('Learn More'))) 144 - ->setNote($doc_link); 142 + $message = $option->getLockedMessage(); 143 + $status_items[] = id(new PHUIInfoView()) 144 + ->appendChild(array($message, ' ', $doc_link)); 145 145 } 146 146 147 147 if ($option->getHidden() || $option->getLocked()) { ··· 168 168 ->setUser($viewer) 169 169 ->addHiddenInput('issue', $request->getStr('issue')); 170 170 171 - if ($status_items) { 172 - $status_view = id(new PHUIStatusListView()); 173 - 174 - foreach ($status_items as $status_item) { 175 - $status_view->addItem($status_item); 176 - } 177 - 178 - $form->appendControl( 179 - id(new AphrontFormMarkupControl()) 180 - ->setValue($status_view)); 181 - } 182 - 183 171 $description = $option->getDescription(); 184 172 if (strlen($description)) { 185 173 $description_view = new PHUIRemarkupView($viewer, $description); ··· 213 201 ->setValue(pht('Save Config Entry'))); 214 202 } 215 203 204 + $current_config = null; 216 205 if (!$option->getHidden()) { 217 - $form->appendChild( 218 - id(new AphrontFormMarkupControl()) 219 - ->setLabel(pht('Current Configuration')) 220 - ->setValue($this->renderDefaults($option, $config_entry))); 206 + $current_config = $this->renderDefaults($option, $config_entry); 207 + $current_config = $this->buildConfigBoxView( 208 + pht('Current Configuration'), 209 + $current_config); 221 210 } 222 211 223 212 $examples = $this->renderExamples($option); 224 213 if ($examples) { 225 - $form->appendChild( 226 - id(new AphrontFormMarkupControl()) 227 - ->setLabel(pht('Examples')) 228 - ->setValue($examples)); 214 + $examples = $this->buildConfigBoxView( 215 + pht('Examples'), 216 + $examples); 229 217 } 230 218 231 - $title = pht('Edit Option: %s', $key); 232 - $header_icon = 'fa-pencil'; 233 - $short = pht('Edit'); 219 + $title = $key; 234 220 235 - $form_box = id(new PHUIObjectBoxView()) 236 - ->setHeaderText(pht('Config Option')) 237 - ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 238 - ->setForm($form); 239 - 240 - if ($error_view) { 241 - $form_box->setInfoView($error_view); 221 + $box_header = array(); 222 + if ($group) { 223 + $box_header[] = phutil_tag( 224 + 'a', 225 + array( 226 + 'href' => $group_uri, 227 + ), 228 + $group->getName()); 229 + $box_header[] = " \xC2\xBB "; 242 230 } 231 + $box_header[] = $key; 243 232 244 233 $crumbs = $this->buildApplicationCrumbs(); 245 234 $crumbs->addTextCrumb(pht('Config'), $this->getApplicationURI()); 246 - 247 235 if ($group) { 248 236 $crumbs->addTextCrumb($group->getName(), $group_uri); 249 237 } 250 - 251 238 $crumbs->addTextCrumb($key, '/config/edit/'.$key); 252 239 $crumbs->setBorder(true); 240 + 241 + $form_box = $this->buildConfigBoxView($box_header, $form, $tag); 253 242 254 243 $timeline = $this->buildTransactionTimeline( 255 244 $config_entry, 256 245 new PhabricatorConfigTransactionQuery()); 257 246 $timeline->setShouldTerminate(true); 258 247 259 - $header = id(new PHUIHeaderView()) 260 - ->setHeader($title) 261 - ->setHeaderIcon($header_icon); 248 + $nav = $this->buildSideNavView(); 249 + $nav->selectFilter($group_uri); 250 + 251 + $header = $this->buildHeaderView($title); 262 252 263 253 $view = id(new PHUITwoColumnView()) 264 254 ->setHeader($header) 265 - ->setFooter($form_box); 255 + ->setNavigation($nav) 256 + ->setFixed(true) 257 + ->setMainColumn(array( 258 + $error_view, 259 + $form_box, 260 + $status_items, 261 + $examples, 262 + $current_config, 263 + )); 266 264 267 265 return $this->newPage() 268 266 ->setTitle($title) ··· 426 424 } 427 425 } 428 426 429 - $table[] = phutil_tag('tr', array(), array( 427 + $table[] = phutil_tag('tr', array('class' => 'column-labels'), array( 430 428 phutil_tag('th', array(), $description), 431 429 phutil_tag('td', array(), $value), 432 430 )); ··· 438 436 'table', 439 437 array( 440 438 'class' => 'config-option-table', 439 + 'cellspacing' => '0', 440 + 'cellpadding' => '0', 441 441 ), 442 442 $table); 443 443 } ··· 497 497 'table', 498 498 array( 499 499 'class' => 'config-option-table', 500 + 'cellspacing' => '0', 501 + 'cellpadding' => '0', 500 502 ), 501 503 $table); 502 504 }
+17 -18
src/applications/config/controller/PhabricatorConfigGroupController.php
··· 13 13 return new Aphront404Response(); 14 14 } 15 15 16 - $group_uri = PhabricatorConfigGroupConstants::getGroupURI( 16 + $group_uri = PhabricatorConfigGroupConstants::getGroupFullURI( 17 17 $options->getGroup()); 18 18 $group_name = PhabricatorConfigGroupConstants::getGroupShortName( 19 19 $options->getGroup()); ··· 22 22 $nav->selectFilter($group_uri); 23 23 24 24 $title = pht('%s Configuration', $options->getName()); 25 + $header = $this->buildHeaderView($title); 25 26 $list = $this->buildOptionList($options->getOptions()); 27 + $group_url = phutil_tag('a', array('href' => $group_uri), $group_name); 26 28 27 - $crumbs = $this 28 - ->buildApplicationCrumbs() 29 + $box_header = pht("%s \xC2\xBB %s", $group_url, $options->getName()); 30 + $view = $this->buildConfigBoxView($box_header, $list); 31 + 32 + $crumbs = $this->buildApplicationCrumbs() 29 33 ->addTextCrumb($group_name, $this->getApplicationURI($group_uri)) 30 34 ->addTextCrumb($options->getName()) 31 35 ->setBorder(true); 32 36 33 - $header = id(new PHUIHeaderView()) 34 - ->setHeader($title) 35 - ->setProfileHeader(true); 36 - 37 - $content = id(new PhabricatorConfigPageView()) 37 + $content = id(new PHUITwoColumnView()) 38 38 ->setHeader($header) 39 - ->setContent($list); 39 + ->setNavigation($nav) 40 + ->setFixed(true) 41 + ->setMainColumn($view); 40 42 41 43 return $this->newPage() 42 44 ->setTitle($title) 43 45 ->setCrumbs($crumbs) 44 - ->setNavigation($nav) 45 - ->appendChild($content) 46 - ->addClass('white-background'); 46 + ->appendChild($content); 47 47 } 48 48 49 49 private function buildOptionList(array $options) { ··· 77 77 ->setHref('/config/edit/'.$option->getKey().'/') 78 78 ->addAttribute($summary); 79 79 80 - $label = pht('Current Value:'); 81 80 $color = null; 82 81 $db_value = idx($db_values, $option->getKey()); 83 82 if ($db_value && !$db_value->getIsDeleted()) { 84 83 $item->setEffect('visited'); 85 84 $color = 'violet'; 86 - $label = pht('Customized Value:'); 87 85 } 88 86 89 87 if ($option->getHidden()) { ··· 91 89 $item->setDisabled(true); 92 90 } else if ($option->getLocked()) { 93 91 $item->setStatusIcon('fa-lock '.$color, pht('Locked')); 92 + } else if ($color) { 93 + $item->setStatusIcon('fa-pencil '.$color, pht('Editable')); 94 94 } else { 95 95 $item->setStatusIcon('fa-pencil-square-o '.$color, pht('Editable')); 96 96 } ··· 102 102 $current_value = phutil_tag( 103 103 'div', 104 104 array( 105 - 'class' => 'config-options-current-value', 105 + 'class' => 'config-options-current-value '.$color, 106 106 ), 107 107 array( 108 - phutil_tag('span', array(), $label), 109 - ' '.$current_value, 108 + $current_value, 110 109 )); 111 110 112 - $item->appendChild($current_value); 111 + $item->setSideColumn($current_value); 113 112 } 114 113 115 114 $list->addItem($item);
+9 -12
src/applications/config/controller/PhabricatorConfigHistoryController.php
··· 29 29 $object->willRenderTimeline($timeline, $this->getRequest()); 30 30 31 31 $title = pht('Settings History'); 32 - 33 - $crumbs = $this->buildApplicationCrumbs(); 34 - $crumbs->addTextCrumb($title); 35 - $crumbs->setBorder(true); 32 + $header = $this->buildHeaderView($title); 36 33 37 34 $nav = $this->buildSideNavView(); 38 35 $nav->selectFilter('history/'); 39 36 40 - $header = id(new PHUIHeaderView()) 41 - ->setHeader($title) 42 - ->setProfileHeader(true); 37 + $crumbs = $this->buildApplicationCrumbs() 38 + ->addTextCrumb($title) 39 + ->setBorder(true); 43 40 44 - $content = id(new PhabricatorConfigPageView()) 41 + $content = id(new PHUITwoColumnView()) 45 42 ->setHeader($header) 46 - ->setContent($timeline); 43 + ->setNavigation($nav) 44 + ->setFixed(true) 45 + ->setMainColumn($timeline); 47 46 48 47 return $this->newPage() 49 48 ->setTitle($title) 50 49 ->setCrumbs($crumbs) 51 - ->setNavigation($nav) 52 - ->appendChild($content) 53 - ->addClass('white-background'); 50 + ->appendChild($content); 54 51 } 55 52 56 53 }
+16 -16
src/applications/config/controller/PhabricatorConfigIssueListController.php
··· 43 43 } 44 44 45 45 $title = pht('Setup Issues'); 46 - 47 - $header = id(new PHUIHeaderView()) 48 - ->setHeader($title) 49 - ->setProfileHeader(true); 50 - 51 - $crumbs = $this 52 - ->buildApplicationCrumbs() 53 - ->addTextCrumb(pht('Setup Issues')) 54 - ->setBorder(true); 46 + $header = $this->buildHeaderView($title); 55 47 56 - $page = array( 57 - $no_issues, 48 + $issue_list = array( 58 49 $important, 59 50 $php, 60 51 $mysql, 61 52 $other, 62 53 ); 63 54 64 - $content = id(new PhabricatorConfigPageView()) 55 + $issue_list = $this->buildConfigBoxView(pht('Issues'), $issue_list); 56 + 57 + $crumbs = $this->buildApplicationCrumbs() 58 + ->addTextCrumb($title) 59 + ->setBorder(true); 60 + 61 + $content = id(new PHUITwoColumnView()) 65 62 ->setHeader($header) 66 - ->setContent($page); 63 + ->setNavigation($nav) 64 + ->setFixed(true) 65 + ->setMainColumn(array( 66 + $no_issues, 67 + $issue_list, 68 + )); 67 69 68 70 return $this->newPage() 69 71 ->setTitle($title) 70 72 ->setCrumbs($crumbs) 71 - ->setNavigation($nav) 72 - ->appendChild($content) 73 - ->addClass('white-background'); 73 + ->appendChild($content); 74 74 } 75 75 76 76 private function buildIssueList(array $issues, $group, $fonticon) {
+9 -3
src/applications/config/controller/PhabricatorConfigIssueViewController.php
··· 36 36 $title = $issue->getShortName(); 37 37 } 38 38 39 + $header = $this->buildHeaderView($title); 40 + 39 41 $crumbs = $this 40 42 ->buildApplicationCrumbs() 41 43 ->setBorder(true) ··· 43 45 ->addTextCrumb($title, $request->getRequestURI()) 44 46 ->setBorder(true); 45 47 48 + $content = id(new PHUITwoColumnView()) 49 + ->setHeader($header) 50 + ->setNavigation($nav) 51 + ->setFixed(true) 52 + ->setMainColumn($content); 53 + 46 54 return $this->newPage() 47 55 ->setTitle($title) 48 56 ->setCrumbs($crumbs) 49 - ->setNavigation($nav) 50 - ->appendChild($content) 51 - ->addClass('white-background'); 57 + ->appendChild($content); 52 58 } 53 59 54 60 private function renderIssue(PhabricatorSetupIssue $issue) {
+9 -12
src/applications/config/controller/PhabricatorConfigListController.php
··· 11 11 12 12 $groups = PhabricatorApplicationConfigOptions::loadAll(); 13 13 $core_list = $this->buildConfigOptionsList($groups, 'core'); 14 + $core_list = $this->buildConfigBoxView(pht('Core'), $core_list); 14 15 15 16 $title = pht('Core Settings'); 17 + $header = $this->buildHeaderView($title); 16 18 17 - $header = id(new PHUIHeaderView()) 18 - ->setHeader($title) 19 - ->setProfileHeader(true); 20 - 21 - $crumbs = $this 22 - ->buildApplicationCrumbs() 23 - ->addTextCrumb(pht('Core')) 19 + $crumbs = $this->buildApplicationCrumbs() 20 + ->addTextCrumb($title) 24 21 ->setBorder(true); 25 22 26 - $content = id(new PhabricatorConfigPageView()) 23 + $content = id(new PHUITwoColumnView()) 27 24 ->setHeader($header) 28 - ->setContent($core_list); 25 + ->setNavigation($nav) 26 + ->setFixed(true) 27 + ->setMainColumn($core_list); 29 28 30 29 return $this->newPage() 31 30 ->setTitle($title) 32 31 ->setCrumbs($crumbs) 33 - ->setNavigation($nav) 34 - ->appendChild($content) 35 - ->addClass('white-background'); 32 + ->appendChild($content); 36 33 } 37 34 38 35 private function buildConfigOptionsList(array $groups, $type) {
+11 -12
src/applications/config/controller/PhabricatorConfigModuleController.php
··· 16 16 $content = $module->renderModuleStatus($request); 17 17 $title = $module->getModuleName(); 18 18 19 - $crumbs = $this->buildApplicationCrumbs(); 20 - $crumbs->addTextCrumb($title); 21 - $crumbs->setBorder(true); 22 - 23 19 $nav = $this->buildSideNavView(); 24 20 $nav->selectFilter('module/'.$key.'/'); 21 + $header = $this->buildHeaderView($title); 25 22 26 - $header = id(new PHUIHeaderView()) 27 - ->setHeader($title) 28 - ->setProfileHeader(true); 23 + $view = $this->buildConfigBoxView($title, $content); 24 + 25 + $crumbs = $this->buildApplicationCrumbs() 26 + ->addTextCrumb($title) 27 + ->setBorder(true); 29 28 30 - $content = id(new PhabricatorConfigPageView()) 29 + $content = id(new PHUITwoColumnView()) 31 30 ->setHeader($header) 32 - ->setContent($content); 31 + ->setNavigation($nav) 32 + ->setFixed(true) 33 + ->setMainColumn($view); 33 34 34 35 return $this->newPage() 35 36 ->setTitle($title) 36 37 ->setCrumbs($crumbs) 37 - ->setNavigation($nav) 38 - ->appendChild($content) 39 - ->addClass('white-background'); 38 + ->appendChild($content); 40 39 } 41 40 42 41 }
+13 -14
src/applications/config/controller/PhabricatorConfigVersionController.php
··· 7 7 $viewer = $request->getViewer(); 8 8 9 9 $title = pht('Version Information'); 10 - 11 - $crumbs = $this 12 - ->buildApplicationCrumbs() 13 - ->addTextCrumb($title) 14 - ->setBorder(true); 15 - 16 10 $versions = $this->renderModuleStatus($viewer); 17 11 18 12 $nav = $this->buildSideNavView(); 19 13 $nav->selectFilter('version/'); 14 + $header = $this->buildHeaderView($title); 20 15 21 - $header = id(new PHUIHeaderView()) 22 - ->setHeader($title) 23 - ->setProfileHeader(true); 16 + $view = $this->buildConfigBoxView( 17 + pht('Installed Versions'), 18 + $versions); 19 + 20 + $crumbs = $this->buildApplicationCrumbs() 21 + ->addTextCrumb($title) 22 + ->setBorder(true); 24 23 25 - $content = id(new PhabricatorConfigPageView()) 24 + $content = id(new PHUITwoColumnView()) 26 25 ->setHeader($header) 27 - ->setContent($versions); 26 + ->setNavigation($nav) 27 + ->setFixed(true) 28 + ->setMainColumn($view); 28 29 29 30 return $this->newPage() 30 31 ->setTitle($title) 31 32 ->setCrumbs($crumbs) 32 - ->setNavigation($nav) 33 - ->appendChild($content) 34 - ->addClass('white-background'); 33 + ->appendChild($content); 35 34 36 35 } 37 36
-60
src/applications/config/view/PhabricatorConfigPageView.php
··· 1 - <?php 2 - 3 - final class PhabricatorConfigPageView extends AphrontTagView { 4 - 5 - private $header; 6 - private $content; 7 - private $footer; 8 - 9 - public function setHeader(PHUIHeaderView $header) { 10 - $this->header = $header; 11 - return $this; 12 - } 13 - 14 - public function setContent($content) { 15 - $this->content = $content; 16 - return $this; 17 - } 18 - 19 - public function setFooter($footer) { 20 - $this->footer = $footer; 21 - return $this; 22 - } 23 - 24 - protected function getTagName() { 25 - return 'div'; 26 - } 27 - 28 - protected function getTagAttributes() { 29 - require_celerity_resource('config-page-css'); 30 - 31 - $classes = array(); 32 - $classes[] = 'config-page'; 33 - 34 - return array( 35 - 'class' => implode(' ', $classes), 36 - ); 37 - } 38 - 39 - protected function getTagContent() { 40 - 41 - $header = null; 42 - if ($this->header) { 43 - $header = phutil_tag_div('config-page-header', $this->header); 44 - } 45 - 46 - $content = null; 47 - if ($this->content) { 48 - $content = phutil_tag_div('config-page-content', $this->content); 49 - } 50 - 51 - $footer = null; 52 - if ($this->footer) { 53 - $footer = phutil_tag_div('config-page-footer', $this->footer); 54 - } 55 - 56 - return array($header, $content, $footer); 57 - 58 - } 59 - 60 - }
+1
src/view/phui/PHUIObjectBoxView.php
··· 35 35 36 36 const BLUE = 'phui-box-blue'; 37 37 const BLUE_PROPERTY = 'phui-box-blue-property'; 38 + const WHITE_CONFIG = 'phui-box-white-config'; 38 39 const GREY = 'phui-box-grey'; 39 40 40 41 public function addPropertyList(PHUIPropertyListView $property_list) {
+12 -10
webroot/rsrc/css/application/config/config-options.css
··· 5 5 .config-option-table { 6 6 width: 100%; 7 7 border-collapse: collapse; 8 - border: 1px solid {$thinblueborder}; 8 + border: none; 9 9 background: {$page.content}; 10 10 } 11 11 12 12 .config-option-table th, 13 13 .config-option-table td { 14 - padding: 4px 12px; 15 - border: 1px solid {$lightgreyborder}; 14 + padding: 8px 12px; 15 + border-bottom: 1px solid {$thinblueborder}; 16 16 } 17 17 18 18 .config-option-table th { 19 19 background: {$lightgreybackground}; 20 20 color: {$bluetext}; 21 - text-align: right; 21 + text-align: left; 22 22 white-space: nowrap; 23 23 } 24 24 ··· 37 37 .config-option-table .column-labels th { 38 38 font-weight: bold; 39 39 color: {$bluetext}; 40 - text-align: center; 41 - background: {$greybackground}; 40 + background: {$lightgreybackground}; 41 + border-right: 1px solid {$thinblueborder}; 42 42 } 43 43 44 44 .config-options-current-value { 45 - padding: 0 8px 6px; 46 - white-space: pre-wrap; 45 + white-space: nowrap; 46 + width: 200px; 47 + text-overflow: ellipsis; 48 + overflow: hidden; 47 49 } 48 50 49 - .config-options-current-value span { 50 - color: {$greytext}; 51 + .config-options-current-value.violet { 52 + color: {$violet}; 51 53 } 52 54 53 55 .config-options-effective-value,
-77
webroot/rsrc/css/application/config/config-page.css
··· 1 - /** 2 - * @provides config-page-css 3 - */ 4 - 5 - .config-page-header { 6 - margin: 28px 24px 0; 7 - padding-bottom: 28px; 8 - border-bottom: 1px solid {$thinblueborder}; 9 - } 10 - 11 - .device-phone .config-page-header { 12 - margin: 4px 12px 0; 13 - padding-bottom: 4px; 14 - } 15 - 16 - .config-page-header .phui-profile-header { 17 - padding: 0; 18 - } 19 - 20 - .device-phone .config-page-header .phui-profile-header { 21 - padding-left: 4px; 22 - padding-right: 4px; 23 - } 24 - 25 - .config-page-header .phui-profile-header.phui-header-shell .phui-header-header { 26 - font-size: 20px; 27 - } 28 - 29 - .device-phone .config-page-header .phui-profile-header.phui-header-shell 30 - .phui-header-header { 31 - font-size: 16px; 32 - } 33 - 34 - .config-page-content { 35 - margin: 0 24px; 36 - } 37 - 38 - .device-phone .config-page-content { 39 - margin: 0 4px; 40 - } 41 - 42 - .device-desktop .config-page-content .phui-oi-list-view { 43 - padding-left: 0; 44 - padding-right: 0; 45 - } 46 - 47 - .device-desktop .config-page-content .phui-document-fluid .phui-document-view { 48 - padding: 16px 0; 49 - margin: 0; 50 - } 51 - 52 - .config-page-content .aphront-table-view { 53 - border: none; 54 - } 55 - 56 - .config-page-property { 57 - padding-top: 4px; 58 - border-bottom: 1px solid {$thinblueborder}; 59 - } 60 - 61 - .config-page-content .aphront-table-notice { 62 - padding: 0; 63 - } 64 - 65 - .config-page-content .aphront-table-notice .phui-info-view { 66 - margin-left: 0; 67 - margin-right: 0; 68 - } 69 - 70 - .config-page-content .aphront-table-wrap + .aphront-table-wrap { 71 - margin-top: 20px; 72 - border-top: 1px solid {$thinblueborder}; 73 - } 74 - 75 - .config-page-content .phui-box.phui-box-blue-property { 76 - margin-top: 16px; 77 - }
+14 -1
webroot/rsrc/css/phui/object-item/phui-oi-big-ui.css
··· 31 31 } 32 32 33 33 .device-desktop .phui-oi-list-big .phui-oi { 34 - margin-bottom: 8px; 34 + margin-bottom: 4px; 35 35 } 36 36 37 37 .phui-oi-list-big .phui-oi-col0 { ··· 46 46 .phui-oi-list-big .phui-oi-visited a.phui-oi-link { 47 47 color: {$violet}; 48 48 } 49 + 50 + .phui-box-white-config .phui-oi-list-big.phui-oi-list-view { 51 + padding: 8px 8px 4px; 52 + } 53 + 54 + .phui-box-white-config .phui-oi-frame { 55 + padding: 4px 8px 0; 56 + } 57 + 58 + .device-desktop .phui-box-white-config .phui-oi:hover .phui-oi-frame { 59 + background-color: {$hoverblue}; 60 + border-radius: 3px; 61 + }
+21
webroot/rsrc/css/phui/phui-box.css
··· 115 115 .phui-header-shell { 116 116 background: {$page.content}; 117 117 } 118 + 119 + /* Config Boxes */ 120 + 121 + .phui-box-white-config.phui-box-border { 122 + border-color: #e2e2e2; 123 + border-radius: 5px; 124 + } 125 + 126 + .phui-box-white-config.phui-object-box { 127 + padding: 16px 0 0 0; 128 + } 129 + 130 + .phui-box-white-config .phui-header-shell { 131 + border-bottom: 1px solid #e2e2e2; 132 + overflow: hidden; 133 + padding: 0 16px 16px; 134 + } 135 + 136 + .phui-box-white-config .phui-header-header { 137 + color: {$bluetext}; 138 + }
+4 -4
webroot/rsrc/css/phui/phui-header-view.css
··· 34 34 vertical-align: middle; 35 35 } 36 36 37 - .device-phone .phui-header-col3 { 38 - vertical-align: top; 39 - } 40 - 41 37 body .phui-header-shell.phui-header-no-backgound { 42 38 background-color: transparent; 43 39 border: none; ··· 339 335 .phui-profile-header.phui-header-shell .phui-header-header { 340 336 font-size: 24px; 341 337 color: {$blacktext}; 338 + } 339 + 340 + .phui-profile-header .phui-header-col3 { 341 + vertical-align: top; 342 342 } 343 343 344 344 .phui-header-view .phui-tag-indigo a {