/** * @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'); } 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]; 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(); }); });