mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-04 20:52:43 +01:00
dbde4b9ff2
Summary: See D2714#15. # Give anchors an `id` equal to their `name` so JX.$ can find them. # Listen for `click` s on `<a>` s instead of `hashchange` s to make toggling a bit more correct and consistent. # Add a placeholder menu item when the file is unloaded. A previous patch by @jungejason had left the item blank in that case. # In fixing (1) I found another exception when clicking on ToC links. Since those links are `differential-load`, they try to load the file before jumping to it. However, loading destroys the node it's looking for, so if you jump to an already-loaded file JX.$ complains at you. Test Plan: Make a giant diff. Click on links and try toggling files. Reviewers: epriestley, vrana Reviewed By: vrana CC: vrana, aran, Korvin Maniphest Tasks: T370 Differential Revision: https://secure.phabricator.com/D3185
146 lines
4.3 KiB
JavaScript
146 lines
4.3 KiB
JavaScript
/**
|
|
* @provides javelin-behavior-differential-dropdown-menus
|
|
* @requires javelin-behavior
|
|
* javelin-dom
|
|
* javelin-util
|
|
* javelin-stratcom
|
|
* phabricator-dropdown-menu
|
|
* phabricator-menu-item
|
|
*/
|
|
|
|
JX.behavior('differential-dropdown-menus', function(config) {
|
|
|
|
function show_more(container) {
|
|
var nodes = JX.DOM.scry(container, 'tr', 'context-target');
|
|
for (var ii = 0; ii < nodes.length; ii++) {
|
|
var show = JX.DOM.scry(nodes[ii], 'a', 'show-more');
|
|
for (var jj = 0; jj < show.length; jj++) {
|
|
if (JX.Stratcom.getData(show[jj]).type != 'all') {
|
|
continue;
|
|
}
|
|
var event_data = {
|
|
context : nodes[ii],
|
|
show : show[jj]
|
|
};
|
|
JX.Stratcom.invoke('differential-reveal-context', null, event_data);
|
|
}
|
|
}
|
|
}
|
|
|
|
function build_menu(button, data) {
|
|
|
|
function link_to(name, uri) {
|
|
var item = new JX.PhabricatorMenuItem(
|
|
name,
|
|
JX.bind(null, window.open, uri),
|
|
uri);
|
|
item.setDisabled(!uri);
|
|
return item;
|
|
}
|
|
|
|
var reveal_item = new JX.PhabricatorMenuItem('', function () {
|
|
show_more(JX.$(data.containerID));
|
|
});
|
|
|
|
var diffusion_item;
|
|
if (data.diffusionURI) {
|
|
// Show this only if we have a link, since when this appears in Diffusion
|
|
// it is otherwise potentially confusing.
|
|
diffusion_item = link_to('Browse in Diffusion', data.diffusionURI);
|
|
}
|
|
|
|
var menu = new JX.PhabricatorDropdownMenu(buttons[ii])
|
|
.addItem(reveal_item);
|
|
|
|
var visible_item = new JX.PhabricatorMenuItem('', function () {
|
|
JX.Stratcom.invoke('differential-toggle-file', null, {
|
|
diff: JX.DOM.scry(JX.$(data.containerID), 'table', 'differential-diff'),
|
|
});
|
|
});
|
|
menu.addItem(visible_item);
|
|
|
|
if (diffusion_item) {
|
|
menu.addItem(diffusion_item);
|
|
}
|
|
|
|
menu.addItem(link_to('View Standalone', data.standaloneURI));
|
|
|
|
if (data.leftURI) {
|
|
menu.addItem(link_to('Show Raw File (Left)', data.leftURI));
|
|
}
|
|
|
|
if (data.rightURI) {
|
|
menu.addItem(link_to('Show Raw File (Right)', data.rightURI));
|
|
}
|
|
|
|
if (data.editor) {
|
|
menu.addItem(new JX.PhabricatorMenuItem(
|
|
'Open in Editor',
|
|
JX.bind(null, location.assign, data.editor), // Open in the same window.
|
|
data.editor));
|
|
}
|
|
|
|
if (data.editorConfigure) {
|
|
menu.addItem(link_to('Configure Editor', data.editorConfigure));
|
|
}
|
|
|
|
menu.listen(
|
|
'open',
|
|
function() {
|
|
|
|
// When the user opens the menu, check if there are any "Show More"
|
|
// links in the changeset body. If there aren't, disable the "Show
|
|
// Entire File" menu item since it won't change anything.
|
|
|
|
var nodes = JX.DOM.scry(JX.$(data.containerID), 'a', 'show-more');
|
|
if (nodes.length) {
|
|
reveal_item.setDisabled(false);
|
|
reveal_item.setName('Show Entire File');
|
|
} else {
|
|
reveal_item.setDisabled(true);
|
|
reveal_item.setName('Entire File Shown');
|
|
}
|
|
|
|
visible_item.setDisabled(true);
|
|
visible_item.setName("Can't Toggle Unloaded File");
|
|
var diffs = JX.DOM.scry(JX.$(data.containerID),
|
|
'table', 'differential-diff');
|
|
if (diffs.length > 1) {
|
|
JX.$E(
|
|
'More than one node with sigil "differential-diff" was found in "'+
|
|
data.containerID+'."');
|
|
} else if (diffs.length == 1) {
|
|
diff = diffs[0];
|
|
visible_item.setDisabled(false);
|
|
if (JX.Stratcom.getData(diff).hidden) {
|
|
visible_item.setName('Expand File');
|
|
} else {
|
|
visible_item.setName('Collapse File');
|
|
}
|
|
} else {
|
|
// Do nothing when there is no diff shown in the table. For example,
|
|
// the file is binary.
|
|
}
|
|
});
|
|
}
|
|
|
|
var buttons = JX.DOM.scry(window.document, 'a', 'differential-view-options');
|
|
for (var ii = 0; ii < buttons.length; ii++) {
|
|
build_menu(buttons[ii], JX.Stratcom.getData(buttons[ii]));
|
|
}
|
|
|
|
JX.Stratcom.listen(
|
|
'click',
|
|
'differential-reveal-all',
|
|
function(e) {
|
|
var containers = JX.DOM.scry(
|
|
JX.$('differential-review-stage'),
|
|
'div',
|
|
'differential-changeset');
|
|
for (var i=0; i < containers.length; i++) {
|
|
show_more(containers[i]);
|
|
}
|
|
e.kill();
|
|
});
|
|
|
|
});
|