diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 536440717d..9a9ca1a9c2 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -354,9 +354,9 @@ return array( 'rsrc/js/application/aphlict/behavior-aphlict-status.js' => 'ea681761', 'rsrc/js/application/auth/behavior-persona-login.js' => '9414ff18', 'rsrc/js/application/config/behavior-reorder-fields.js' => '14a827de', - 'rsrc/js/application/conpherence/ConpherenceThreadManager.js' => 'bb928342', - 'rsrc/js/application/conpherence/behavior-durable-column.js' => 'a0216452', - 'rsrc/js/application/conpherence/behavior-menu.js' => 'db6c0ba7', + 'rsrc/js/application/conpherence/ConpherenceThreadManager.js' => '0a5192c4', + 'rsrc/js/application/conpherence/behavior-durable-column.js' => '7ffa744f', + 'rsrc/js/application/conpherence/behavior-menu.js' => 'e67cfd8c', 'rsrc/js/application/conpherence/behavior-pontificate.js' => '21ba5861', 'rsrc/js/application/conpherence/behavior-quicksand-blacklist.js' => '7927a7d3', 'rsrc/js/application/conpherence/behavior-widget-pane.js' => '1ec93bcf', @@ -519,7 +519,7 @@ return array( 'conpherence-menu-css' => '7c900089', 'conpherence-message-pane-css' => 'e44b667b', 'conpherence-notification-css' => '04a6e10a', - 'conpherence-thread-manager' => 'bb928342', + 'conpherence-thread-manager' => '0a5192c4', 'conpherence-update-css' => '1099a660', 'conpherence-widget-pane-css' => 'a9082fd0', 'differential-changeset-view-css' => 'e19cfd6e', @@ -559,7 +559,7 @@ return array( 'javelin-behavior-boards-dropdown' => '0ec56e1d', 'javelin-behavior-choose-control' => '6153c708', 'javelin-behavior-config-reorder-fields' => '14a827de', - 'javelin-behavior-conpherence-menu' => 'db6c0ba7', + 'javelin-behavior-conpherence-menu' => 'e67cfd8c', 'javelin-behavior-conpherence-pontificate' => '21ba5861', 'javelin-behavior-conpherence-widget-pane' => '1ec93bcf', 'javelin-behavior-countdown-timer' => 'e4cc26b3', @@ -586,7 +586,7 @@ return array( 'javelin-behavior-diffusion-locate-file' => '6d3e1947', 'javelin-behavior-diffusion-pull-lastmodified' => '2b228192', 'javelin-behavior-doorkeeper-tag' => 'e5822781', - 'javelin-behavior-durable-column' => 'a0216452', + 'javelin-behavior-durable-column' => '7ffa744f', 'javelin-behavior-error-log' => '6882e80a', 'javelin-behavior-fancy-datepicker' => 'c51ae228', 'javelin-behavior-global-drag-and-drop' => 'bbdf75ca', @@ -874,6 +874,16 @@ return array( 'javelin-dom', 'javelin-router', ), + '0a5192c4' => array( + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-install', + 'javelin-workflow', + 'javelin-router', + 'javelin-behavior-device', + 'javelin-vector', + ), '0c6946e7' => array( 'javelin-install', 'javelin-dom', @@ -1429,6 +1439,16 @@ return array( 'javelin-uri', 'phabricator-file-upload', ), + '7ffa744f' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-behavior-device', + 'javelin-scrollbar', + 'javelin-quicksand', + 'phabricator-keyboard-shortcut', + 'conpherence-thread-manager', + ), 82439934 => array( 'javelin-behavior', 'javelin-dom', @@ -1578,16 +1598,6 @@ return array( 'javelin-request', 'phabricator-shaped-request', ), - 'a0216452' => array( - 'javelin-behavior', - 'javelin-dom', - 'javelin-stratcom', - 'javelin-behavior-device', - 'javelin-scrollbar', - 'javelin-quicksand', - 'phabricator-keyboard-shortcut', - 'conpherence-thread-manager', - ), 'a0b57eb8' => array( 'javelin-behavior', 'javelin-dom', @@ -1681,16 +1691,6 @@ return array( 'javelin-dom', 'javelin-util', ), - 'bb928342' => array( - 'javelin-dom', - 'javelin-util', - 'javelin-stratcom', - 'javelin-install', - 'javelin-workflow', - 'javelin-router', - 'javelin-behavior-device', - 'javelin-vector', - ), 'bba9eedf' => array( 'javelin-behavior', 'javelin-stratcom', @@ -1803,19 +1803,6 @@ return array( 'javelin-util', 'phabricator-shaped-request', ), - 'db6c0ba7' => array( - 'javelin-behavior', - 'javelin-dom', - 'javelin-util', - 'javelin-stratcom', - 'javelin-workflow', - 'javelin-behavior-device', - 'javelin-history', - 'javelin-vector', - 'phabricator-title', - 'phabricator-shaped-request', - 'conpherence-thread-manager', - ), 'dbbf48b6' => array( 'javelin-behavior', 'javelin-stratcom', @@ -1901,6 +1888,19 @@ return array( 'javelin-behavior-device', 'phabricator-keyboard-shortcut', ), + 'e67cfd8c' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-workflow', + 'javelin-behavior-device', + 'javelin-history', + 'javelin-vector', + 'phabricator-title', + 'phabricator-shaped-request', + 'conpherence-thread-manager', + ), 'e723c323' => array( 'javelin-behavior', 'javelin-stratcom', diff --git a/src/applications/conpherence/controller/ConpherenceUpdateController.php b/src/applications/conpherence/controller/ConpherenceUpdateController.php index 1b7baa2505..3808b75ee8 100644 --- a/src/applications/conpherence/controller/ConpherenceUpdateController.php +++ b/src/applications/conpherence/controller/ConpherenceUpdateController.php @@ -76,11 +76,17 @@ final class ConpherenceUpdateController break; case ConpherenceUpdateActions::MESSAGE: $message = $request->getStr('text'); - $xactions = $editor->generateTransactionsFromText( - $user, - $conpherence, - $message); - $delete_draft = true; + if (strlen($message)) { + $xactions = $editor->generateTransactionsFromText( + $user, + $conpherence, + $message); + $delete_draft = true; + } else { + $action = ConpherenceUpdateActions::LOAD; + $updated = false; + $response_mode = 'ajax'; + } break; case ConpherenceUpdateActions::ADD_PERSON: $person_phids = $request->getArr('add_person'); @@ -397,13 +403,17 @@ final class ConpherenceUpdateController ->withIDs(array($conpherence_id)) ->executeOne(); - if ($need_transactions) { + $non_update = false; + if ($need_transactions && $conpherence->getTransactions()) { $data = ConpherenceTransactionView::renderTransactions( $user, $conpherence, !$this->getRequest()->getExists('minimal_display')); $participant_obj = $conpherence->getParticipant($user->getPHID()); $participant_obj->markUpToDate($conpherence, $data['latest_transaction']); + } else if ($need_transactions) { + $non_update = true; + $data = array(); } else { $data = array(); } @@ -451,6 +461,7 @@ final class ConpherenceUpdateController } $data = $conpherence->getDisplayData($user); $content = array( + 'non_update' => $non_update, 'transactions' => hsprintf('%s', $rendered_transactions), 'conpherence_title' => (string) $data['title'], 'latest_transaction_id' => $new_latest_transaction_id, diff --git a/webroot/rsrc/js/application/conpherence/ConpherenceThreadManager.js b/webroot/rsrc/js/application/conpherence/ConpherenceThreadManager.js index 5294242307..d0c3a020f4 100644 --- a/webroot/rsrc/js/application/conpherence/ConpherenceThreadManager.js +++ b/webroot/rsrc/js/application/conpherence/ConpherenceThreadManager.js @@ -183,6 +183,11 @@ JX.install('ConpherenceThreadManager', { _shouldUpdateDOM: function(r) { if (this._updating && this._updating.threadPHID == this._loadedThreadPHID) { + + if (r.non_update) { + return false; + } + // we have a different, more current update in progress so // return early if (r.latest_transaction_id < this._updating.knownID) { @@ -282,6 +287,11 @@ JX.install('ConpherenceThreadManager', { }, sendMessage: function(form, params) { + // don't bother sending up text if there is nothing to submit + var textarea = JX.DOM.find(form, 'textarea'); + if (!textarea.value.length) { + return; + } params = this._getParams(params); var keep_enabled = true; @@ -292,6 +302,8 @@ JX.install('ConpherenceThreadManager', { this._markUpdated(r); this._didSendMessageCallback(r); + } else if (r.non_update) { + this._didSendMessageCallback(r, true); } })); this.syncWorkflow(workflow, 'finally'); diff --git a/webroot/rsrc/js/application/conpherence/behavior-durable-column.js b/webroot/rsrc/js/application/conpherence/behavior-durable-column.js index 902291773e..0489c05243 100644 --- a/webroot/rsrc/js/application/conpherence/behavior-durable-column.js +++ b/webroot/rsrc/js/application/conpherence/behavior-durable-column.js @@ -140,7 +140,10 @@ JX.behavior('durable-column', function(config, statics) { _focusColumnTextareaNode(); }); - threadManager.setDidSendMessageCallback(function(r) { + threadManager.setDidSendMessageCallback(function(r, non_update) { + if (non_update) { + return; + } var messages = _getColumnMessagesNode(); JX.DOM.appendContent(messages, JX.$H(r.transactions)); scrollbar.scrollTo(messages.scrollHeight); @@ -305,12 +308,6 @@ JX.behavior('durable-column', function(config, statics) { // newline. e.kill(); - var textarea = _getColumnTextareaNode(); - if (!textarea.value.length) { - // If there's no text, don't try to submit the form. - return; - } - _sendMessage(e); }); diff --git a/webroot/rsrc/js/application/conpherence/behavior-menu.js b/webroot/rsrc/js/application/conpherence/behavior-menu.js index 33624e62a4..69689d69eb 100644 --- a/webroot/rsrc/js/application/conpherence/behavior-menu.js +++ b/webroot/rsrc/js/application/conpherence/behavior-menu.js @@ -57,28 +57,30 @@ JX.behavior('conpherence-menu', function(config) { markThreadLoading(true); JX.DOM.alterClass(form_root, 'loading', true); }); - threadManager.setDidSendMessageCallback(function (r) { + threadManager.setDidSendMessageCallback(function (r, non_update) { var root = JX.DOM.find(document, 'div', 'conpherence-layout'); var form_root = JX.DOM.find(root, 'div', 'conpherence-form'); - var messages_root = JX.DOM.find(root, 'div', 'conpherence-message-pane'); - var messages = JX.DOM.find(messages_root, 'div', 'conpherence-messages'); - var fileWidget = null; - try { - fileWidget = JX.DOM.find(root, 'div', 'widgets-files'); - } catch (ex) { - // Ignore; maybe no files widget - } - JX.DOM.appendContent(messages, JX.$H(r.transactions)); - messages.scrollTop = messages.scrollHeight; - - if (fileWidget) { - JX.DOM.setContent( - fileWidget, - JX.$H(r.file_widget) - ); - } var textarea = JX.DOM.find(form_root, 'textarea'); - textarea.value = ''; + if (!non_update) { + var messages_root = JX.DOM.find(root, 'div', 'conpherence-message-pane'); + var messages = JX.DOM.find(messages_root, 'div', 'conpherence-messages'); + var fileWidget = null; + try { + fileWidget = JX.DOM.find(root, 'div', 'widgets-files'); + } catch (ex) { + // Ignore; maybe no files widget + } + JX.DOM.appendContent(messages, JX.$H(r.transactions)); + messages.scrollTop = messages.scrollHeight; + + if (fileWidget) { + JX.DOM.setContent( + fileWidget, + JX.$H(r.file_widget) + ); + } + textarea.value = ''; + } markThreadLoading(false); setTimeout(function() { JX.DOM.focus(textarea); }, 100);