diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -7,8 +7,8 @@ */ return array( 'names' => array( - 'core.pkg.css' => '25e4069a', - 'core.pkg.js' => 'b562c3db', + 'core.pkg.css' => '7d178771', + 'core.pkg.js' => '2b8af4e4', 'darkconsole.pkg.js' => 'e7393ebb', 'differential.pkg.css' => '3fb7f532', 'differential.pkg.js' => '634399e9', @@ -32,11 +32,11 @@ 'rsrc/css/aphront/typeahead.css' => 'd4f16145', 'rsrc/css/application/almanac/almanac.css' => 'dbb9b3af', 'rsrc/css/application/auth/auth.css' => '0877ed6e', - 'rsrc/css/application/base/main-menu-view.css' => '3b0d39f7', - 'rsrc/css/application/base/notification-menu.css' => 'f31c0bde', + 'rsrc/css/application/base/main-menu-view.css' => 'e862571a', + 'rsrc/css/application/base/notification-menu.css' => 'b3ab500d', 'rsrc/css/application/base/phabricator-application-launch-view.css' => '95351601', 'rsrc/css/application/base/phui-theme.css' => '027ba77e', - 'rsrc/css/application/base/standard-page-view.css' => 'e709f6d0', + 'rsrc/css/application/base/standard-page-view.css' => '99a7d403', 'rsrc/css/application/chatlog/chatlog.css' => 'd295b020', 'rsrc/css/application/conduit/conduit-api.css' => '7bc725c4', 'rsrc/css/application/config/config-options.css' => '0ede4c9b', @@ -45,12 +45,12 @@ 'rsrc/css/application/config/setup-issue.css' => 'f794cfc3', 'rsrc/css/application/config/unhandled-exception.css' => '4c96257a', 'rsrc/css/application/conpherence/durable-column.css' => '86396117', - 'rsrc/css/application/conpherence/menu.css' => 'f99fee4c', - 'rsrc/css/application/conpherence/message-pane.css' => '5897d3ac', + 'rsrc/css/application/conpherence/menu.css' => '90bdf85c', + 'rsrc/css/application/conpherence/message-pane.css' => '5c7b7b17', 'rsrc/css/application/conpherence/notification.css' => '6cdcc253', 'rsrc/css/application/conpherence/transaction.css' => '85d0974c', 'rsrc/css/application/conpherence/update.css' => 'faf6be09', - 'rsrc/css/application/conpherence/widget-pane.css' => '775eaaba', + 'rsrc/css/application/conpherence/widget-pane.css' => 'c5b74f9e', 'rsrc/css/application/contentsource/content-source-view.css' => '4b8b05d4', 'rsrc/css/application/countdown/timer.css' => '16c52f5c', 'rsrc/css/application/daemon/bulk-job.css' => 'df9c1d4a', @@ -107,7 +107,7 @@ 'rsrc/css/core/core.css' => 'd0801452', 'rsrc/css/core/remarkup.css' => '5ed06ed8', 'rsrc/css/core/syntax.css' => '769d3498', - 'rsrc/css/core/z-index.css' => '5b6fcf3f', + 'rsrc/css/core/z-index.css' => '2b01a823', 'rsrc/css/diviner/diviner-shared.css' => 'aa3656aa', 'rsrc/css/font/font-aleo.css' => '8bdb2835', 'rsrc/css/font/font-awesome.css' => '2b7ebbcc', @@ -160,7 +160,7 @@ 'rsrc/css/phui/phui-timeline-view.css' => 'bc523970', 'rsrc/css/phui/phui-two-column-view.css' => '5afdf637', 'rsrc/css/phui/workboards/phui-workboard-color.css' => 'ac6fe6a7', - 'rsrc/css/phui/workboards/phui-workboard.css' => 'e6d89647', + 'rsrc/css/phui/workboards/phui-workboard.css' => 'bda3ef58', 'rsrc/css/phui/workboards/phui-workcard.css' => '0c62d7c5', 'rsrc/css/phui/workboards/phui-workpanel.css' => '92197373', 'rsrc/css/sprite-login.css' => '60e8560e', @@ -357,7 +357,7 @@ 'rsrc/image/texture/table_header_hover.png' => '038ec3b9', 'rsrc/image/texture/table_header_tall.png' => 'd56b434f', 'rsrc/js/application/aphlict/Aphlict.js' => '5359e785', - 'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => '031cee25', + 'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => '49e20786', 'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => 'fb20ac8d', 'rsrc/js/application/aphlict/behavior-aphlict-status.js' => 'ea681761', 'rsrc/js/application/aphlict/behavior-desktop-notifications-control.js' => 'edd1ba66', @@ -549,13 +549,13 @@ 'config-options-css' => '0ede4c9b', 'config-welcome-css' => '035aa483', 'conpherence-durable-column-view' => '86396117', - 'conpherence-menu-css' => 'f99fee4c', - 'conpherence-message-pane-css' => '5897d3ac', + 'conpherence-menu-css' => '90bdf85c', + 'conpherence-message-pane-css' => '5c7b7b17', 'conpherence-notification-css' => '6cdcc253', 'conpherence-thread-manager' => '01774ab2', 'conpherence-transaction-css' => '85d0974c', 'conpherence-update-css' => 'faf6be09', - 'conpherence-widget-pane-css' => '775eaaba', + 'conpherence-widget-pane-css' => 'c5b74f9e', 'd3' => 'a11a5ff2', 'differential-changeset-view-css' => '9ef7d354', 'differential-core-view-css' => '5b7b8ff4', @@ -580,7 +580,7 @@ 'inline-comment-summary-css' => '51efda3a', 'javelin-aphlict' => '5359e785', 'javelin-behavior' => '61cbc29a', - 'javelin-behavior-aphlict-dropdown' => '031cee25', + 'javelin-behavior-aphlict-dropdown' => '49e20786', 'javelin-behavior-aphlict-listen' => 'fb20ac8d', 'javelin-behavior-aphlict-status' => 'ea681761', 'javelin-behavior-aphront-basic-tokenizer' => 'b3a4b884', @@ -784,11 +784,11 @@ 'phabricator-flag-css' => '5337623f', 'phabricator-keyboard-shortcut' => '1ae869f2', 'phabricator-keyboard-shortcut-manager' => '4a021c10', - 'phabricator-main-menu-view' => '3b0d39f7', + 'phabricator-main-menu-view' => 'e862571a', 'phabricator-nav-view-css' => 'b29426e9', 'phabricator-notification' => 'ccf1cbf8', 'phabricator-notification-css' => '3f6c89c9', - 'phabricator-notification-menu-css' => 'f31c0bde', + 'phabricator-notification-menu-css' => 'b3ab500d', 'phabricator-object-selector-css' => '85ee8ce6', 'phabricator-phtize' => 'd254d646', 'phabricator-prefab' => 'cfd23f37', @@ -797,7 +797,7 @@ 'phabricator-shaped-request' => '7cbe244b', 'phabricator-slowvote-css' => 'a94b7230', 'phabricator-source-code-view-css' => 'cbeef983', - 'phabricator-standard-page-view' => 'e709f6d0', + 'phabricator-standard-page-view' => '99a7d403', 'phabricator-textareautils' => '320810c8', 'phabricator-title' => 'df5e11d2', 'phabricator-tooltip' => '6323f942', @@ -812,7 +812,7 @@ 'phabricator-uiexample-reactor-select' => 'a155550f', 'phabricator-uiexample-reactor-sendclass' => '1def2711', 'phabricator-uiexample-reactor-sendproperties' => 'b1f0ccee', - 'phabricator-zindex-css' => '5b6fcf3f', + 'phabricator-zindex-css' => '2b01a823', 'phame-css' => '8efb0729', 'pholio-css' => 'ca89d380', 'pholio-edit-css' => '07676f51', @@ -870,7 +870,7 @@ 'phui-timeline-view-css' => 'bc523970', 'phui-two-column-view-css' => '5afdf637', 'phui-workboard-color-css' => 'ac6fe6a7', - 'phui-workboard-view-css' => 'e6d89647', + 'phui-workboard-view-css' => 'bda3ef58', 'phui-workcard-view-css' => '0c62d7c5', 'phui-workpanel-view-css' => '92197373', 'phuix-action-list-view' => 'b5c256b8', @@ -931,16 +931,6 @@ 'javelin-dom', 'phabricator-keyboard-shortcut', ), - '031cee25' => array( - 'javelin-behavior', - 'javelin-request', - 'javelin-stratcom', - 'javelin-vector', - 'javelin-dom', - 'javelin-uri', - 'javelin-behavior-device', - 'phabricator-title', - ), '05270951' => array( 'javelin-util', 'javelin-magical-init', @@ -1164,9 +1154,6 @@ 'javelin-dom', 'javelin-magical-init', ), - '3b0d39f7' => array( - 'phui-theme-css', - ), '3cb0b2fc' => array( 'javelin-behavior', 'javelin-dom', @@ -1242,6 +1229,16 @@ 'javelin-dom', 'javelin-stratcom', ), + '49e20786' => array( + 'javelin-behavior', + 'javelin-request', + 'javelin-stratcom', + 'javelin-vector', + 'javelin-dom', + 'javelin-uri', + 'javelin-behavior-device', + 'phabricator-title', + ), '4a021c10' => array( 'javelin-install', 'javelin-util', @@ -2097,6 +2094,9 @@ 'e6e25838' => array( 'javelin-install', ), + 'e862571a' => array( + 'phui-theme-css', + ), 'e9581f08' => array( 'javelin-behavior', 'javelin-stratcom', diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2170,6 +2170,7 @@ 'PhabricatorConfigHistoryController' => 'applications/config/controller/PhabricatorConfigHistoryController.php', 'PhabricatorConfigIgnoreController' => 'applications/config/controller/PhabricatorConfigIgnoreController.php', 'PhabricatorConfigIssueListController' => 'applications/config/controller/PhabricatorConfigIssueListController.php', + 'PhabricatorConfigIssuePanelController' => 'applications/config/controller/PhabricatorConfigIssuePanelController.php', 'PhabricatorConfigIssueViewController' => 'applications/config/controller/PhabricatorConfigIssueViewController.php', 'PhabricatorConfigJSON' => 'applications/config/json/PhabricatorConfigJSON.php', 'PhabricatorConfigJSONOptionType' => 'applications/config/custom/PhabricatorConfigJSONOptionType.php', @@ -6915,6 +6916,7 @@ 'PhabricatorConfigHistoryController' => 'PhabricatorConfigController', 'PhabricatorConfigIgnoreController' => 'PhabricatorConfigController', 'PhabricatorConfigIssueListController' => 'PhabricatorConfigController', + 'PhabricatorConfigIssuePanelController' => 'PhabricatorConfigController', 'PhabricatorConfigIssueViewController' => 'PhabricatorConfigController', 'PhabricatorConfigJSON' => 'Phobject', 'PhabricatorConfigJSONOptionType' => 'PhabricatorConfigOptionType', diff --git a/src/applications/config/application/PhabricatorConfigApplication.php b/src/applications/config/application/PhabricatorConfigApplication.php --- a/src/applications/config/application/PhabricatorConfigApplication.php +++ b/src/applications/config/application/PhabricatorConfigApplication.php @@ -55,6 +55,7 @@ => 'PhabricatorConfigIgnoreController', 'issue/' => array( '' => 'PhabricatorConfigIssueListController', + 'panel/' => 'PhabricatorConfigIssuePanelController', '(?P[^/]+)/' => 'PhabricatorConfigIssueViewController', ), 'cache/' => array( diff --git a/src/applications/config/controller/PhabricatorConfigIssuePanelController.php b/src/applications/config/controller/PhabricatorConfigIssuePanelController.php new file mode 100644 --- /dev/null +++ b/src/applications/config/controller/PhabricatorConfigIssuePanelController.php @@ -0,0 +1,68 @@ +getViewer(); + $open_items = PhabricatorSetupCheck::getOpenSetupIssueKeys(); + $issues = PhabricatorSetupCheck::runAllChecks(); + PhabricatorSetupCheck::setOpenSetupIssueKeys( + PhabricatorSetupCheck::getUnignoredIssueKeys($issues), + $update_database = true); + + if ($issues) { + require_celerity_resource('phabricator-notification-menu-css'); + + $items = array(); + foreach ($issues as $issue) { + $classes = array(); + $classes[] = 'phabricator-notification'; + if ($issue->getIsIgnored()) { + $classes[] = 'phabricator-notification-read'; + } else { + $classes[] = 'phabricator-notification-unread'; + } + $uri = '/config/issue/'.$issue->getIssueKey().'/'; + $title = $issue->getName(); + $summary = $issue->getSummary(); + $items[] = javelin_tag( + 'div', + array( + 'class' => implode(' ', $classes), + 'sigil' => 'notification', + 'meta' => array( + 'href' => $uri, + ), + ), + $title); + } + $content = phutil_tag_div('setup-issue-menu', $items); + } else { + $content = phutil_tag_div( + 'phabricator-notification no-notifications', + pht('You have no unresolved setup issues.')); + } + + $content = hsprintf( + '
%s
'. + '%s', + phutil_tag( + 'a', + array( + 'href' => '/config/issue/', + ), + pht('Unresolved Setup Issues')), + $content); + + $unresolved_count = count($open_items); + + $json = array( + 'content' => $content, + 'number' => (int)$unresolved_count, + ); + + return id(new AphrontAjaxResponse())->setContent($json); + } + +} diff --git a/src/infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php b/src/infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php --- a/src/infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php +++ b/src/infrastructure/internationalization/translation/PhabricatorUSEnglishTranslation.php @@ -538,11 +538,6 @@ 'PHP also loaded these configuration files:', ), - 'You have %d unresolved setup issue(s)...' => array( - 'You have an unresolved setup issue...', - 'You have %d unresolved setup issues...', - ), - '%s added %d inline comment(s).' => array( array( '%s added an inline comment.', diff --git a/src/view/page/PhabricatorStandardPageView.php b/src/view/page/PhabricatorStandardPageView.php --- a/src/view/page/PhabricatorStandardPageView.php +++ b/src/view/page/PhabricatorStandardPageView.php @@ -459,24 +459,6 @@ 'or the error log.')); } - // Render the "you have unresolved setup issues..." warning. - $setup_warning = null; - if ($user && $user->getIsAdmin()) { - $open = PhabricatorSetupCheck::getOpenSetupIssueKeys(); - if ($open) { - $classes[] = 'page-has-warning'; - $setup_warning = phutil_tag_div( - 'setup-warning-callout', - phutil_tag( - 'a', - array( - 'href' => '/config/issue/', - 'title' => implode(', ', $open), - ), - pht('You have %d unresolved setup issue(s)...', count($open)))); - } - } - $main_page = phutil_tag( 'div', array( @@ -486,7 +468,6 @@ array( $developer_warning, $header_chrome, - $setup_warning, phutil_tag( 'div', array( diff --git a/src/view/page/menu/PhabricatorMainMenuView.php b/src/view/page/menu/PhabricatorMainMenuView.php --- a/src/view/page/menu/PhabricatorMainMenuView.php +++ b/src/view/page/menu/PhabricatorMainMenuView.php @@ -531,15 +531,100 @@ ''); } + // Admin Level Urgent Notification Channel + $setup_tag = ''; + $setup_notification_dropdown = ''; + if ($viewer && $viewer->getIsAdmin()) { + $open = PhabricatorSetupCheck::getOpenSetupIssueKeys(); + if ($open) { + $setup_id = celerity_generate_unique_node_id(); + $setup_count_id = celerity_generate_unique_node_id(); + $setup_dropdown_id = celerity_generate_unique_node_id(); + + $setup_count_number = count($open); + + if ($setup_count_number) { + $aural[] = phutil_tag( + 'a', + array( + 'href' => '/config/issue/', + ), + pht( + '%s unresolved issues.', + new PhutilNumber($setup_count_number))); + } else { + $aural[] = pht('No issues.'); + } + + $setup_count_tag = phutil_tag( + 'span', + array( + 'id' => $setup_count_id, + 'class' => 'phabricator-main-menu-setup-count', + ), + $setup_count_number); + + $setup_icon_tag = javelin_tag( + 'span', + array( + 'class' => 'phabricator-main-menu-setup-icon phui-icon-view '. + 'phui-font-fa fa-exclamation-circle', + 'sigil' => 'menu-icon', + ), + ''); + + if ($setup_count_number) { + $container_classes[] = 'setup-unread'; + } + + $setup_tag = phutil_tag( + 'a', + array( + 'href' => '/config/issue/', + 'class' => implode(' ', $container_classes), + 'id' => $setup_id, + ), + array( + $setup_icon_tag, + $setup_count_tag, + )); + + Javelin::initBehavior( + 'aphlict-dropdown', + array( + 'bubbleID' => $setup_id, + 'countID' => $setup_count_id, + 'dropdownID' => $setup_dropdown_id, + 'loadingText' => pht('Loading...'), + 'uri' => '/config/issue/panel/', + 'countType' => null, + 'countNumber' => null, + 'unreadClass' => 'setup-unread', + )); + + $setup_notification_dropdown = javelin_tag( + 'div', + array( + 'id' => $setup_dropdown_id, + 'class' => 'phabricator-notification-menu', + 'sigil' => 'phabricator-notification-menu', + 'style' => 'display: none;', + ), + ''); + } + } + $dropdowns = array( $notification_dropdown, $message_notification_dropdown, + $setup_notification_dropdown, ); return array( array( $bubble_tag, $message_tag, + $setup_tag, ), $dropdowns, $aural, diff --git a/webroot/rsrc/css/application/base/main-menu-view.css b/webroot/rsrc/css/application/base/main-menu-view.css --- a/webroot/rsrc/css/application/base/main-menu-view.css +++ b/webroot/rsrc/css/application/base/main-menu-view.css @@ -376,7 +376,8 @@ } .phabricator-main-menu-alert-icon, -.phabricator-main-menu-message-icon { +.phabricator-main-menu-message-icon, +.phabricator-main-menu-setup-icon { width: 18px; height: 18px; float: left; @@ -396,8 +397,25 @@ margin-top: 2px; } +.setup-unread .phui-icon-view.phabricator-main-menu-setup-icon { + color: #ecf36c; + font-size: 16px; + margin-top: 2px; + width: 15px; +} + +.setup-unread .phabricator-main-menu-setup-count { + color: #ecf36c; + margin-top: 10px; +} + +.device-desktop .alert-notifications.setup-unread:hover .phui-icon-view { + color: #ecf36c; +} + .phabricator-main-menu-alert-count, -.phabricator-main-menu-message-count { +.phabricator-main-menu-message-count, +.phabricator-main-menu-setup-count { color: #fff; text-align: center; display: none; @@ -407,17 +425,20 @@ } .device-phone .alert-unread .phabricator-main-menu-alert-count, -.device-phone .message-unread .phabricator-main-menu-message-count { +.device-phone .message-unread .phabricator-main-menu-message-count, +.device-phone .setup-unread .phabricator-main-menu-setup-count { display: none; } .alert-unread .phabricator-main-menu-alert-icon, -.message-unread .phabricator-main-menu-message-icon { +.message-unread .phabricator-main-menu-message-icon, +.setup-unread .phabricator-main-menu-setup-icon { color: #fff; } .alert-unread .phabricator-main-menu-alert-count, -.message-unread .phabricator-main-menu-message-count { +.message-unread .phabricator-main-menu-message-count, +.setup-unread .phabricator-main-menu-setup-count { display: block; } diff --git a/webroot/rsrc/css/application/base/notification-menu.css b/webroot/rsrc/css/application/base/notification-menu.css --- a/webroot/rsrc/css/application/base/notification-menu.css +++ b/webroot/rsrc/css/application/base/notification-menu.css @@ -37,7 +37,6 @@ top: 42px !important; left: 3% !important; position: absolute; - } .phabricator-notification-list.pm { @@ -78,6 +77,10 @@ background: {$hoverblue}; } +.phabricator-notification-read { + color: {$lightgreytext}; +} + .phabricator-notification-header { font-weight: bold; padding: 10px 8px; diff --git a/webroot/rsrc/css/application/base/standard-page-view.css b/webroot/rsrc/css/application/base/standard-page-view.css --- a/webroot/rsrc/css/application/base/standard-page-view.css +++ b/webroot/rsrc/css/application/base/standard-page-view.css @@ -105,17 +105,6 @@ font-size: {$smallerfontsize}; } -.setup-warning-callout { - padding: 8px 16px; - background: {$lightred}; - border-bottom: 1px solid {$sh-redborder}; - position: relative; -} - -.setup-warning-callout a { - color: {$red}; -} - .phui-handle .phui-icon-view { display: inline-block; margin: 2px 2px -2px 0; diff --git a/webroot/rsrc/css/application/conpherence/menu.css b/webroot/rsrc/css/application/conpherence/menu.css --- a/webroot/rsrc/css/application/conpherence/menu.css +++ b/webroot/rsrc/css/application/conpherence/menu.css @@ -11,10 +11,6 @@ background: #fff; } -.page-has-warning .conpherence-layout { - top: 76px; -} - .conpherence-layout .conpherence-no-threads { text-align: center; position: fixed; diff --git a/webroot/rsrc/css/application/conpherence/message-pane.css b/webroot/rsrc/css/application/conpherence/message-pane.css --- a/webroot/rsrc/css/application/conpherence/message-pane.css +++ b/webroot/rsrc/css/application/conpherence/message-pane.css @@ -65,10 +65,6 @@ bottom: 42px; } -.page-has-warning .conpherence-message-pane .conpherence-messages { - top: 110px; -} - .conpherence-messages.jx-scrollbar-frame { overflow-y: hidden; } diff --git a/webroot/rsrc/css/application/conpherence/widget-pane.css b/webroot/rsrc/css/application/conpherence/widget-pane.css --- a/webroot/rsrc/css/application/conpherence/widget-pane.css +++ b/webroot/rsrc/css/application/conpherence/widget-pane.css @@ -15,12 +15,6 @@ overflow-y: auto; -webkit-overflow-scrolling: touch; } - -.page-has-warning .conpherence-widget-pane, -.page-had-warning .loading .widgets-loading-mask { - top: 110px; -} - .device .conpherence-widget-pane, .device .loading .widgets-loading-mask { top: 44px; @@ -91,10 +85,6 @@ width: 240px; } -.device-desktop .page-has-warning .conpherence-widget-pane .widgets-body { - top: 142px; -} - .conpherence-widget-pane .widget-icon { display: block; height: 14px; diff --git a/webroot/rsrc/css/core/z-index.css b/webroot/rsrc/css/core/z-index.css --- a/webroot/rsrc/css/core/z-index.css +++ b/webroot/rsrc/css/core/z-index.css @@ -68,10 +68,6 @@ z-index: 4; } -.setup-warning-callout { - z-index: 5; -} - .loading .messages-loading-mask, .loading .widgets-loading-mask { z-index: 5; diff --git a/webroot/rsrc/css/phui/workboards/phui-workboard.css b/webroot/rsrc/css/phui/workboards/phui-workboard.css --- a/webroot/rsrc/css/phui/workboards/phui-workboard.css +++ b/webroot/rsrc/css/phui/workboards/phui-workboard.css @@ -22,10 +22,6 @@ background-color: #fff; } -.device-desktop .page-has-warning .phui-workboard-view-shadow { - top: 113px; -} - .device-desktop.with-durable-column .phui-workboard-view-shadow { right: 300px; } diff --git a/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js b/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js --- a/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js +++ b/webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js @@ -26,10 +26,16 @@ var request = null; var dirty = config.local ? false : true; - JX.Title.setCount(config.countType, config.countNumber); + if (config.countType) { + JX.Title.setCount(config.countType, config.countNumber); + } function _updateCount(number) { - JX.Title.setCount(config.countType, number); + if (config.countType) { + JX.Title.setCount(config.countType, number); + } else { + return; + } JX.DOM.setContent(count, number); if (number === 0) {