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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user