@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

Redesign Home/Profile/Projects side navigation

Summary: Ref T11957. Needs some more polish, but I think everything here is square.

Test Plan: Add personal/global items to home, test mobile. Test workboards / colors.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: 20after4, rfreebern, Korvin

Maniphest Tasks: T11957

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

+458 -963
+41 -47
resources/celerity/map.php
··· 9 9 'names' => array( 10 10 'conpherence.pkg.css' => 'e25569a9', 11 11 'conpherence.pkg.js' => '6249a1cf', 12 - 'core.pkg.css' => '7c235ec7', 13 - 'core.pkg.js' => '2291d3b2', 12 + 'core.pkg.css' => '25cda14d', 13 + 'core.pkg.js' => 'f1e0e26f', 14 14 'darkconsole.pkg.js' => 'e7393ebb', 15 15 'differential.pkg.css' => '4815647b', 16 16 'differential.pkg.js' => 'ddfeb49b', ··· 29 29 'rsrc/css/aphront/phabricator-nav-view.css' => 'b29426e9', 30 30 'rsrc/css/aphront/table-view.css' => '213a5981', 31 31 'rsrc/css/aphront/tokenizer.css' => '9a8cb501', 32 - 'rsrc/css/aphront/tooltip.css' => '1a07aea8', 32 + 'rsrc/css/aphront/tooltip.css' => '3f325821', 33 33 'rsrc/css/aphront/typeahead-browse.css' => '8904346a', 34 34 'rsrc/css/aphront/typeahead.css' => 'd4f16145', 35 35 'rsrc/css/application/almanac/almanac.css' => 'dbb9b3af', 36 36 'rsrc/css/application/auth/auth.css' => '0877ed6e', 37 - 'rsrc/css/application/base/main-menu-view.css' => '8eac4166', 37 + 'rsrc/css/application/base/main-menu-view.css' => '93519cb0', 38 38 'rsrc/css/application/base/notification-menu.css' => '6a697e43', 39 - 'rsrc/css/application/base/phabricator-application-launch-view.css' => '95351601', 40 - 'rsrc/css/application/base/phui-theme.css' => '798c69b8', 39 + 'rsrc/css/application/base/phui-theme.css' => '9f261c6b', 41 40 'rsrc/css/application/base/standard-page-view.css' => '894d8a25', 42 41 'rsrc/css/application/chatlog/chatlog.css' => 'd295b020', 43 42 'rsrc/css/application/conduit/conduit-api.css' => '7bc725c4', ··· 102 101 'rsrc/css/application/releeph/releeph-preview-branch.css' => 'b7a6f4a5', 103 102 'rsrc/css/application/releeph/releeph-request-differential-create-dialog.css' => '8d8b92cd', 104 103 'rsrc/css/application/releeph/releeph-request-typeahead.css' => '667a48ae', 105 - 'rsrc/css/application/search/application-search-view.css' => '8452c849', 104 + 'rsrc/css/application/search/application-search-view.css' => '20ae9d85', 106 105 'rsrc/css/application/search/search-results.css' => '64ad079a', 107 106 'rsrc/css/application/slowvote/slowvote.css' => 'a94b7230', 108 107 'rsrc/css/application/tokens/tokens.css' => '3d0f239e', ··· 119 118 'rsrc/css/layout/phabricator-filetree-view.css' => 'fccf9f82', 120 119 'rsrc/css/layout/phabricator-source-code-view.css' => '4383192f', 121 120 'rsrc/css/phui/calendar/phui-calendar-day.css' => '572b1893', 122 - 'rsrc/css/phui/calendar/phui-calendar-list.css' => 'fcc9fb41', 121 + 'rsrc/css/phui/calendar/phui-calendar-list.css' => 'eb5c774b', 123 122 'rsrc/css/phui/calendar/phui-calendar-month.css' => '8e10e92c', 124 123 'rsrc/css/phui/calendar/phui-calendar.css' => '477acfaa', 125 124 'rsrc/css/phui/object-item/phui-oi-big-ui.css' => '19f9369b', ··· 131 130 'rsrc/css/phui/phui-action-list.css' => '5679229f', 132 131 'rsrc/css/phui/phui-action-panel.css' => '91c7b835', 133 132 'rsrc/css/phui/phui-badge.css' => '3baef8db', 134 - 'rsrc/css/phui/phui-basic-nav-view.css' => '7093573b', 133 + 'rsrc/css/phui/phui-basic-nav-view.css' => 'cb4d5161', 135 134 'rsrc/css/phui/phui-big-info-view.css' => 'bd903741', 136 - 'rsrc/css/phui/phui-box.css' => '33b629f8', 135 + 'rsrc/css/phui/phui-box.css' => '269cbc99', 137 136 'rsrc/css/phui/phui-button.css' => '00ddac15', 138 137 'rsrc/css/phui/phui-chart.css' => '6bf6f78e', 139 138 'rsrc/css/phui/phui-cms.css' => 'be43c8a8', ··· 162 161 'rsrc/css/phui/phui-object-box.css' => '8b289e3d', 163 162 'rsrc/css/phui/phui-pager.css' => 'bea33d23', 164 163 'rsrc/css/phui/phui-pinboard-view.css' => '2495140e', 165 - 'rsrc/css/phui/phui-profile-menu.css' => 'c71ecdcd', 166 164 'rsrc/css/phui/phui-property-list-view.css' => '6d8e58ac', 167 165 'rsrc/css/phui/phui-remarkup-preview.css' => '1a8f2591', 168 - 'rsrc/css/phui/phui-segment-bar-view.css' => '46342871', 166 + 'rsrc/css/phui/phui-segment-bar-view.css' => 'b1d1b892', 169 167 'rsrc/css/phui/phui-spacing.css' => '042804d6', 170 168 'rsrc/css/phui/phui-status.css' => 'd5263e49', 171 169 'rsrc/css/phui/phui-tag-view.css' => '84d65f26', 172 170 'rsrc/css/phui/phui-timeline-view.css' => 'bc523970', 173 171 'rsrc/css/phui/phui-two-column-view.css' => 'f63cad3c', 174 - 'rsrc/css/phui/workboards/phui-workboard-color.css' => 'b60ef38a', 175 - 'rsrc/css/phui/workboards/phui-workboard.css' => 'c88912ee', 172 + 'rsrc/css/phui/workboards/phui-workboard-color.css' => 'f0551a33', 173 + 'rsrc/css/phui/workboards/phui-workboard.css' => '3bc85455', 176 174 'rsrc/css/phui/workboards/phui-workcard.css' => 'cca5fa92', 177 175 'rsrc/css/phui/workboards/phui-workpanel.css' => 'a3a63478', 178 176 'rsrc/css/sprite-login.css' => '587d92d7', ··· 488 486 'rsrc/js/core/ShapedRequest.js' => '7cbe244b', 489 487 'rsrc/js/core/TextAreaUtils.js' => '320810c8', 490 488 'rsrc/js/core/Title.js' => '485aaa6c', 491 - 'rsrc/js/core/ToolTip.js' => 'b5c62c3b', 489 + 'rsrc/js/core/ToolTip.js' => 'd02f7181', 492 490 'rsrc/js/core/behavior-active-nav.js' => 'e379b58e', 493 491 'rsrc/js/core/behavior-audio-source.js' => '59b251eb', 494 492 'rsrc/js/core/behavior-autofocus.js' => '7319e029', ··· 529 527 'rsrc/js/core/behavior-time-typeahead.js' => '522431f7', 530 528 'rsrc/js/core/behavior-toggle-class.js' => '92b9ec77', 531 529 'rsrc/js/core/behavior-tokenizer.js' => 'b3a4b884', 532 - 'rsrc/js/core/behavior-tooltip.js' => '42fcb747', 530 + 'rsrc/js/core/behavior-tooltip.js' => 'c420b0b9', 533 531 'rsrc/js/core/behavior-user-menu.js' => '31420f77', 534 532 'rsrc/js/core/behavior-watch-anchor.js' => '9f36c42d', 535 533 'rsrc/js/core/behavior-workflow.js' => '0a3f3021', ··· 555 553 'aphront-panel-view-css' => '8427b78d', 556 554 'aphront-table-view-css' => '213a5981', 557 555 'aphront-tokenizer-control-css' => '9a8cb501', 558 - 'aphront-tooltip-css' => '1a07aea8', 556 + 'aphront-tooltip-css' => '3f325821', 559 557 'aphront-typeahead-control-css' => 'd4f16145', 560 - 'application-search-view-css' => '8452c849', 558 + 'application-search-view-css' => '20ae9d85', 561 559 'auth-css' => '0877ed6e', 562 560 'bulk-job-css' => 'df9c1d4a', 563 561 'changeset-view-manager' => 'a2828756', ··· 681 679 'javelin-behavior-phabricator-reveal-content' => '60821bc7', 682 680 'javelin-behavior-phabricator-search-typeahead' => '06c32383', 683 681 'javelin-behavior-phabricator-show-older-transactions' => '94c65b72', 684 - 'javelin-behavior-phabricator-tooltips' => '42fcb747', 682 + 'javelin-behavior-phabricator-tooltips' => 'c420b0b9', 685 683 'javelin-behavior-phabricator-transaction-comment-form' => 'b23b49e6', 686 684 'javelin-behavior-phabricator-transaction-list' => '13c739ea', 687 685 'javelin-behavior-phabricator-watch-anchor' => '9f36c42d', ··· 781 779 'path-typeahead' => 'f7fc67ec', 782 780 'people-profile-css' => '2473d929', 783 781 'phabricator-action-list-view-css' => '5679229f', 784 - 'phabricator-application-launch-view-css' => '95351601', 785 782 'phabricator-busy' => '59a7976a', 786 783 'phabricator-chatlog-css' => 'd295b020', 787 784 'phabricator-content-source-view-css' => '4b8b05d4', ··· 798 795 'phabricator-flag-css' => 'bba8f811', 799 796 'phabricator-keyboard-shortcut' => '1ae869f2', 800 797 'phabricator-keyboard-shortcut-manager' => '4a021c10', 801 - 'phabricator-main-menu-view' => '8eac4166', 798 + 'phabricator-main-menu-view' => '93519cb0', 802 799 'phabricator-nav-view-css' => 'b29426e9', 803 800 'phabricator-notification' => 'ccf1cbf8', 804 801 'phabricator-notification-css' => '3f6c89c9', ··· 814 811 'phabricator-standard-page-view' => '894d8a25', 815 812 'phabricator-textareautils' => '320810c8', 816 813 'phabricator-title' => '485aaa6c', 817 - 'phabricator-tooltip' => 'b5c62c3b', 814 + 'phabricator-tooltip' => 'd02f7181', 818 815 'phabricator-ui-example-css' => '528b19de', 819 816 'phabricator-uiexample-javelin-view' => 'd4a14807', 820 817 'phabricator-uiexample-reactor-button' => 'd19198c8', ··· 839 836 'phriction-document-css' => '4282e4ad', 840 837 'phui-action-panel-css' => '91c7b835', 841 838 'phui-badge-view-css' => '3baef8db', 842 - 'phui-basic-nav-view-css' => '7093573b', 839 + 'phui-basic-nav-view-css' => 'cb4d5161', 843 840 'phui-big-info-view-css' => 'bd903741', 844 - 'phui-box-css' => '33b629f8', 841 + 'phui-box-css' => '269cbc99', 845 842 'phui-button-css' => '00ddac15', 846 843 'phui-calendar-css' => '477acfaa', 847 844 'phui-calendar-day-css' => '572b1893', 848 - 'phui-calendar-list-css' => 'fcc9fb41', 845 + 'phui-calendar-list-css' => 'eb5c774b', 849 846 'phui-calendar-month-css' => '8e10e92c', 850 847 'phui-chart-css' => '6bf6f78e', 851 848 'phui-cms-css' => 'be43c8a8', ··· 883 880 'phui-oi-simple-ui-css' => 'a8beebea', 884 881 'phui-pager-css' => 'bea33d23', 885 882 'phui-pinboard-view-css' => '2495140e', 886 - 'phui-profile-menu-css' => 'c71ecdcd', 887 883 'phui-property-list-view-css' => '6d8e58ac', 888 884 'phui-remarkup-preview-css' => '1a8f2591', 889 - 'phui-segment-bar-view-css' => '46342871', 885 + 'phui-segment-bar-view-css' => 'b1d1b892', 890 886 'phui-spacing-css' => '042804d6', 891 887 'phui-status-list-view-css' => 'd5263e49', 892 888 'phui-tag-view-css' => '84d65f26', 893 - 'phui-theme-css' => '798c69b8', 889 + 'phui-theme-css' => '9f261c6b', 894 890 'phui-timeline-view-css' => 'bc523970', 895 891 'phui-two-column-view-css' => 'f63cad3c', 896 - 'phui-workboard-color-css' => 'b60ef38a', 897 - 'phui-workboard-view-css' => 'c88912ee', 892 + 'phui-workboard-color-css' => 'f0551a33', 893 + 'phui-workboard-view-css' => '3bc85455', 898 894 'phui-workcard-view-css' => 'cca5fa92', 899 895 'phui-workpanel-view-css' => 'a3a63478', 900 896 'phuix-action-list-view' => 'b5c256b8', ··· 1177 1173 'javelin-behavior', 1178 1174 'javelin-dom', 1179 1175 'javelin-request', 1180 - ), 1181 - '42fcb747' => array( 1182 - 'javelin-behavior', 1183 - 'javelin-behavior-device', 1184 - 'javelin-stratcom', 1185 - 'phabricator-tooltip', 1186 1176 ), 1187 1177 '44959b73' => array( 1188 1178 'javelin-util', ··· 1612 1602 'javelin-stratcom', 1613 1603 'javelin-util', 1614 1604 ), 1615 - '8eac4166' => array( 1616 - 'phui-theme-css', 1617 - ), 1618 1605 '8ff5e24c' => array( 1619 1606 'javelin-behavior', 1620 1607 'javelin-stratcom', ··· 1636 1623 'javelin-stratcom', 1637 1624 'javelin-dom', 1638 1625 ), 1626 + '93519cb0' => array( 1627 + 'phui-theme-css', 1628 + ), 1639 1629 '93ae974f' => array( 1640 1630 'javelin-behavior', 1641 1631 'javelin-dom', ··· 1888 1878 'javelin-install', 1889 1879 'javelin-dom', 1890 1880 ), 1891 - 'b5c62c3b' => array( 1892 - 'javelin-install', 1893 - 'javelin-util', 1894 - 'javelin-dom', 1895 - 'javelin-vector', 1896 - ), 1897 1881 'b5d57730' => array( 1898 1882 'javelin-install', 1899 1883 'javelin-stratcom', ··· 1969 1953 'javelin-install', 1970 1954 'javelin-dom', 1971 1955 ), 1956 + 'c420b0b9' => array( 1957 + 'javelin-behavior', 1958 + 'javelin-behavior-device', 1959 + 'javelin-stratcom', 1960 + 'phabricator-tooltip', 1961 + ), 1972 1962 'c587b80f' => array( 1973 1963 'javelin-install', 1974 1964 ), ··· 2025 2015 ), 2026 2016 'cd2b9b77' => array( 2027 2017 'phui-oi-list-view-css', 2018 + ), 2019 + 'd02f7181' => array( 2020 + 'javelin-install', 2021 + 'javelin-util', 2022 + 'javelin-dom', 2023 + 'javelin-vector', 2028 2024 ), 2029 2025 'd0c516d5' => array( 2030 2026 'javelin-behavior', ··· 2318 2314 'phui-spacing-css', 2319 2315 'phui-form-css', 2320 2316 'phui-icon-view-css', 2321 - 'phui-profile-menu-css', 2322 - 'phabricator-application-launch-view-css', 2323 2317 'phabricator-action-list-view-css', 2324 2318 'phui-property-list-view-css', 2325 2319 'phui-tag-view-css',
-2
resources/celerity/packages.php
··· 130 130 'phui-spacing-css', 131 131 'phui-form-css', 132 132 'phui-icon-view-css', 133 - 'phui-profile-menu-css', 134 133 135 - 'phabricator-application-launch-view-css', 136 134 'phabricator-action-list-view-css', 137 135 'phui-property-list-view-css', 138 136 'phui-tag-view-css',
+45
resources/sql/autopatches/20170131.dashboard.personal.01.php
··· 1 + <?php 2 + 3 + $table = new PhabricatorDashboard(); 4 + $conn = $table->establishConnection('r'); 5 + $table_name = 'dashboard_install'; 6 + 7 + $search_table = new PhabricatorProfileMenuItemConfiguration(); 8 + $search_conn = $search_table->establishConnection('w'); 9 + $search_table_name = 'search_profilepanelconfiguration'; 10 + 11 + $viewer = PhabricatorUser::getOmnipotentUser(); 12 + $profile_phid = id(new PhabricatorHomeApplication())->getPHID(); 13 + $menu_item_key = PhabricatorDashboardProfileMenuItem::MENUITEMKEY; 14 + 15 + foreach (new LiskRawMigrationIterator($conn, $table_name) as $install) { 16 + 17 + $dashboard_phid = $install['dashboardPHID']; 18 + $new_phid = id(new PhabricatorProfileMenuItemConfiguration())->generatePHID(); 19 + $menu_item_properties = json_encode( 20 + array('dashboardPHID' => $dashboard_phid, 'name' => '')); 21 + 22 + $custom_phid = $install['objectPHID']; 23 + if ($custom_phid == 'dashboard:default') { 24 + $custom_phid = null; 25 + } 26 + 27 + $menu_item_order = 0; 28 + 29 + queryfx( 30 + $search_conn, 31 + 'INSERT INTO %T (phid, profilePHID, menuItemKey, menuItemProperties, '. 32 + 'visibility, dateCreated, dateModified, menuItemOrder, customPHID) VALUES '. 33 + '(%s, %s, %s, %s, %s, %d, %d, %d, %ns)', 34 + $search_table_name, 35 + $new_phid, 36 + $profile_phid, 37 + $menu_item_key, 38 + $menu_item_properties, 39 + 'visible', 40 + PhabricatorTime::getNow(), 41 + PhabricatorTime::getNow(), 42 + $menu_item_order, 43 + $custom_phid); 44 + 45 + }
+4 -6
src/__phutil_library_map__.php
··· 1825 1825 'PhabricatorApplicationEditController' => 'applications/meta/controller/PhabricatorApplicationEditController.php', 1826 1826 'PhabricatorApplicationEditHTTPParameterHelpView' => 'applications/transactions/view/PhabricatorApplicationEditHTTPParameterHelpView.php', 1827 1827 'PhabricatorApplicationEmailCommandsController' => 'applications/meta/controller/PhabricatorApplicationEmailCommandsController.php', 1828 - 'PhabricatorApplicationLaunchView' => 'applications/meta/view/PhabricatorApplicationLaunchView.php', 1829 1828 'PhabricatorApplicationPanelController' => 'applications/meta/controller/PhabricatorApplicationPanelController.php', 1830 1829 'PhabricatorApplicationProfileMenuItem' => 'applications/search/menuitem/PhabricatorApplicationProfileMenuItem.php', 1831 1830 'PhabricatorApplicationQuery' => 'applications/meta/query/PhabricatorApplicationQuery.php', ··· 2469 2468 'PhabricatorDashboardEditController' => 'applications/dashboard/controller/PhabricatorDashboardEditController.php', 2470 2469 'PhabricatorDashboardIconSet' => 'applications/dashboard/icon/PhabricatorDashboardIconSet.php', 2471 2470 'PhabricatorDashboardInstall' => 'applications/dashboard/storage/PhabricatorDashboardInstall.php', 2472 - 'PhabricatorDashboardInstallController' => 'applications/dashboard/controller/PhabricatorDashboardInstallController.php', 2473 2471 'PhabricatorDashboardLayoutConfig' => 'applications/dashboard/layoutconfig/PhabricatorDashboardLayoutConfig.php', 2474 2472 'PhabricatorDashboardListController' => 'applications/dashboard/controller/PhabricatorDashboardListController.php', 2475 2473 'PhabricatorDashboardManageController' => 'applications/dashboard/controller/PhabricatorDashboardManageController.php', ··· 2837 2835 'PhabricatorHomeApplication' => 'applications/home/application/PhabricatorHomeApplication.php', 2838 2836 'PhabricatorHomeConstants' => 'applications/home/constants/PhabricatorHomeConstants.php', 2839 2837 'PhabricatorHomeController' => 'applications/home/controller/PhabricatorHomeController.php', 2838 + 'PhabricatorHomeLauncherProfileMenuItem' => 'applications/home/menuitem/PhabricatorHomeLauncherProfileMenuItem.php', 2840 2839 'PhabricatorHomeMainController' => 'applications/home/controller/PhabricatorHomeMainController.php', 2841 2840 'PhabricatorHomeManageProfileMenuItem' => 'applications/home/menuitem/PhabricatorHomeManageProfileMenuItem.php', 2842 2841 'PhabricatorHomeMenuController' => 'applications/home/controller/PhabricatorHomeMenuController.php', 2843 2842 'PhabricatorHomeMenuItemController' => 'applications/home/controller/PhabricatorHomeMenuItemController.php', 2844 - 'PhabricatorHomePreferencesSettingsPanel' => 'applications/settings/panel/PhabricatorHomePreferencesSettingsPanel.php', 2845 2843 'PhabricatorHomeProfileMenuEngine' => 'applications/home/engine/PhabricatorHomeProfileMenuEngine.php', 2844 + 'PhabricatorHomeProfileMenuItem' => 'applications/home/menuitem/PhabricatorHomeProfileMenuItem.php', 2846 2845 'PhabricatorHovercardEngineExtension' => 'applications/search/engineextension/PhabricatorHovercardEngineExtension.php', 2847 2846 'PhabricatorHovercardEngineExtensionModule' => 'applications/search/engineextension/PhabricatorHovercardEngineExtensionModule.php', 2848 2847 'PhabricatorIDsSearchEngineExtension' => 'applications/search/engineextension/PhabricatorIDsSearchEngineExtension.php', ··· 6711 6710 'PhabricatorApplicationEditController' => 'PhabricatorApplicationsController', 6712 6711 'PhabricatorApplicationEditHTTPParameterHelpView' => 'AphrontView', 6713 6712 'PhabricatorApplicationEmailCommandsController' => 'PhabricatorApplicationsController', 6714 - 'PhabricatorApplicationLaunchView' => 'AphrontTagView', 6715 6713 'PhabricatorApplicationPanelController' => 'PhabricatorApplicationsController', 6716 6714 'PhabricatorApplicationProfileMenuItem' => 'PhabricatorProfileMenuItem', 6717 6715 'PhabricatorApplicationQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', ··· 7471 7469 'PhabricatorDashboardEditController' => 'PhabricatorDashboardController', 7472 7470 'PhabricatorDashboardIconSet' => 'PhabricatorIconSet', 7473 7471 'PhabricatorDashboardInstall' => 'PhabricatorDashboardDAO', 7474 - 'PhabricatorDashboardInstallController' => 'PhabricatorDashboardController', 7475 7472 'PhabricatorDashboardLayoutConfig' => 'Phobject', 7476 7473 'PhabricatorDashboardListController' => 'PhabricatorDashboardController', 7477 7474 'PhabricatorDashboardManageController' => 'PhabricatorDashboardController', ··· 7893 7890 'PhabricatorHomeApplication' => 'PhabricatorApplication', 7894 7891 'PhabricatorHomeConstants' => 'PhabricatorHomeController', 7895 7892 'PhabricatorHomeController' => 'PhabricatorController', 7893 + 'PhabricatorHomeLauncherProfileMenuItem' => 'PhabricatorProfileMenuItem', 7896 7894 'PhabricatorHomeMainController' => 'PhabricatorHomeController', 7897 7895 'PhabricatorHomeManageProfileMenuItem' => 'PhabricatorProfileMenuItem', 7898 7896 'PhabricatorHomeMenuController' => 'PhabricatorHomeController', 7899 7897 'PhabricatorHomeMenuItemController' => 'PhabricatorHomeController', 7900 - 'PhabricatorHomePreferencesSettingsPanel' => 'PhabricatorSettingsPanel', 7901 7898 'PhabricatorHomeProfileMenuEngine' => 'PhabricatorProfileMenuEngine', 7899 + 'PhabricatorHomeProfileMenuItem' => 'PhabricatorProfileMenuItem', 7902 7900 'PhabricatorHovercardEngineExtension' => 'Phobject', 7903 7901 'PhabricatorHovercardEngineExtensionModule' => 'PhabricatorConfigModule', 7904 7902 'PhabricatorIDsSearchEngineExtension' => 'PhabricatorSearchEngineExtension',
-3
src/applications/celerity/postprocessor/CelerityDefaultPostprocessor.php
··· 209 209 'menu.profile.icon.disabled' => 'rgba(255,255,255,.4)', 210 210 211 211 'menu.main.height' => '44px', 212 - 213 212 'menu.profile.width' => '240px', 214 - 'menu.profile.width.collapsed' => '88px', 215 - 'menu.profile.item.height' => '46px', 216 213 217 214 ); 218 215 }
-1
src/applications/dashboard/application/PhabricatorDashboardApplication.php
··· 30 30 'create/' => 'PhabricatorDashboardEditController', 31 31 'copy/(?:(?P<id>\d+)/)?' => 'PhabricatorDashboardCopyController', 32 32 'edit/(?:(?P<id>\d+)/)?' => 'PhabricatorDashboardEditController', 33 - 'install/(?P<id>\d+)/' => 'PhabricatorDashboardInstallController', 34 33 'uninstall/(?P<id>\d+)/' => 'PhabricatorDashboardUninstallController', 35 34 'addpanel/(?P<id>\d+)/' => 'PhabricatorDashboardAddPanelController', 36 35 'movepanel/(?P<id>\d+)/' => 'PhabricatorDashboardMovePanelController',
-148
src/applications/dashboard/controller/PhabricatorDashboardInstallController.php
··· 1 - <?php 2 - 3 - final class PhabricatorDashboardInstallController 4 - extends PhabricatorDashboardController { 5 - 6 - private $id; 7 - 8 - public function handleRequest(AphrontRequest $request) { 9 - $viewer = $request->getViewer(); 10 - $this->id = $request->getURIData('id'); 11 - 12 - $dashboard = id(new PhabricatorDashboardQuery()) 13 - ->setViewer($viewer) 14 - ->withIDs(array($this->id)) 15 - ->executeOne(); 16 - if (!$dashboard) { 17 - return new Aphront404Response(); 18 - } 19 - $dashboard_phid = $dashboard->getPHID(); 20 - 21 - $object_phid = $request->getStr('objectPHID', $viewer->getPHID()); 22 - switch ($object_phid) { 23 - case PhabricatorHomeApplication::DASHBOARD_DEFAULT: 24 - if (!$viewer->getIsAdmin()) { 25 - return new Aphront404Response(); 26 - } 27 - break; 28 - default: 29 - $object = id(new PhabricatorObjectQuery()) 30 - ->setViewer($viewer) 31 - ->requireCapabilities( 32 - array( 33 - PhabricatorPolicyCapability::CAN_VIEW, 34 - PhabricatorPolicyCapability::CAN_EDIT, 35 - )) 36 - ->withPHIDs(array($object_phid)) 37 - ->executeOne(); 38 - if (!$object) { 39 - return new Aphront404Response(); 40 - } 41 - break; 42 - } 43 - 44 - $installer_phid = $viewer->getPHID(); 45 - $application_class = $request->getStr( 46 - 'applicationClass', 47 - 'PhabricatorHomeApplication'); 48 - 49 - if ($request->isFormPost()) { 50 - $dashboard_install = id(new PhabricatorDashboardInstall()) 51 - ->loadOneWhere( 52 - 'objectPHID = %s AND applicationClass = %s', 53 - $object_phid, 54 - $application_class); 55 - if (!$dashboard_install) { 56 - $dashboard_install = id(new PhabricatorDashboardInstall()) 57 - ->setObjectPHID($object_phid) 58 - ->setApplicationClass($application_class); 59 - } 60 - $dashboard_install 61 - ->setInstallerPHID($installer_phid) 62 - ->setDashboardPHID($dashboard_phid) 63 - ->save(); 64 - return id(new AphrontRedirectResponse()) 65 - ->setURI($this->getRedirectURI($application_class, $object_phid)); 66 - } 67 - 68 - $dialog = $this->newDialog() 69 - ->setTitle(pht('Install Dashboard')) 70 - ->addHiddenInput('objectPHID', $object_phid) 71 - ->addCancelButton($this->getCancelURI($application_class, $object_phid)) 72 - ->addSubmitButton(pht('Install Dashboard')); 73 - 74 - switch ($application_class) { 75 - case 'PhabricatorHomeApplication': 76 - if ($viewer->getPHID() == $object_phid) { 77 - if ($viewer->getIsAdmin()) { 78 - $dialog->setWidth(AphrontDialogView::WIDTH_FORM); 79 - 80 - $form = id(new AphrontFormView()) 81 - ->setUser($viewer) 82 - ->appendRemarkupInstructions( 83 - pht('Choose where to install this dashboard.')) 84 - ->appendChild( 85 - id(new AphrontFormRadioButtonControl()) 86 - ->setName('objectPHID') 87 - ->setValue(PhabricatorHomeApplication::DASHBOARD_DEFAULT) 88 - ->addButton( 89 - PhabricatorHomeApplication::DASHBOARD_DEFAULT, 90 - pht('Default Dashboard for All Users'), 91 - pht( 92 - 'Install this dashboard as the global default dashboard '. 93 - 'for all users. Users can install a personal dashboard '. 94 - 'to replace it. All users who have not configured '. 95 - 'a personal dashboard will be affected by this change.')) 96 - ->addButton( 97 - $viewer->getPHID(), 98 - pht('Personal Home Page Dashboard'), 99 - pht( 100 - 'Install this dashboard as your personal home page '. 101 - 'dashboard. Only you will be affected by this change.'))); 102 - 103 - $dialog->appendChild($form->buildLayoutView()); 104 - } else { 105 - $dialog->appendParagraph( 106 - pht('Install this dashboard on your home page?')); 107 - } 108 - } else { 109 - $dialog->appendParagraph( 110 - pht( 111 - 'Install this dashboard as the home page dashboard for %s?', 112 - phutil_tag( 113 - 'strong', 114 - array(), 115 - $viewer->renderHandle($object_phid)))); 116 - } 117 - break; 118 - default: 119 - throw new Exception( 120 - pht( 121 - 'Unknown dashboard application class "%s"!', 122 - $application_class)); 123 - } 124 - 125 - return $dialog; 126 - } 127 - 128 - private function getCancelURI($application_class, $object_phid) { 129 - $uri = null; 130 - switch ($application_class) { 131 - case 'PhabricatorHomeApplication': 132 - $uri = '/dashboard/view/'.$this->id.'/'; 133 - break; 134 - } 135 - return $uri; 136 - } 137 - 138 - private function getRedirectURI($application_class, $object_phid) { 139 - $uri = null; 140 - switch ($application_class) { 141 - case 'PhabricatorHomeApplication': 142 - $uri = '/'; 143 - break; 144 - } 145 - return $uri; 146 - } 147 - 148 - }
-20
src/applications/dashboard/controller/PhabricatorDashboardManageController.php
··· 156 156 ->setHref($this->getApplicationURI("copy/{$id}/")) 157 157 ->setWorkflow(true)); 158 158 159 - $installed_dashboard = id(new PhabricatorDashboardInstall()) 160 - ->loadOneWhere( 161 - 'objectPHID = %s AND applicationClass = %s', 162 - $viewer->getPHID(), 163 - 'PhabricatorHomeApplication'); 164 - if ($installed_dashboard && 165 - $installed_dashboard->getDashboardPHID() == $dashboard->getPHID()) { 166 - $title_install = pht('Uninstall Dashboard'); 167 - $href_install = "uninstall/{$id}/"; 168 - } else { 169 - $title_install = pht('Install Dashboard'); 170 - $href_install = "install/{$id}/"; 171 - } 172 - $curtain->addAction( 173 - id(new PhabricatorActionView()) 174 - ->setName($title_install) 175 - ->setIcon('fa-wrench') 176 - ->setHref($this->getApplicationURI($href_install)) 177 - ->setWorkflow(true)); 178 - 179 159 return $curtain; 180 160 } 181 161
+1
src/applications/home/constants/PhabricatorHomeConstants.php
··· 3 3 final class PhabricatorHomeConstants 4 4 extends PhabricatorHomeController { 5 5 6 + const ITEM_HOME = 'home.dashboard'; 6 7 const ITEM_LAUNCHER = 'home.launcher'; 7 8 const ITEM_MANAGE = 'home.manage.menu'; 8 9
+32 -53
src/applications/home/controller/PhabricatorHomeController.php
··· 2 2 3 3 abstract class PhabricatorHomeController extends PhabricatorController { 4 4 5 - public function buildNav() { 6 - $user = $this->getRequest()->getUser(); 5 + private $home; 6 + private $profileMenu; 7 7 8 - $nav = new AphrontSideNavFilterView(); 9 - $nav->setBaseURI(new PhutilURI('/')); 8 + public function buildApplicationMenu() { 9 + $menu = $this->newApplicationMenu(); 10 10 11 - $applications = id(new PhabricatorApplicationQuery()) 12 - ->setViewer($user) 13 - ->withInstalled(true) 14 - ->withUnlisted(false) 15 - ->withLaunchable(true) 16 - ->execute(); 11 + $profile_menu = $this->getProfileMenu(); 12 + if ($profile_menu) { 13 + $menu->setProfileMenu($profile_menu); 14 + } 17 15 18 - $pinned = $user->getUserSetting( 19 - PhabricatorPinnedApplicationsSetting::SETTINGKEY); 16 + return $menu; 17 + } 20 18 21 - // Force "Applications" to appear at the bottom. 22 - $meta_app = 'PhabricatorApplicationsApplication'; 23 - $pinned = array_fuse($pinned); 24 - unset($pinned[$meta_app]); 25 - $pinned[$meta_app] = $meta_app; 26 - $applications[$meta_app] = PhabricatorApplication::getByClass($meta_app); 19 + protected function getProfileMenu() { 20 + if (!$this->profileMenu) { 21 + $viewer = $this->getViewer(); 22 + $applications = id(new PhabricatorApplicationQuery()) 23 + ->setViewer($viewer) 24 + ->withClasses(array('PhabricatorHomeApplication')) 25 + ->withInstalled(true) 26 + ->execute(); 27 + $home = head($applications); 28 + if (!$home) { 29 + return null; 30 + } 27 31 28 - $tiles = array(); 32 + $engine = id(new PhabricatorHomeProfileMenuEngine()) 33 + ->setViewer($viewer) 34 + ->setProfileObject($home); 29 35 30 - $home_app = new PhabricatorHomeApplication(); 31 - 32 - $tiles[] = id(new PhabricatorApplicationLaunchView()) 33 - ->setApplication($home_app) 34 - ->addClass('phabricator-application-launch-phone-only') 35 - ->setUser($user); 36 - 37 - foreach ($pinned as $pinned_application) { 38 - if (empty($applications[$pinned_application])) { 39 - continue; 36 + if ($viewer->getPHID()) { 37 + $engine->setCustomPHID($viewer->getPHID()) 38 + ->setMenuType(PhabricatorProfileMenuEngine::MENU_COMBINED); 39 + } else { 40 + $engine->setMenuType(PhabricatorProfileMenuEngine::MENU_GLOBAL); 40 41 } 41 42 42 - $application = $applications[$pinned_application]; 43 - 44 - $tile = id(new PhabricatorApplicationLaunchView()) 45 - ->setApplication($application) 46 - ->setUser($user); 47 - 48 - $tiles[] = $tile; 43 + $this->profileMenu = $engine->buildNavigation(); 49 44 } 50 45 51 - $nav->addCustomBlock( 52 - phutil_tag( 53 - 'div', 54 - array( 55 - 'class' => 'application-tile-group', 56 - ), 57 - $tiles)); 58 - 59 - $nav->addFilter( 60 - '', 61 - pht('Customize Menu...'), 62 - '/settings/panel/home/'); 63 - 64 - $nav->addClass('phabricator-side-menu-home'); 65 - $nav->selectFilter(null); 66 - 67 - return $nav; 46 + return $this->profileMenu; 68 47 } 69 48 70 49 }
+7 -9
src/applications/home/controller/PhabricatorHomeMainController.php
··· 34 34 $content = $this->buildMainResponse(); 35 35 } 36 36 37 - if (!$request->getURIData('only')) { 38 - $nav = $this->buildNav(); 39 - $nav->appendChild( 40 - array( 41 - $content, 42 - id(new PhabricatorGlobalUploadTargetView())->setUser($viewer), 43 - )); 44 - $content = $nav; 45 - } 37 + $nav = $this->getProfileMenu(); 38 + $content = 39 + array( 40 + $content, 41 + id(new PhabricatorGlobalUploadTargetView())->setUser($viewer), 42 + ); 46 43 47 44 return $this->newPage() 48 45 ->setTitle('Phabricator') 49 46 ->addClass('phabricator-home') 47 + ->setNavigation($nav) 50 48 ->appendChild($content); 51 49 52 50 }
+5
src/applications/home/controller/PhabricatorHomeMenuController.php
··· 9 9 public function handleRequest(AphrontRequest $request) { 10 10 $viewer = $request->getViewer(); 11 11 12 + if (!$viewer->getIsAdmin()) { 13 + $uri = '/home/menu/personal/item/configure/'; 14 + return id(new AphrontRedirectResponse())->setURI($uri); 15 + } 16 + 12 17 $menu = id(new PHUIObjectItemListView()) 13 18 ->setUser($viewer); 14 19
+1 -2
src/applications/home/controller/PhabricatorHomeMenuItemController.php
··· 24 24 ->setProfileObject($home_app) 25 25 ->setCustomPHID($custom_phid) 26 26 ->setMenuType($menu) 27 - ->setController($this) 28 - ->setShowNavigation(false); 27 + ->setController($this); 29 28 30 29 return $engine->buildResponse(); 31 30 }
+12
src/applications/home/engine/PhabricatorHomeProfileMenuEngine.php
··· 30 30 ->withLaunchable(true) 31 31 ->execute(); 32 32 33 + // Default Home Dashboard 34 + $items[] = $this->newItem() 35 + ->setBuiltinKey(PhabricatorHomeConstants::ITEM_HOME) 36 + ->setMenuItemKey( 37 + PhabricatorHomeProfileMenuItem::MENUITEMKEY); 38 + 33 39 foreach ($applications as $application) { 34 40 if (!$application->isPinnedByDefault($viewer)) { 35 41 continue; ··· 45 51 ->setMenuItemKey(PhabricatorApplicationProfileMenuItem::MENUITEMKEY) 46 52 ->setMenuItemProperties($properties); 47 53 } 54 + 55 + // Hotlink to More Applications Launcher... 56 + $items[] = $this->newItem() 57 + ->setBuiltinKey(PhabricatorHomeConstants::ITEM_LAUNCHER) 58 + ->setMenuItemKey( 59 + PhabricatorHomeLauncherProfileMenuItem::MENUITEMKEY); 48 60 49 61 // Single Manage Item, switches URI based on admin/user 50 62 $items[] = $this->newItem()
+68
src/applications/home/menuitem/PhabricatorHomeLauncherProfileMenuItem.php
··· 1 + <?php 2 + 3 + final class PhabricatorHomeLauncherProfileMenuItem 4 + extends PhabricatorProfileMenuItem { 5 + 6 + const MENUITEMKEY = 'home.launcher.menu'; 7 + 8 + public function getMenuItemTypeName() { 9 + return pht('More Applications'); 10 + } 11 + 12 + private function getDefaultName() { 13 + return pht('More Applications'); 14 + } 15 + 16 + public function canHideMenuItem( 17 + PhabricatorProfileMenuItemConfiguration $config) { 18 + return false; 19 + } 20 + 21 + public function canMakeDefault( 22 + PhabricatorProfileMenuItemConfiguration $config) { 23 + return false; 24 + } 25 + 26 + public function getDisplayName( 27 + PhabricatorProfileMenuItemConfiguration $config) { 28 + $name = $config->getMenuItemProperty('name'); 29 + 30 + if (strlen($name)) { 31 + return $name; 32 + } 33 + 34 + return $this->getDefaultName(); 35 + } 36 + 37 + public function buildEditEngineFields( 38 + PhabricatorProfileMenuItemConfiguration $config) { 39 + return array( 40 + id(new PhabricatorTextEditField()) 41 + ->setKey('name') 42 + ->setLabel(pht('Name')) 43 + ->setPlaceholder($this->getDefaultName()) 44 + ->setValue($config->getMenuItemProperty('name')), 45 + ); 46 + } 47 + 48 + protected function newNavigationMenuItems( 49 + PhabricatorProfileMenuItemConfiguration $config) { 50 + $viewer = $this->getViewer(); 51 + 52 + if ($viewer->isLoggedIn()) { 53 + $name = $this->getDisplayName($config); 54 + $icon = 'fa-globe'; 55 + $href = '/applications/'; 56 + 57 + $item = $this->newItem() 58 + ->setHref($href) 59 + ->setName($name) 60 + ->setIcon($icon); 61 + } 62 + 63 + return array( 64 + $item, 65 + ); 66 + } 67 + 68 + }
+2 -6
src/applications/home/menuitem/PhabricatorHomeManageProfileMenuItem.php
··· 10 10 } 11 11 12 12 private function getDefaultName() { 13 - return pht('Manage'); 13 + return pht('Edit Menu'); 14 14 } 15 15 16 16 public function canHideMenuItem( ··· 50 50 $viewer = $this->getViewer(); 51 51 52 52 if ($viewer->isLoggedIn()) { 53 - $admin = $viewer->getIsAdmin(); 54 53 $name = $this->getDisplayName($config); 55 54 $icon = 'fa-pencil'; 56 - $href = '/home/menu/personal/item/configure/'; 57 - if ($admin) { 58 - $href = '/home/menu/'; 59 - } 55 + $href = '/home/menu/'; 60 56 61 57 $item = $this->newItem() 62 58 ->setHref($href)
+68
src/applications/home/menuitem/PhabricatorHomeProfileMenuItem.php
··· 1 + <?php 2 + 3 + final class PhabricatorHomeProfileMenuItem 4 + extends PhabricatorProfileMenuItem { 5 + 6 + const MENUITEMKEY = 'home.dashboard'; 7 + 8 + public function getMenuItemTypeName() { 9 + return pht('Home'); 10 + } 11 + 12 + private function getDefaultName() { 13 + return pht('Home'); 14 + } 15 + 16 + public function canHideMenuItem( 17 + PhabricatorProfileMenuItemConfiguration $config) { 18 + return false; 19 + } 20 + 21 + public function canMakeDefault( 22 + PhabricatorProfileMenuItemConfiguration $config) { 23 + return true; 24 + } 25 + 26 + public function getDisplayName( 27 + PhabricatorProfileMenuItemConfiguration $config) { 28 + $name = $config->getMenuItemProperty('name'); 29 + 30 + if (strlen($name)) { 31 + return $name; 32 + } 33 + 34 + return $this->getDefaultName(); 35 + } 36 + 37 + public function buildEditEngineFields( 38 + PhabricatorProfileMenuItemConfiguration $config) { 39 + return array( 40 + id(new PhabricatorTextEditField()) 41 + ->setKey('name') 42 + ->setLabel(pht('Name')) 43 + ->setPlaceholder($this->getDefaultName()) 44 + ->setValue($config->getMenuItemProperty('name')), 45 + ); 46 + } 47 + 48 + protected function newNavigationMenuItems( 49 + PhabricatorProfileMenuItemConfiguration $config) { 50 + $viewer = $this->getViewer(); 51 + 52 + if ($viewer->isLoggedIn()) { 53 + $name = $this->getDisplayName($config); 54 + $icon = 'fa-home'; 55 + $href = '/home/'; 56 + 57 + $item = $this->newItem() 58 + ->setHref($href) 59 + ->setName($name) 60 + ->setIcon($icon); 61 + } 62 + 63 + return array( 64 + $item, 65 + ); 66 + } 67 + 68 + }
-69
src/applications/meta/view/PhabricatorApplicationLaunchView.php
··· 1 - <?php 2 - 3 - final class PhabricatorApplicationLaunchView extends AphrontTagView { 4 - 5 - private $application; 6 - 7 - public function setApplication(PhabricatorApplication $application) { 8 - $this->application = $application; 9 - return $this; 10 - } 11 - 12 - protected function getTagName() { 13 - return $this->application ? 'a' : 'div'; 14 - } 15 - 16 - protected function getTagAttributes() { 17 - $application = $this->application; 18 - return array( 19 - 'class' => array('phabricator-application-launch-container'), 20 - 'href' => $application ? $application->getBaseURI() : null, 21 - ); 22 - } 23 - 24 - protected function getTagContent() { 25 - $application = $this->application; 26 - 27 - require_celerity_resource('phabricator-application-launch-view-css'); 28 - 29 - $content = array(); 30 - $icon = null; 31 - if ($application) { 32 - $content[] = phutil_tag( 33 - 'span', 34 - array( 35 - 'class' => 'phabricator-application-launch-name', 36 - ), 37 - $application->getName()); 38 - 39 - $content[] = phutil_tag( 40 - 'span', 41 - array( 42 - 'class' => 'phabricator-application-launch-description', 43 - ), 44 - $application->getShortDescription()); 45 - 46 - $classes = array(); 47 - $classes[] = 'phabricator-application-launch-icon'; 48 - 49 - $styles = array(); 50 - $classes[] = $application->getIcon(); 51 - $classes[] = 'phui-icon-view'; 52 - $classes[] = 'phui-font-fa'; 53 - 54 - $icon = phutil_tag( 55 - 'span', 56 - array( 57 - 'class' => implode(' ', $classes), 58 - 'style' => nonempty(implode('; ', $styles), null), 59 - ), 60 - ''); 61 - } 62 - 63 - return array( 64 - $icon, 65 - $content, 66 - ); 67 - } 68 - 69 - }
+59
src/applications/people/controller/PhabricatorPeopleProfileController.php
··· 60 60 return $crumbs; 61 61 } 62 62 63 + public function buildProfileHeader() { 64 + $user = $this->user; 65 + $viewer = $this->getViewer(); 66 + 67 + $profile = $user->loadUserProfile(); 68 + $picture = $user->getProfileImageURI(); 69 + 70 + $profile_icon = PhabricatorPeopleIconSet::getIconIcon($profile->getIcon()); 71 + $profile_title = $profile->getDisplayTitle(); 72 + 73 + $roles = array(); 74 + if ($user->getIsAdmin()) { 75 + $roles[] = pht('Administrator'); 76 + } 77 + if ($user->getIsDisabled()) { 78 + $roles[] = pht('Disabled'); 79 + } 80 + if (!$user->getIsApproved()) { 81 + $roles[] = pht('Not Approved'); 82 + } 83 + if ($user->getIsSystemAgent()) { 84 + $roles[] = pht('Bot'); 85 + } 86 + if ($user->getIsMailingList()) { 87 + $roles[] = pht('Mailing List'); 88 + } 89 + 90 + $tag = null; 91 + if ($roles) { 92 + $tag = id(new PHUITagView()) 93 + ->setName(implode(', ', $roles)) 94 + ->addClass('project-view-header-tag') 95 + ->setType(PHUITagView::TYPE_SHADE); 96 + } 97 + 98 + $header = id(new PHUIHeaderView()) 99 + ->setHeader(array($user->getFullName(), $tag)) 100 + ->setImage($picture) 101 + ->setProfileHeader(true); 102 + 103 + if ($user->getIsDisabled()) { 104 + $header->setStatus('fa-ban', 'red', pht('Disabled')); 105 + } else { 106 + $header->setStatus($profile_icon, 'bluegrey', $profile_title); 107 + } 108 + 109 + $can_edit = PhabricatorPolicyFilter::hasCapability( 110 + $viewer, 111 + $user, 112 + PhabricatorPolicyCapability::CAN_EDIT); 113 + 114 + if ($can_edit) { 115 + $id = $user->getID(); 116 + $header->setImageEditURL($this->getApplicationURI("picture/{$id}/")); 117 + } 118 + 119 + return $header; 120 + } 121 + 63 122 }
+3 -14
src/applications/people/controller/PhabricatorPeopleProfileManageController.php
··· 23 23 } 24 24 25 25 $this->setUser($user); 26 - 27 - $profile = $user->loadUserProfile(); 28 - $picture = $user->getProfileImageURI(); 29 - 30 - $profile_icon = PhabricatorPeopleIconSet::getIconIcon($profile->getIcon()); 31 - $profile_icon = id(new PHUIIconView()) 32 - ->setIcon($profile_icon); 33 - $profile_title = $profile->getDisplayTitle(); 34 - 35 - $header = id(new PHUIHeaderView()) 36 - ->setHeader($user->getFullName()) 37 - ->setSubheader(array($profile_icon, $profile_title)) 38 - ->setImage($picture) 39 - ->setProfileHeader(true); 26 + $header = $this->buildProfileHeader(); 40 27 41 28 $curtain = $this->buildCurtain($user); 42 29 $properties = $this->buildPropertyView($user); ··· 51 38 52 39 $manage = id(new PHUITwoColumnView()) 53 40 ->setHeader($header) 41 + ->addClass('project-view-home') 54 42 ->setCurtain($curtain) 55 43 ->addPropertySection(pht('Details'), $properties); 44 + require_celerity_resource('project-view-css'); 56 45 57 46 return $this->newPage() 58 47 ->setTitle(
+3 -32
src/applications/people/controller/PhabricatorPeopleProfileViewController.php
··· 23 23 } 24 24 25 25 $this->setUser($user); 26 - 27 - $profile = $user->loadUserProfile(); 28 - $picture = $user->getProfileImageURI(); 29 - 30 - $profile_icon = PhabricatorPeopleIconSet::getIconIcon($profile->getIcon()); 31 - $profile_icon = id(new PHUIIconView()) 32 - ->setIcon($profile_icon); 33 - $profile_title = $profile->getDisplayTitle(); 34 - 35 - $header = id(new PHUIHeaderView()) 36 - ->setHeader($user->getFullName()) 37 - ->setSubheader(array($profile_icon, $profile_title)) 38 - ->setImage($picture) 39 - ->setProfileHeader(true); 40 - 41 - $can_edit = PhabricatorPolicyFilter::hasCapability( 42 - $viewer, 43 - $user, 44 - PhabricatorPolicyCapability::CAN_EDIT); 45 - 46 - if ($can_edit) { 47 - $id = $user->getID(); 48 - $header->setImageEditURL($this->getApplicationURI("picture/{$id}/")); 49 - } 26 + $header = $this->buildProfileHeader(); 50 27 51 28 $properties = $this->buildPropertyView($user); 52 29 $name = $user->getUsername(); ··· 158 135 } 159 136 160 137 } else { 161 - $error = id(new PHUIBoxView()) 162 - ->addClass('mlb') 163 - ->appendChild(pht('User does not belong to any projects.')); 164 138 $list = id(new PHUIInfoView()) 165 139 ->setSeverity(PHUIInfoView::SEVERITY_NODATA) 166 - ->appendChild($error); 140 + ->appendChild(pht('User does not belong to any projects.')); 167 141 } 168 142 169 143 $box = id(new PHUIObjectBoxView()) ··· 302 276 } 303 277 } 304 278 } else { 305 - $error = id(new PHUIBoxView()) 306 - ->addClass('mlb') 307 - ->appendChild(pht('User does not have any badges.')); 308 279 $flex = id(new PHUIInfoView()) 309 280 ->setSeverity(PHUIInfoView::SEVERITY_NODATA) 310 - ->appendChild($error); 281 + ->appendChild(pht('User does not have any badges.')); 311 282 } 312 283 313 284 // Best option?
+1 -1
src/applications/project/application/PhabricatorProjectApplication.php
··· 7 7 } 8 8 9 9 public function getShortDescription() { 10 - return pht('Get Organized'); 10 + return pht('Projects, Tags, and Teams'); 11 11 } 12 12 13 13 public function isPinnedByDefault(PhabricatorUser $viewer) {
+11 -27
src/applications/project/menuitem/PhabricatorProjectPointsProfileMenuItem.php
··· 68 68 ->setLimit($limit + 1) 69 69 ->execute(); 70 70 71 + $error = array(); 71 72 if (count($tasks) > $limit) { 72 - return $this->renderError( 73 + $error[] = 73 74 pht( 74 - 'Too many tasks to compute statistics for (more than %s).', 75 - new PhutilNumber($limit))); 75 + 'Too many tasks (%s).', 76 + new PhutilNumber($limit)); 76 77 } 77 78 78 79 if (!$tasks) { 79 - return $this->renderError( 80 - pht( 81 - 'This milestone has no tasks yet.')); 80 + $error[] = pht('This milestone has no tasks.'); 82 81 } 83 82 84 83 $statuses = array(); ··· 111 110 } 112 111 113 112 if ($no_points == count($tasks)) { 114 - return $this->renderError( 115 - pht('No tasks have assigned point values.')); 113 + $error[] = pht('No tasks have points assigned.'); 116 114 } 117 - 118 115 119 116 if (!$points_total) { 120 - return $this->renderError( 121 - pht('All tasks with assigned point values are worth zero points.')); 117 + $error[] = pht('No tasks have positive points.'); 122 118 } 123 119 124 120 $label = pht( ··· 158 154 ->setTooltip($tooltip); 159 155 } 160 156 157 + if ($error) { 158 + $bar->setLabel(head($error)); 159 + } 160 + 161 161 $bar = phutil_tag( 162 162 'div', 163 163 array( ··· 167 167 168 168 $item = $this->newItem() 169 169 ->appendChild($bar); 170 - 171 - return array( 172 - $item, 173 - ); 174 - } 175 - 176 - private function renderError($message) { 177 - $message = phutil_tag( 178 - 'div', 179 - array( 180 - 'class' => 'phui-profile-menu-error', 181 - ), 182 - $message); 183 - 184 - $item = $this->newItem() 185 - ->appendChild($message); 186 170 187 171 return array( 188 172 $item,
-1
src/applications/search/engine/PhabricatorProfileMenuEngine.php
··· 254 254 if ($this->navigation) { 255 255 return $this->navigation; 256 256 } 257 - 258 257 $nav = id(new AphrontSideNavFilterView()) 259 258 ->setIsProfileMenu(true) 260 259 ->setBaseURI(new PhutilURI($this->getItemURI('')));
+5
src/applications/search/menuitem/PhabricatorApplicationProfileMenuItem.php
··· 88 88 ->setName($this->getDisplayName($config)) 89 89 ->setIcon($app->getIcon()); 90 90 91 + // Don't show tooltip if they've set a custom name 92 + if (strlen(($config->getMenuItemProperty('name')))) { 93 + $item->setTooltip($app->getShortDescription()); 94 + } 95 + 91 96 return array( 92 97 $item, 93 98 );
-223
src/applications/settings/panel/PhabricatorHomePreferencesSettingsPanel.php
··· 1 - <?php 2 - 3 - final class PhabricatorHomePreferencesSettingsPanel 4 - extends PhabricatorSettingsPanel { 5 - 6 - public function getPanelKey() { 7 - return 'home'; 8 - } 9 - 10 - public function getPanelName() { 11 - return pht('Home Page'); 12 - } 13 - 14 - public function getPanelGroupKey() { 15 - return PhabricatorSettingsApplicationsPanelGroup::PANELGROUPKEY; 16 - } 17 - 18 - public function isTemplatePanel() { 19 - return true; 20 - } 21 - 22 - public function processRequest(AphrontRequest $request) { 23 - $viewer = $this->getViewer(); 24 - $preferences = $this->getPreferences(); 25 - 26 - $pinned_key = PhabricatorPinnedApplicationsSetting::SETTINGKEY; 27 - $pinned = $preferences->getSettingValue($pinned_key); 28 - 29 - $apps = id(new PhabricatorApplicationQuery()) 30 - ->setViewer($viewer) 31 - ->withInstalled(true) 32 - ->withUnlisted(false) 33 - ->withLaunchable(true) 34 - ->execute(); 35 - 36 - $app_list = array(); 37 - foreach ($pinned as $app) { 38 - if (isset($apps[$app])) { 39 - $app_list[$app] = $apps[$app]; 40 - } 41 - } 42 - 43 - if ($request->getBool('reset')) { 44 - if ($request->isFormPost()) { 45 - $this->writePinnedApplications($preferences, null); 46 - return id(new AphrontRedirectResponse()) 47 - ->setURI($this->getPanelURI()); 48 - } 49 - 50 - return $this->newDialog() 51 - ->setTitle(pht('Reset Applications')) 52 - ->addHiddenInput('reset', 'true') 53 - ->appendParagraph( 54 - pht('Reset pinned applications to their defaults?')) 55 - ->addSubmitButton(pht('Reset Applications')) 56 - ->addCancelButton($this->getPanelURI()); 57 - } 58 - 59 - 60 - if ($request->getBool('add')) { 61 - $options = array(); 62 - foreach ($apps as $app) { 63 - $options[get_class($app)] = $app->getName(); 64 - } 65 - asort($options); 66 - 67 - unset($options['PhabricatorApplicationsApplication']); 68 - 69 - if ($request->isFormPost()) { 70 - $pins = $request->getArr('pin'); 71 - $phid = head($pins); 72 - $app = id(new PhabricatorApplicationQuery()) 73 - ->setViewer($viewer) 74 - ->withPHIDs(array($phid)) 75 - ->executeOne(); 76 - if ($app) { 77 - $pin = get_class($app); 78 - } else { 79 - // This likely means the user submitted an empty form 80 - // which will cause nothing to happen. 81 - $pin = ''; 82 - } 83 - if (isset($options[$pin]) && !in_array($pin, $pinned)) { 84 - $pinned[] = $pin; 85 - 86 - $this->writePinnedApplications($preferences, $pinned); 87 - 88 - return id(new AphrontRedirectResponse()) 89 - ->setURI($this->getPanelURI()); 90 - } 91 - } 92 - 93 - $options_control = id(new AphrontFormTokenizerControl()) 94 - ->setName('pin') 95 - ->setLabel(pht('Application')) 96 - ->setDatasource(new PhabricatorApplicationDatasource()) 97 - ->setLimit(1); 98 - 99 - $form = id(new AphrontFormView()) 100 - ->setViewer($viewer) 101 - ->addHiddenInput('add', 'true') 102 - ->appendRemarkupInstructions( 103 - pht('Choose an application to pin to your home page.')) 104 - ->appendControl($options_control); 105 - 106 - return $this->newDialog() 107 - ->setWidth(AphrontDialogView::WIDTH_FORM) 108 - ->setTitle(pht('Pin Application')) 109 - ->appendChild($form->buildLayoutView()) 110 - ->addSubmitButton(pht('Pin Application')) 111 - ->addCancelButton($this->getPanelURI()); 112 - } 113 - 114 - $unpin = $request->getStr('unpin'); 115 - if ($unpin) { 116 - $app = idx($apps, $unpin); 117 - if ($app) { 118 - if ($request->isFormPost()) { 119 - $pinned = array_diff($pinned, array($unpin)); 120 - 121 - $this->writePinnedApplications($preferences, $pinned); 122 - 123 - return id(new AphrontRedirectResponse()) 124 - ->setURI($this->getPanelURI()); 125 - } 126 - 127 - return $this->newDialog() 128 - ->setTitle(pht('Unpin Application')) 129 - ->addHiddenInput('unpin', $unpin) 130 - ->appendParagraph( 131 - pht( 132 - 'Unpin the %s application from your home page?', 133 - phutil_tag('strong', array(), $app->getName()))) 134 - ->addSubmitButton(pht('Unpin Application')) 135 - ->addCancelButton($this->getPanelURI()); 136 - } 137 - } 138 - 139 - $order = $request->getStrList('order'); 140 - if ($order && $request->validateCSRF()) { 141 - $this->writePinnedApplications($preferences, $order); 142 - 143 - return id(new AphrontRedirectResponse()) 144 - ->setURI($this->getPanelURI()); 145 - } 146 - 147 - $list_id = celerity_generate_unique_node_id(); 148 - 149 - $list = id(new PHUIObjectItemListView()) 150 - ->setViewer($viewer) 151 - ->setID($list_id) 152 - ->setDrag(true); 153 - 154 - Javelin::initBehavior( 155 - 'reorder-applications', 156 - array( 157 - 'listID' => $list_id, 158 - 'panelURI' => $this->getPanelURI(), 159 - )); 160 - 161 - foreach ($app_list as $key => $application) { 162 - if ($key == 'PhabricatorApplicationsApplication') { 163 - continue; 164 - } 165 - 166 - $icon = $application->getIcon(); 167 - if (!$icon) { 168 - $icon = 'fa-globe'; 169 - } 170 - 171 - $item = id(new PHUIObjectItemView()) 172 - ->setHeader($application->getName()) 173 - ->setImageIcon($icon) 174 - ->setGrippable(true); 175 - 176 - $item->addAction( 177 - id(new PHUIListItemView()) 178 - ->setIcon('fa-times') 179 - ->setHref($this->getPanelURI().'?unpin='.$key) 180 - ->setWorkflow(true)); 181 - 182 - $item->addSigil('pinned-application'); 183 - $item->setMetadata( 184 - array( 185 - 'applicationClass' => $key, 186 - )); 187 - 188 - $list->addItem($item); 189 - } 190 - 191 - $header = id(new PHUIHeaderView()) 192 - ->setHeader(pht('Pinned Applications')) 193 - ->addActionLink( 194 - id(new PHUIButtonView()) 195 - ->setTag('a') 196 - ->setText(pht('Pin Application')) 197 - ->setHref($this->getPanelURI().'?add=true') 198 - ->setWorkflow(true) 199 - ->setIcon('fa-thumb-tack')) 200 - ->addActionLink( 201 - id(new PHUIButtonView()) 202 - ->setTag('a') 203 - ->setText(pht('Reset to Defaults')) 204 - ->setHref($this->getPanelURI().'?reset=true') 205 - ->setWorkflow(true) 206 - ->setIcon('fa-recycle')); 207 - 208 - $box = id(new PHUIObjectBoxView()) 209 - ->setHeader($header) 210 - ->setObjectList($list); 211 - 212 - return $box; 213 - } 214 - 215 - private function writePinnedApplications( 216 - PhabricatorUserPreferences $preferences, 217 - $pinned) { 218 - 219 - $pinned_key = PhabricatorPinnedApplicationsSetting::SETTINGKEY; 220 - $this->writeSetting($preferences, $pinned_key, $pinned); 221 - } 222 - 223 - }
+1 -2
src/view/layout/AphrontSideNavFilterView.php
··· 204 204 205 205 private function renderFlexNav() { 206 206 require_celerity_resource('phabricator-nav-view-css'); 207 - require_celerity_resource('phui-profile-menu-css'); 208 207 209 208 $nav_classes = array(); 210 209 $nav_classes[] = 'phabricator-nav'; ··· 310 309 $classes[] = 'phui-navigation-shell'; 311 310 312 311 if ($this->getIsProfileMenu()) { 313 - $classes[] = 'phui-profile-menu'; 312 + $classes[] = 'phui-profile-menu phui-basic-nav'; 314 313 } else { 315 314 $classes[] = 'phui-basic-nav'; 316 315 }
+17 -1
src/view/phui/PHUIListItemView.php
··· 30 30 private $hideInApplicationMenu; 31 31 private $icons = array(); 32 32 private $openInNewWindow = false; 33 + private $tooltip; 33 34 34 35 public function setOpenInNewWindow($open_in_new_window) { 35 36 $this->openInNewWindow = $open_in_new_window; ··· 176 177 return $this->icons; 177 178 } 178 179 180 + public function setTooltip($tooltip) { 181 + $this->tooltip = $tooltip; 182 + return $this; 183 + } 184 + 179 185 protected function getTagName() { 180 186 return 'li'; 181 187 } ··· 185 191 $classes[] = 'phui-list-item-view'; 186 192 $classes[] = 'phui-list-item-'.$this->type; 187 193 188 - if ($this->icon) { 194 + if ($this->icon || $this->profileImage) { 189 195 $classes[] = 'phui-list-item-has-icon'; 190 196 } 191 197 ··· 230 236 'align' => 'E', 231 237 ); 232 238 } else { 239 + if ($this->tooltip) { 240 + Javelin::initBehavior('phabricator-tooltips'); 241 + $sigil = 'has-tooltip'; 242 + $meta = array( 243 + 'tip' => $this->tooltip, 244 + 'align' => 'E', 245 + 'size' => 300, 246 + ); 247 + } 248 + 233 249 $external = null; 234 250 if ($this->isExternal) { 235 251 $external = " \xE2\x86\x97";
+8 -1
webroot/rsrc/css/aphront/tooltip.css
··· 5 5 .jx-tooltip-container { 6 6 position: absolute; 7 7 padding: 5px; 8 + opacity: 1; 9 + transition: opacity 0.25s ease; 10 + } 11 + 12 + .jx-tooltip-hidden { 13 + opacity: 0; 8 14 } 9 15 10 16 .jx-tooltip-inner { 11 17 position: relative; 12 - background: rgba({$alphablack}, .9); 18 + background: #000; 13 19 border-radius: 3px; 14 20 } 15 21 16 22 .jx-tooltip { 17 23 color: #f9f9f9; 18 24 font-size: {$normalfontsize}; 25 + -webkit-font-smoothing: antialiased; 19 26 padding: 6px 8px; 20 27 overflow: hidden; 21 28 white-space: pre-wrap;
+1 -5
webroot/rsrc/css/application/base/main-menu-view.css
··· 164 164 right: 0; 165 165 position: absolute; 166 166 font-size: {$normalfontsize}; 167 - border-width: 1px; 168 - border-color: {$lightblueborder}; 169 - border-radius: 3px; 170 - border-style: solid; 167 + border: none; 171 168 background-color: #fff; 172 169 height: 28px; 173 170 padding: 3px 28px 3px 52px; ··· 186 183 background: #fff; 187 184 opacity: 1; 188 185 color: {$darkbluetext}; 189 - border-color: {$sky}; 190 186 box-shadow: none; 191 187 } 192 188
-103
webroot/rsrc/css/application/base/phabricator-application-launch-view.css
··· 1 - /** 2 - * @provides phabricator-application-launch-view-css 3 - */ 4 - 5 - 6 - /* - Application List ---------------------------------------------------------- 7 - 8 - Spacing container for the list of large application buttons. 9 - 10 - */ 11 - 12 - 13 - .application-tile-group { 14 - overflow: hidden; 15 - } 16 - 17 - 18 - /* - Application Launch Button ------------------------------------------------- 19 - 20 - Spacing container for the list of large application buttons. 21 - 22 - */ 23 - 24 - a.phabricator-application-launch-container, 25 - div.phabricator-application-launch-container { 26 - display: block; 27 - float: left; 28 - overflow: hidden; 29 - position: relative; 30 - text-decoration: none; 31 - width: 100%; 32 - border-top-right-radius: 3px; 33 - border-bottom-right-radius: 3px; 34 - padding: 4px 0; 35 - } 36 - 37 - .device-phone div.phabricator-application-launch-container { 38 - display: none; 39 - } 40 - 41 - .phabricator-application-launch-icon { 42 - position: absolute; 43 - width: 38px; 44 - height: 18px; 45 - top: 6px; 46 - left: 0; 47 - font-size: 18px; 48 - text-align: center; 49 - vertical-align: bottom; 50 - color: {$darkbluetext}; 51 - text-shadow: {$whitetextshadow}; 52 - } 53 - 54 - .device-desktop a.phabricator-application-launch-container:hover { 55 - background-color: rgba({$alphablack},.07); 56 - text-decoration: none; 57 - } 58 - 59 - .device-desktop a.phabricator-application-launch-container:hover 60 - .phabricator-application-launch-icon { 61 - color: {$sky}; 62 - } 63 - 64 - .phabricator-application-launch-name { 65 - display: block; 66 - font-weight: bold; 67 - color: {$darkbluetext}; 68 - font-size: {$normalfontsize}; 69 - margin-left: 36px; 70 - } 71 - 72 - .phabricator-application-launch-description { 73 - color: {$bluetext}; 74 - font-size: {$smallestfontsize}; 75 - margin-left: 36px; 76 - text-overflow: ellipsis; 77 - width: 150px; 78 - overflow: hidden; 79 - white-space: nowrap; 80 - display: inline-block; 81 - padding: 2px 0 0 0; 82 - } 83 - 84 - .phabricator-application-launch-attention { 85 - position: absolute; 86 - top: 8px; 87 - right: 8px; 88 - color: {$darkbluetext}; 89 - font-weight: bold; 90 - font-size: {$smallerfontsize}; 91 - } 92 - 93 - .phabricator-application-attention-count { 94 - color: {$fire}; 95 - } 96 - 97 - a.phabricator-application-launch-phone-only { 98 - display: none; 99 - } 100 - 101 - .device-phone a.phabricator-application-launch-phone-only { 102 - display: block; 103 - }
+1 -1
webroot/rsrc/css/application/base/phui-theme.css
··· 5 5 /*--- Header Colors ----------------------------------------------------------*/ 6 6 7 7 .phui-theme-blindigo .phabricator-main-menu-background { 8 - background: #41506e; 8 + background: #4a5f88; 9 9 } 10 10 11 11 .phui-theme-dark .phabricator-main-menu-background {
+5 -1
webroot/rsrc/css/application/search/application-search-view.css
··· 6 6 background-color: #fff; 7 7 } 8 8 9 + .application-search-view .phui-crumbs-view { 10 + background-color: #fff; 11 + } 12 + 9 13 .application-search-view .application-search-results.phui-object-box { 10 14 margin: 0; 11 15 padding: 0 16px 24px; ··· 17 21 } 18 22 19 23 .application-search-view .application-search-results .phui-profile-header { 20 - padding: 16px 8px; 24 + padding: 22px 8px; 21 25 border-bottom: 1px solid {$thinblueborder}; 22 26 } 23 27
+1 -1
webroot/rsrc/css/phui/calendar/phui-calendar-list.css
··· 66 66 67 67 .phui-calendar-list-item-empty { 68 68 color: {$lightgreytext}; 69 - padding: 0 12px; 69 + padding: 0; 70 70 font-style: italic; 71 71 } 72 72
+42 -14
webroot/rsrc/css/phui/phui-basic-nav-view.css
··· 19 19 display: table-cell; 20 20 position: relative; 21 21 vertical-align: top; 22 - width: {$menu.profile.width}; 23 - max-width: {$menu.profile.width}; 24 22 margin-top: 0; 25 23 overflow: hidden; 26 24 } 27 25 26 + .phabricator-home.device-phone .phabricator-nav-content { 27 + display: none; 28 + } 29 + 30 + .phabricator-home .phui-basic-nav .phabricator-side-menu { 31 + background: transparent; 32 + } 33 + 28 34 .phui-basic-nav.phui-navigation-shell .phabricator-nav-local { 29 35 width: 205px; 30 - padding-top: 4px; 36 + padding-top: 12px; 31 37 padding-right: 8px; 32 38 } 33 39 34 - .phui-basic-nav .phabricator-side-menu { 35 - background-color: {$page.sidenav}; 36 - } 37 - 38 40 .phui-two-column-view .phui-basic-nav.phui-navigation-shell 39 41 .phabricator-nav-local { 40 - width: {$menu.profile.width}; 41 - max-width: {$menu.profile.width}; 42 42 padding-right: 0; 43 43 padding-top: 0; 44 44 } ··· 55 55 display: block; 56 56 white-space: nowrap; 57 57 text-decoration: none; 58 - font-size: 13px; 59 58 -webkit-font-smoothing: antialiased; 60 59 } 61 60 62 61 .phui-basic-nav .phabricator-side-menu .phui-list-item-href { 63 62 display: block; 64 - padding: 6px 8px 6px 24px; 63 + padding: 6px 8px 6px 20px; 65 64 color: {$darkbluetext}; 66 65 border-top-right-radius: 3px; 67 66 border-bottom-right-radius: 3px; ··· 69 68 text-overflow: ellipsis 70 69 } 71 70 71 + .phui-basic-nav .phabricator-side-menu .phui-list-item-has-icon 72 + .phui-list-item-href { 73 + padding-left: 12px; 74 + } 75 + 72 76 .phui-basic-nav .phabricator-side-menu .phui-list-item-icon { 73 - margin-left: -12px; 77 + margin-left: -4px; 74 78 text-align: center; 75 - width: 24px; 79 + width: 30px; 80 + } 81 + 82 + .phui-basic-nav .phabricator-side-menu .phui-divider { 83 + border-bottom: 1px solid rgba({$alphablack},.08); 84 + margin: 0 0 8px 8px; 85 + padding: 8px 0 0 0; 86 + } 87 + 88 + .phui-basic-nav .phabricator-side-menu .phui-list-item-icon.phuihead-small { 89 + display: inline-block; 90 + height: 16px; 91 + width: 16px; 92 + border-radius: 3px; 93 + background-size: 100%; 94 + margin: -2px 7px -2px 3px; 76 95 } 77 96 78 97 .phui-basic-nav .phabricator-side-menu .phui-list-item-selected { ··· 91 110 92 111 .phui-basic-nav .phabricator-side-menu .phui-list-item-selected 93 112 .phui-list-item-href { 94 - padding-left: 20px; 113 + margin-left: -4px; 95 114 } 96 115 97 116 .phui-basic-nav .phabricator-side-menu .phui-list-item-type-label { ··· 108 127 text-decoration: none; 109 128 background-color: rgba({$alphablack},.07); 110 129 } 130 + 131 + .phui-basic-nav .phabricator-side-menu .phui-list-item-type-link + 132 + .phui-list-item-type-label { 133 + margin-top: 12px; 134 + } 135 + 136 + .phui-basic-nav .phui-profile-segment-bar { 137 + padding: 4px 4px 8px 12px; 138 + }
+3 -2
webroot/rsrc/css/phui/phui-box.css
··· 49 49 50 50 .phui-object-box.phui-box-blue div.phui-info-severity-nodata, 51 51 .phui-object-box.phui-box-grey div.phui-info-severity-nodata { 52 - background: transparent; 53 - padding: 20px 4px 24px; 52 + background: #fff; 53 + padding: 32px 0; 54 54 text-align: center; 55 55 border: none; 56 + margin: 0; 56 57 color: {$greytext}; 57 58 } 58 59
-162
webroot/rsrc/css/phui/phui-profile-menu.css
··· 1 - /** 2 - * @provides phui-profile-menu-css 3 - */ 4 - 5 - .device-desktop .phui-profile-menu .phabricator-nav-local { 6 - width: {$menu.profile.width.collapsed}; 7 - max-width: {$menu.profile.width.collapsed}; 8 - } 9 - 10 - .device-desktop .phui-profile-menu .phabricator-nav-content { 11 - display: table-cell; 12 - margin-left: 0; 13 - } 14 - 15 - .phui-profile-menu .phui-basic-nav { 16 - width: 205px; 17 - } 18 - 19 - .phui-profile-menu .phabricator-side-menu { 20 - background: #dee0e7; 21 - width: 240px; 22 - } 23 - 24 - .phabricator-side-menu .phui-profile-menu-footer-1 { 25 - background: #dee0e7; 26 - } 27 - 28 - .phui-profile-menu .phabricator-side-menu .phui-list-item-view { 29 - position: relative; 30 - } 31 - 32 - .phui-profile-menu .phabricator-side-menu .phui-list-item-href { 33 - display: block; 34 - text-decoration: none; 35 - padding: 0 8px 0 48px; 36 - height: 48px; 37 - font-size: {$biggerfontsize}; 38 - -webkit-font-smoothing: antialiased; 39 - line-height: 22px; 40 - overflow: hidden; 41 - color: {$darkbluetext}; 42 - text-overflow: ellipsis; 43 - line-height: 48px; 44 - } 45 - 46 - .phui-profile-menu .phabricator-side-menu .phui-list-item-icon, 47 - .phui-profile-menu .phabricator-side-menu 48 - .phui-list-item-href .phui-list-item-icon { 49 - position: absolute; 50 - top: 12px; 51 - left: 13px; 52 - font-size: 24px; 53 - width: 24px; 54 - height: 24px; 55 - line-height: 24px; 56 - text-align: center; 57 - color: {$darkbluetext}; 58 - background-size: 100%; 59 - } 60 - 61 - .phui-profile-menu .phabricator-side-menu .phui-list-item-href { 62 - text-align: center; 63 - padding: 42px 4px 14px; 64 - line-height: 14px; 65 - height: auto; 66 - font-size: {$smallerfontsize}; 67 - } 68 - 69 - .phui-profile-menu .phabricator-side-menu .phui-list-item-name { 70 - display: block; 71 - overflow: hidden; 72 - text-overflow: ellipsis; 73 - } 74 - 75 - .phui-profile-menu .phabricator-side-menu .phui-list-item-icon, 76 - .phui-profile-menu .phabricator-side-menu .phui-list-item-href 77 - .phui-list-item-icon { 78 - top: 14px; 79 - left: 32px; 80 - } 81 - 82 - .phui-profile-menu .phabricator-side-menu 83 - .phui-list-item-disabled 84 - .phui-list-item-icon { 85 - color: {$lightgreytext}; 86 - } 87 - 88 - .phui-profile-menu .phabricator-side-menu .phui-icon-view { 89 - border-radius: 3px; 90 - } 91 - 92 - .device-desktop .phui-profile-menu .phabricator-side-menu 93 - .phui-list-item-href:hover { 94 - background-color: rgba({$alphablack},0.05); 95 - } 96 - 97 - .phui-profile-menu .phabricator-side-menu .phui-list-item-selected 98 - .phui-list-item-href { 99 - background-color: rgba({$alphablack},0.1); 100 - } 101 - 102 - .phui-profile-menu .phabricator-side-menu .phui-list-item-selected 103 - .phui-list-item-href:hover { 104 - background-color: rgba({$alphablack},0.15); 105 - } 106 - 107 - .phui-profile-menu .phabricator-side-menu .phui-divider { 108 - margin: 4px 0; 109 - border-bottom: 1px solid rgba({$alphablack}, 0.2); 110 - } 111 - 112 - .phui-profile-menu .phabricator-side-menu .phui-motivator { 113 - white-space: normal; 114 - padding: 18px 15px; 115 - font-size: 12px; 116 - color: {$darkbluetext}; 117 - } 118 - 119 - .phui-profile-menu .phabricator-side-menu .phui-motivator .phui-icon-view { 120 - position: static; 121 - font-size: 12px; 122 - color: {$darkbluetext}; 123 - } 124 - 125 - .phui-profile-menu .phabricator-side-menu .phui-profile-menu-error { 126 - color: rgba({$alphawhite}, 0.5); 127 - font-size: {$smallerfontsize}; 128 - padding: 16px; 129 - } 130 - 131 - .phui-profile-menu .phabricator-side-menu .phui-profile-menu-error { 132 - padding: 16px 8px; 133 - overflow: hidden; 134 - text-overflow: ellipsis; 135 - } 136 - 137 - .phui-profile-menu .phabricator-side-menu .phui-list-item-disabled 138 - .phui-list-item-href, 139 - .phui-profile-menu .phui-list-sidenav .phui-list-item-disabled 140 - .phui-list-item-href { 141 - color: rgba({$lightgreytext}); 142 - } 143 - 144 - .phui-profile-menu .phabricator-side-menu .phui-profile-segment-bar { 145 - color: {$darkbluetext}; 146 - font-size: {$smallerfontsize}; 147 - -webkit-font-smoothing: antialiased; 148 - padding: 8px 12px 16px; 149 - } 150 - 151 - .phui-profile-menu .phabricator-side-menu .phui-profile-segment-bar { 152 - padding: 8px 8px 16px; 153 - } 154 - 155 - .phui-profile-menu .phabricator-side-menu .phui-profile-menu-spacer { 156 - box-sizing: border-box; 157 - height: {$menu.profile.item.height}; 158 - } 159 - 160 - !print .phui-profile-menu .phabricator-side-menu { 161 - display: none; 162 - }
+3 -3
webroot/rsrc/css/phui/phui-segment-bar-view.css
··· 7 7 margin-bottom: 4px; 8 8 } 9 9 10 - .phui-profile-menu-collapsed .phui-segment-bar-label { 11 - width: 74px; 10 + .phui-basic-nav .phui-segment-bar-label { 11 + width: 180px; 12 12 overflow: hidden; 13 13 text-overflow: ellipsis; 14 14 } 15 15 16 16 .phui-segment-bar-segments { 17 - background: {$lightgreybackground}; 17 + background: rgba({$alphablue}, .1); 18 18 border-radius: 4px; 19 19 position: relative; 20 20 overflow: hidden;
+4
webroot/rsrc/css/phui/workboards/phui-workboard-color.css
··· 60 60 color: rgba({$alphawhite},.8); 61 61 } 62 62 63 + .phui-workboard-color .phui-segment-bar-label { 64 + color: rgba({$alphawhite},.8); 65 + } 66 + 63 67 /* Gradients */ 64 68 65 69 .phui-workboard-gradient-red {
+1 -1
webroot/rsrc/css/phui/workboards/phui-workboard.css
··· 32 32 } 33 33 34 34 .device-desktop .project-board-wrapper .phui-workboard-view-shadow { 35 - left: {$menu.profile.width.collapsed}; 35 + left: 212px; 36 36 } 37 37 38 38 !print .project-board-wrapper .phui-workboard-view-shadow {
+2 -1
webroot/rsrc/js/core/ToolTip.js
··· 46 46 47 47 var node = JX.$N( 48 48 'div', 49 - { className: 'jx-tooltip-container' }, 49 + { className: 'jx-tooltip-container jx-tooltip-hidden' }, 50 50 node_inner); 51 51 52 52 node.style.maxWidth = scale + 'px'; ··· 61 61 // Jump through some hoops trying to auto-position the tooltip 62 62 var pos = self._getSmartPosition(align, root, node); 63 63 pos.setPos(node); 64 + JX.DOM.alterClass(node, 'jx-tooltip-hidden', false); 64 65 }, 65 66 66 67 _getSmartPosition: function (align, root, node) {
+1 -1
webroot/rsrc/js/core/behavior-tooltip.js
··· 26 26 27 27 JX.Tooltip.show( 28 28 e.getNode('has-tooltip'), 29 - data.size || 120, 29 + data.size || 160, 30 30 data.align || 'N', 31 31 data.tip); 32 32 });