diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -8,7 +8,7 @@ return array( 'names' => array( 'core.pkg.css' => '974635bb', - 'core.pkg.js' => 'f0e2c091', + 'core.pkg.js' => 'cbdbd552', 'darkconsole.pkg.js' => 'df001cab', 'differential.pkg.css' => '36884139', 'differential.pkg.js' => '73337d1d', @@ -348,7 +348,7 @@ 'rsrc/image/texture/table_header_hover.png' => '038ec3b9', 'rsrc/image/texture/table_header_tall.png' => 'd56b434f', 'rsrc/js/application/aphlict/Aphlict.js' => '4a07e8e3', - 'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => 'f51afce0', + 'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => '7d4cc76c', 'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => 'a826c925', 'rsrc/js/application/aphlict/behavior-aphlict-status.js' => '58f7803f', 'rsrc/js/application/auth/behavior-persona-login.js' => '9414ff18', @@ -448,6 +448,7 @@ 'rsrc/js/core/Prefab.js' => 'bbae734c', 'rsrc/js/core/ShapedRequest.js' => '7cbe244b', 'rsrc/js/core/TextAreaUtils.js' => '5c93c52c', + 'rsrc/js/core/Title.js' => '5c1c758c', 'rsrc/js/core/ToolTip.js' => '3915d490', 'rsrc/js/core/behavior-active-nav.js' => 'e379b58e', 'rsrc/js/core/behavior-audio-source.js' => '59b251eb', @@ -542,7 +543,7 @@ 'inline-comment-summary-css' => '8cfd34e8', 'javelin-aphlict' => '4a07e8e3', 'javelin-behavior' => '61cbc29a', - 'javelin-behavior-aphlict-dropdown' => 'f51afce0', + 'javelin-behavior-aphlict-dropdown' => '7d4cc76c', 'javelin-behavior-aphlict-listen' => 'a826c925', 'javelin-behavior-aphlict-status' => '58f7803f', 'javelin-behavior-aphront-basic-tokenizer' => 'b3a4b884', @@ -740,6 +741,7 @@ 'phabricator-source-code-view-css' => '7d346aa4', 'phabricator-standard-page-view' => '517cdfb1', 'phabricator-textareautils' => '5c93c52c', + 'phabricator-title' => '5c1c758c', 'phabricator-tooltip' => '3915d490', 'phabricator-transaction-view-css' => '5d0cae25', 'phabricator-ui-example-css' => '528b19de', @@ -1190,6 +1192,9 @@ 'javelin-behavior', 'javelin-stratcom', ), + '5c1c758c' => array( + 'javelin-install', + ), '5c54cbf3' => array( 'javelin-behavior', 'javelin-stratcom', @@ -1328,6 +1333,16 @@ 'javelin-request', 'javelin-router', ), + '7d4cc76c' => array( + 'javelin-behavior', + 'javelin-request', + 'javelin-stratcom', + 'javelin-vector', + 'javelin-dom', + 'javelin-uri', + 'javelin-behavior-device', + 'phabricator-title', + ), '7e41274a' => array( 'javelin-install', ), @@ -1859,15 +1874,6 @@ 'phuix-action-view', 'javelin-workflow', ), - 'f51afce0' => array( - 'javelin-behavior', - 'javelin-request', - 'javelin-stratcom', - 'javelin-vector', - 'javelin-dom', - 'javelin-uri', - 'javelin-behavior-device', - ), 'f588412e' => array( 'javelin-behavior', 'javelin-dom', 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 @@ -349,6 +349,8 @@ 'dropdownID' => $message_dropdown_id, 'loadingText' => pht('Loading...'), 'uri' => '/conpherence/panel/', + 'countType' => 'messages', + 'countNumber' => $message_count_number, )); $message_notification_dropdown = javelin_tag( @@ -428,6 +430,8 @@ 'dropdownID' => $dropdown_id, 'loadingText' => pht('Loading...'), 'uri' => '/notification/panel/', + 'countType' => 'notifications', + 'countNumber' => $count_number, )); $notification_dropdown = javelin_tag( 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 @@ -7,6 +7,7 @@ * javelin-dom * javelin-uri * javelin-behavior-device + * phabricator-title */ JX.behavior('aphlict-dropdown', function(config, statics) { @@ -24,6 +25,8 @@ var request = null; var dirty = config.local ? false : true; + JX.Title.setCount(config.countType, config.countNumber); + function refresh() { if (dirty) { JX.DOM.setContent(dropdown, config.loadingText); @@ -38,6 +41,8 @@ } request = new JX.Request(config.uri, function(response) { + JX.Title.setCount(config.countType, response.number); + var display = (response.number > 999) ? '\u221E' : response.number; JX.DOM.setContent(count, display); diff --git a/webroot/rsrc/js/core/Title.js b/webroot/rsrc/js/core/Title.js new file mode 100644 --- /dev/null +++ b/webroot/rsrc/js/core/Title.js @@ -0,0 +1,43 @@ +/** + * @requires javelin-install + * @provides phabricator-title + * @javelin + */ + +/** + * Update the document title to show a notification/message count. + */ +JX.install('Title', { + statics: { + _counts: {}, + _title: null, + + setCount: function(k, v) { + var self = JX.Title; + self._counts[k] = v; + self._update(); + }, + + _update: function() { + var self = JX.Title; + + if (self._title === null) { + self._title = document.title; + } + + var sum = 0; + for (var k in self._counts) { + sum += parseInt(self._counts[k], 10) || 0; + } + + var title; + if (sum) { + title = '(' + sum + ') ' + self._title; + } else { + title = self._title; + } + + document.title = title; + } + } +});