mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-10 00:42:41 +01:00
Conpherence - improve stack re: non-update updates
Summary: Fixes T7761. Fixes T7318. When we send an empty message to the server, pretend its just a request to load the page. Make load a bit smarter such that if we don't get back any transactions, rather than error like the fool, just send down to the client the notion of a 'non_update'. Instrument the client to just turn off the appropriate loading state, etc for a non update. T7318 is a tricky beast since we don't know exactly how to reproduce it but if / when it occurs again it would be some other bizarre application behavior maybe? We won't be getting the execption anymore, that's for sure. Test Plan: removed code in `ConpherenceThreadManager.sendMessage` that protects against sending empty messages. sent empty messages (non updates) like whoa and everything worked on both durable column and main column view. re-added the code in `ConpherenceThreadManager.sendMessage` and noted empty messages did not send while any text including a space sent up nicely Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin, epriestley Maniphest Tasks: T7318, T7761 Differential Revision: https://secure.phabricator.com/D12339
This commit is contained in:
parent
540e38d20e
commit
b14ca38940
5 changed files with 93 additions and 71 deletions
|
@ -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',
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue