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' => '60a6d241', - 'core.pkg.js' => '61af8961', + 'core.pkg.js' => 'ee4b7b42', 'darkconsole.pkg.js' => '8ab24e01', 'differential.pkg.css' => '8af45893', 'differential.pkg.js' => 'dad3622f', @@ -342,9 +342,9 @@ 'rsrc/image/texture/table_header.png' => '5c433037', 'rsrc/image/texture/table_header_hover.png' => '038ec3b9', 'rsrc/image/texture/table_header_tall.png' => 'd56b434f', - 'rsrc/js/application/aphlict/Aphlict.js' => '464d333a', - 'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => 'f6bc26f0', - 'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => '1162a152', + 'rsrc/js/application/aphlict/Aphlict.js' => 'daa6ca29', + 'rsrc/js/application/aphlict/behavior-aphlict-dropdown.js' => '1d8508e2', + 'rsrc/js/application/aphlict/behavior-aphlict-listen.js' => '0ca60207', 'rsrc/js/application/aphlict/behavior-aphlict-status.js' => '58f7803f', 'rsrc/js/application/auth/behavior-persona-login.js' => '9414ff18', 'rsrc/js/application/config/behavior-reorder-fields.js' => '14a827de', @@ -535,10 +535,10 @@ 'herald-rule-editor' => '335fd41f', 'herald-test-css' => '778b008e', 'inline-comment-summary-css' => '8cfd34e8', - 'javelin-aphlict' => '464d333a', + 'javelin-aphlict' => 'daa6ca29', 'javelin-behavior' => '61cbc29a', - 'javelin-behavior-aphlict-dropdown' => 'f6bc26f0', - 'javelin-behavior-aphlict-listen' => '1162a152', + 'javelin-behavior-aphlict-dropdown' => '1d8508e2', + 'javelin-behavior-aphlict-listen' => '0ca60207', 'javelin-behavior-aphlict-status' => '58f7803f', 'javelin-behavior-aphront-basic-tokenizer' => 'b3a4b884', 'javelin-behavior-aphront-crop' => 'fa0f4fc2', @@ -893,6 +893,19 @@ 'javelin-util', 'phabricator-notification-css', ), + '0ca60207' => array( + 'javelin-behavior', + 'javelin-aphlict', + 'javelin-stratcom', + 'javelin-request', + 'javelin-uri', + 'javelin-dom', + 'javelin-json', + 'javelin-router', + 'javelin-util', + 'javelin-leader', + 'phabricator-notification', + ), '0ec56e1d' => array( 'javelin-behavior', 'javelin-dom', @@ -908,18 +921,6 @@ 'javelin-uri', 'javelin-install', ), - '1162a152' => array( - 'javelin-behavior', - 'javelin-aphlict', - 'javelin-stratcom', - 'javelin-request', - 'javelin-uri', - 'javelin-dom', - 'javelin-json', - 'javelin-router', - 'javelin-util', - 'phabricator-notification', - ), '13c739ea' => array( 'javelin-behavior', 'javelin-stratcom', @@ -956,6 +957,16 @@ 'javelin-util', 'phabricator-keyboard-shortcut-manager', ), + '1d8508e2' => array( + 'javelin-behavior', + 'javelin-request', + 'javelin-stratcom', + 'javelin-vector', + 'javelin-dom', + 'javelin-uri', + 'javelin-behavior-device', + 'phabricator-title', + ), '1def2711' => array( 'javelin-install', 'javelin-dom', @@ -1087,13 +1098,6 @@ 'javelin-behavior', 'javelin-dom', ), - '464d333a' => array( - 'javelin-install', - 'javelin-util', - 'javelin-websocket', - 'javelin-leader', - 'javelin-json', - ), '469c0d9e' => array( 'javelin-behavior', 'javelin-dom', @@ -1741,6 +1745,13 @@ 'javelin-util', 'phabricator-shaped-request', ), + 'daa6ca29' => array( + 'javelin-install', + 'javelin-util', + 'javelin-websocket', + 'javelin-leader', + 'javelin-json', + ), 'dd7e8ef5' => array( 'javelin-behavior', 'javelin-dom', @@ -1897,16 +1908,6 @@ 'javelin-util', 'javelin-reactor', ), - 'f6bc26f0' => array( - 'javelin-behavior', - 'javelin-request', - 'javelin-stratcom', - 'javelin-vector', - 'javelin-dom', - 'javelin-uri', - 'javelin-behavior-device', - 'phabricator-title', - ), 'f7379f45' => array( 'javelin-behavior', 'javelin-dom', diff --git a/webroot/rsrc/js/application/aphlict/Aphlict.js b/webroot/rsrc/js/application/aphlict/Aphlict.js --- a/webroot/rsrc/js/application/aphlict/Aphlict.js +++ b/webroot/rsrc/js/application/aphlict/Aphlict.js @@ -119,6 +119,10 @@ var handler = this.getHandler(); handler && handler(message.data); break; + case 'notification.individual': + var renderer = this.getRenderer(); + renderer && renderer(message.data); + break; } }, @@ -134,7 +138,8 @@ }, properties: { - handler: null + handler: null, + renderer: null }, statics: { 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 @@ -37,7 +37,8 @@ true); } - if (request) { //already fetching + if (request) { + // Already fetching. return; } diff --git a/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js b/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js --- a/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js +++ b/webroot/rsrc/js/application/aphlict/behavior-aphlict-listen.js @@ -9,6 +9,7 @@ * javelin-json * javelin-router * javelin-util + * javelin-leader * phabricator-notification */ @@ -23,9 +24,24 @@ return; } + JX.Leader.callIfLeader(function() { + requestNotification(message); + }); + }); + + // Respond to a notification from the Aphlict notification server. We send + // a request to Phabricator to get notification details. + function onAphlictMessage(message) { + JX.Stratcom.invoke('aphlict-receive-message', null, message); + } + + // Request the individual notification. This function is only called by the + // leader tab, which then broadcasts the notification content back to all + // other tabs. + function requestNotification(message) { var request = new JX.Request( - '/notification/individual/', - onnotification); + '/notification/individual/', + receiveNotification); var routable = request .addData({key: message.key}) @@ -36,22 +52,22 @@ .setPriority(250); JX.Router.getInstance().queue(routable); - }); - - - // Respond to a notification from the Aphlict notification server. We send - // a request to Phabricator to get notification details. - function onaphlictmessage(message) { - JX.Stratcom.invoke('aphlict-receive-message', null, message); } - - // Respond to a response from Phabricator about a specific notification. - function onnotification(response) { + // Receive the individual notification and broadcast it to all other tabs. + function receiveNotification(response) { if (!response.pertinent) { return; } + JX.Leader.broadcast(null, { + type: 'notification.individual', + data: response + }); + } + + // Respond to a response from Phabricator about a specific notification. + function onAphlictNotification(response) { JX.Stratcom.invoke('notification-panel-update', null, {}); // Show the notification itself. @@ -59,9 +75,8 @@ .setContent(JX.$H(response.content)) .show(); - - // If the notification affected an object on this page, show a - // permanent reload notification if we aren't already. + // If the notification affected an object on this page, show a permanent + // reload notification if we aren't already. if ((response.primaryObjectPHID in config.pageObjects) && !showing_reload) { var reload = new JX.Notification() .setContent('Page updated, click to reload.') @@ -79,7 +94,8 @@ config.subscriptions); client - .setHandler(onaphlictmessage) + .setHandler(onAphlictMessage) + .setRenderer(onAphlictNotification) .start(); });