Conpherence - add support for linking directly to messages regardless of age of message

Summary: Fixes T7757. Since anchor links can't be processed server side, we have to detect the message is old in javascript, then re-loaded the page. This opens up a new corner case where we have to paginate in newer messages, so this also adds support for that.

Test Plan:
- set main query limit to 8 and then visited ZXX#YYY. noted a second quick load of YYY, that YYY ended up highlighted and scrolled to.
- used "show newer messages" and "show older messages" successfully, taking care to make sure transaction ids were all correct with no off by one errors, etc.
- opened and closed durable column to make sure that still works too

Reviewers: chad, epriestley

Reviewed By: epriestley

Subscribers: Korvin, epriestley

Maniphest Tasks: T7757

Differential Revision: https://secure.phabricator.com/D12633
This commit is contained in:
Bob Trahan
2015-04-30 16:54:57 -07:00
parent 5ca0070446
commit b199f7066c
9 changed files with 237 additions and 67 deletions

View File

@@ -119,6 +119,7 @@ JX.behavior('conpherence-menu', function(config) {
var messages_root = JX.DOM.find(root, 'div', 'conpherence-message-pane');
var messages = JX.DOM.find(messages_root, 'div', 'conpherence-messages');
scrollbar = new JX.Scrollbar(messages);
scrollbar.setAsScrollFrame();
}
init();
@@ -317,12 +318,26 @@ JX.behavior('conpherence-menu', function(config) {
buildDeviceWidgetSelector : build_device_widget_selector
});
}
var _firstScroll = true;
function _scrollMessageWindow() {
if (_firstScroll) {
_firstScroll = false;
// let the standard #anchor tech take over
// We want to let the standard #anchor tech take over after we make sure
// we don't have to present the user with a "load older message?" dialog
if (window.location.hash) {
var hash = window.location.hash.replace(/^#/, '');
try {
JX.$('anchor-' + hash);
} catch (ex) {
var uri = '/conpherence/' +
_thread.selected + '/' + hash + '/';
threadManager.setLoadThreadURI(uri);
threadManager.loadThreadByID(_thread.selected, true);
_firstScroll = true;
return;
}
return;
}
}
@@ -374,7 +389,7 @@ JX.behavior('conpherence-menu', function(config) {
var form = JX.DOM.find(root, 'form', 'conpherence-pontificate');
var data = e.getNodeData('conpherence-edit-metadata');
var header = JX.DOM.find(root, 'div', 'conpherence-header-pane');
var messages = JX.DOM.find(root, 'div', 'conpherence-messages');
var messages = scrollbar.getContentNode();
new JX.Workflow.newFromForm(form, data)
.setHandler(JX.bind(this, function(r) {
@@ -400,21 +415,21 @@ JX.behavior('conpherence-menu', function(config) {
.start();
});
var _loadingTransactionID = null;
var _oldLoadingTransactionID = null;
JX.Stratcom.listen('click', 'show-older-messages', function(e) {
e.kill();
var data = e.getNodeData('show-older-messages');
if (data.oldest_transaction_id == _loadingTransactionID) {
if (data.oldest_transaction_id == _oldLoadingTransactionID) {
return;
}
_loadingTransactionID = data.oldest_transaction_id;
_oldLoadingTransactionID = data.oldest_transaction_id;
var node = e.getNode('show-older-messages');
JX.DOM.setContent(node, 'Loading...');
JX.DOM.alterClass(node, 'conpherence-show-older-messages-loading', true);
JX.DOM.alterClass(node, 'conpherence-show-more-messages-loading', true);
var conf_id = _thread.selected;
var root = JX.DOM.find(document, 'div', 'conpherence-layout');
var messages_root = JX.DOM.find(root, 'div', 'conpherence-messages');
var messages_root = scrollbar.getContentNode();
new JX.Workflow(config.baseURI + conf_id + '/', data)
.setHandler(function(r) {
JX.DOM.remove(node);
@@ -425,6 +440,31 @@ JX.behavior('conpherence-menu', function(config) {
}).start();
});
var _newLoadingTransactionID = null;
JX.Stratcom.listen('click', 'show-newer-messages', function(e) {
e.kill();
var data = e.getNodeData('show-newer-messages');
if (data.newest_transaction_id == _newLoadingTransactionID) {
return;
}
_newLoadingTransactionID = data.newest_transaction_id;
var node = e.getNode('show-newer-messages');
JX.DOM.setContent(node, 'Loading...');
JX.DOM.alterClass(node, 'conpherence-show-more-messages-loading', true);
var conf_id = _thread.selected;
var messages_root = scrollbar.getContentNode();
new JX.Workflow(config.baseURI + conf_id + '/', data)
.setHandler(function(r) {
JX.DOM.remove(node);
var messages = JX.$H(r.messages);
JX.DOM.appendContent(
messages_root,
JX.$H(messages));
}).start();
});
/**
* On devices, we just show a thread list, so we don't want to automatically
* select or load any threads. On desktop, we automatically select the first