From 4a8495495738cbdffe3b15e2292334c77add6cdc Mon Sep 17 00:00:00 2001 From: Chad Little Date: Mon, 10 Apr 2017 14:39:36 -0700 Subject: [PATCH] Prevent Send on Enter in Fullscreen Remarkup Mode Summary: Fixes T12138. Test for the presence of being in fullscreen mode, and disable send on enter if present. Side note, I'd love a first class "hasClass" type Javelin function. Test Plan: - Go to Conpherence - Type some smack, see it send on enter - Go fullscreen like a boss - Let the words flow - Close fullscreen, then send on enter. - (might be nice someday to add a "submit" button to fullscreen editor) Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin Maniphest Tasks: T12138 Differential Revision: https://secure.phabricator.com/D17590 --- resources/celerity/map.php | 50 +++++++++---------- .../controller/ConpherenceViewController.php | 1 + .../control/PhabricatorRemarkupControl.php | 11 ++++ .../conpherence/behavior-pontificate.js | 23 --------- .../behavior-phabricator-remarkup-assist.js | 44 +++++++++++++--- 5 files changed, 75 insertions(+), 54 deletions(-) diff --git a/resources/celerity/map.php b/resources/celerity/map.php index f45c16ec69..e9b50dc81e 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -8,9 +8,9 @@ return array( 'names' => array( 'conpherence.pkg.css' => '82aca405', - 'conpherence.pkg.js' => '6249a1cf', + 'conpherence.pkg.js' => '281b1a73', 'core.pkg.css' => '1bf8fa70', - 'core.pkg.js' => '021685f1', + 'core.pkg.js' => 'fbc1c380', 'darkconsole.pkg.js' => 'e7393ebb', 'differential.pkg.css' => '90b30783', 'differential.pkg.js' => 'ddfeb49b', @@ -375,7 +375,7 @@ return array( 'rsrc/js/application/conpherence/behavior-durable-column.js' => 'aa3bd034', 'rsrc/js/application/conpherence/behavior-menu.js' => '7524fcfa', 'rsrc/js/application/conpherence/behavior-participant-pane.js' => '8604caa8', - 'rsrc/js/application/conpherence/behavior-pontificate.js' => 'f2e58483', + 'rsrc/js/application/conpherence/behavior-pontificate.js' => '55616e04', 'rsrc/js/application/conpherence/behavior-quicksand-blacklist.js' => '7927a7d3', 'rsrc/js/application/conpherence/behavior-toggle-widget.js' => '3dbf94d5', 'rsrc/js/application/countdown/timer.js' => 'e4cc26b3', @@ -503,7 +503,7 @@ return array( 'rsrc/js/core/behavior-object-selector.js' => 'e0ec7f2f', 'rsrc/js/core/behavior-oncopy.js' => '2926fff2', 'rsrc/js/core/behavior-phabricator-nav.js' => '08675c6d', - 'rsrc/js/core/behavior-phabricator-remarkup-assist.js' => 'a0777ea3', + 'rsrc/js/core/behavior-phabricator-remarkup-assist.js' => '0ca788bd', 'rsrc/js/core/behavior-read-only-warning.js' => 'ba158207', 'rsrc/js/core/behavior-refresh-csrf.js' => 'ab2f381b', 'rsrc/js/core/behavior-remarkup-preview.js' => '4b700e9e', @@ -600,7 +600,7 @@ return array( 'javelin-behavior-config-reorder-fields' => 'b6993408', 'javelin-behavior-conpherence-menu' => '7524fcfa', 'javelin-behavior-conpherence-participant-pane' => '8604caa8', - 'javelin-behavior-conpherence-pontificate' => 'f2e58483', + 'javelin-behavior-conpherence-pontificate' => '55616e04', 'javelin-behavior-conpherence-search' => '9bbf3762', 'javelin-behavior-countdown-timer' => 'e4cc26b3', 'javelin-behavior-dark-console' => 'f411b6ae', @@ -664,7 +664,7 @@ return array( 'javelin-behavior-phabricator-notification-example' => '8ce821c5', 'javelin-behavior-phabricator-object-selector' => 'e0ec7f2f', 'javelin-behavior-phabricator-oncopy' => '2926fff2', - 'javelin-behavior-phabricator-remarkup-assist' => 'a0777ea3', + 'javelin-behavior-phabricator-remarkup-assist' => '0ca788bd', 'javelin-behavior-phabricator-reveal-content' => '60821bc7', 'javelin-behavior-phabricator-search-typeahead' => '06c32383', 'javelin-behavior-phabricator-show-older-transactions' => '94c65b72', @@ -988,6 +988,17 @@ return array( 'javelin-dom', 'javelin-router', ), + '0ca788bd' => array( + 'javelin-behavior', + 'javelin-stratcom', + 'javelin-dom', + 'phabricator-phtize', + 'phabricator-textareautils', + 'javelin-workflow', + 'javelin-vector', + 'phuix-autocomplete', + 'javelin-mask', + ), '0f764c35' => array( 'javelin-install', 'javelin-util', @@ -1298,6 +1309,14 @@ return array( 'javelin-request', 'javelin-typeahead-source', ), + '55616e04' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-workflow', + 'javelin-stratcom', + 'conpherence-thread-manager', + ), '558829c2' => array( 'javelin-stratcom', 'javelin-behavior', @@ -1686,17 +1705,6 @@ return array( 'javelin-dom', 'javelin-vector', ), - 'a0777ea3' => array( - 'javelin-behavior', - 'javelin-stratcom', - 'javelin-dom', - 'phabricator-phtize', - 'phabricator-textareautils', - 'javelin-workflow', - 'javelin-vector', - 'phuix-autocomplete', - 'javelin-mask', - ), 'a0b57eb8' => array( 'javelin-behavior', 'javelin-dom', @@ -2165,14 +2173,6 @@ return array( 'f12cbc9f' => array( 'phui-oi-list-view-css', ), - 'f2e58483' => array( - 'javelin-behavior', - 'javelin-dom', - 'javelin-util', - 'javelin-workflow', - 'javelin-stratcom', - 'conpherence-thread-manager', - ), 'f411b6ae' => array( 'javelin-behavior', 'javelin-stratcom', diff --git a/src/applications/conpherence/controller/ConpherenceViewController.php b/src/applications/conpherence/controller/ConpherenceViewController.php index 8d93f03b7d..1fbb338822 100644 --- a/src/applications/conpherence/controller/ConpherenceViewController.php +++ b/src/applications/conpherence/controller/ConpherenceViewController.php @@ -184,6 +184,7 @@ final class ConpherenceViewController extends id(new PhabricatorRemarkupControl()) ->setUser($user) ->setName('text') + ->setSendOnEnter(true) ->setValue($draft->getDraft())); $status_view = phutil_tag( diff --git a/src/view/form/control/PhabricatorRemarkupControl.php b/src/view/form/control/PhabricatorRemarkupControl.php index 75054b9575..5d0cc079e7 100644 --- a/src/view/form/control/PhabricatorRemarkupControl.php +++ b/src/view/form/control/PhabricatorRemarkupControl.php @@ -5,6 +5,7 @@ final class PhabricatorRemarkupControl extends AphrontFormTextAreaControl { private $disableMacro = false; private $disableFullScreen = false; private $canPin; + private $sendOnEnter = false; public function setDisableMacros($disable) { $this->disableMacro = $disable; @@ -25,6 +26,15 @@ final class PhabricatorRemarkupControl extends AphrontFormTextAreaControl { return $this->canPin; } + public function setSendOnEnter($soe) { + $this->sendOnEnter = $soe; + return $this; + } + + public function getSendOnEnter() { + return $this->sendOnEnter; + } + protected function renderInput() { $id = $this->getID(); if (!$id) { @@ -78,6 +88,7 @@ final class PhabricatorRemarkupControl extends AphrontFormTextAreaControl { ), 'canPin' => $this->getCanPin(), 'disabled' => $this->getDisabled(), + 'sendOnEnter' => $this->getSendOnEnter(), 'rootID' => $root_id, 'autocompleteMap' => (object)array( 64 => array( // "@" diff --git a/webroot/rsrc/js/application/conpherence/behavior-pontificate.js b/webroot/rsrc/js/application/conpherence/behavior-pontificate.js index 5f9e24a915..537961ec71 100644 --- a/webroot/rsrc/js/application/conpherence/behavior-pontificate.js +++ b/webroot/rsrc/js/application/conpherence/behavior-pontificate.js @@ -22,27 +22,4 @@ JX.behavior('conpherence-pontificate', function() { 'conpherence-pontificate', _sendMessage); - // Send on enter if the shift key is not held. - JX.Stratcom.listen( - 'keydown', - 'conpherence-pontificate', - function(e) { - if (e.getSpecialKey() != 'return') { - return; - } - - var raw = e.getRawEvent(); - if (raw.shiftKey) { - // If the shift key is pressed, let the browser write a newline into - // the textarea. - return; - } - - // From here on, interpret this as a "send" action, not a literal - // newline. - e.kill(); - - _sendMessage(e); - }); - }); diff --git a/webroot/rsrc/js/core/behavior-phabricator-remarkup-assist.js b/webroot/rsrc/js/core/behavior-phabricator-remarkup-assist.js index f4cbc4f4fa..a53c567607 100644 --- a/webroot/rsrc/js/core/behavior-phabricator-remarkup-assist.js +++ b/webroot/rsrc/js/core/behavior-phabricator-remarkup-assist.js @@ -37,7 +37,7 @@ JX.behavior('phabricator-remarkup-assist', function(config) { // First, disable any active mode. if (edit_root) { - if (edit_mode == 'fa-arrows-alt') { + if (edit_mode == 'fullscreen') { JX.DOM.alterClass(edit_root, 'remarkup-control-fullscreen-mode', false); JX.DOM.alterClass(document.body, 'remarkup-fullscreen-mode', false); JX.Mask.hide('jx-light-mask'); @@ -58,7 +58,7 @@ JX.behavior('phabricator-remarkup-assist', function(config) { edit_mode = mode; // Now, apply the new mode. - if (mode == 'fa-arrows-alt') { + if (mode == 'fullscreen') { JX.DOM.alterClass(edit_root, 'remarkup-control-fullscreen-mode', true); JX.DOM.alterClass(document.body, 'remarkup-fullscreen-mode', true); JX.Mask.show('jx-light-mask'); @@ -118,7 +118,7 @@ JX.behavior('phabricator-remarkup-assist', function(config) { if (!edit_root) { return; } - if (edit_mode != 'fa-arrows-alt') { + if (edit_mode != 'fullscreen') { return; } @@ -140,7 +140,7 @@ JX.behavior('phabricator-remarkup-assist', function(config) { return; } - if (edit_mode != 'fa-arrows-alt') { + if (edit_mode != 'fullscreen') { return; } @@ -261,10 +261,10 @@ JX.behavior('phabricator-remarkup-assist', function(config) { break; case 'fa-arrows-alt': set_pinned_mode(root, false); - if (edit_mode == 'fa-arrows-alt') { + if (edit_mode == 'fullscreen') { set_edit_mode(root, 'normal'); } else { - set_edit_mode(root, 'fa-arrows-alt'); + set_edit_mode(root, 'fullscreen'); } break; case 'fa-eye': @@ -385,4 +385,36 @@ JX.behavior('phabricator-remarkup-assist', function(config) { .register(); } + if (config.sendOnEnter) { + // Send on enter if the shift key is not held. + JX.DOM.listen(area, 'keydown', null, + function(e) { + if (e.getSpecialKey() != 'return') { + return; + } + + var raw = e.getRawEvent(); + if (raw.shiftKey) { + // If the shift key is pressed, let the browser write a newline into + // the textarea. + return; + } + + if (edit_mode == 'fullscreen') { + // Don't send on enter in fullscreen + return; + } + + // From here on, interpret this as a "send" action, not a literal + // newline. + e.kill(); + + // This allows 'workflow' and similar actions to take effect. + // Such as pontificate in Conpherence + var form = e.getNode('tag:form'); + var r = JX.DOM.invoke(form, 'didSyntheticSubmit'); + + }); + } + });