diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -13,7 +13,7 @@ 'core.pkg.js' => '2ff7879f', 'darkconsole.pkg.js' => '1f9a31bc', 'differential.pkg.css' => '90b30783', - 'differential.pkg.js' => 'ef6c7cfc', + 'differential.pkg.js' => '51d9bebe', 'diffusion.pkg.css' => 'b93d9b8c', 'diffusion.pkg.js' => '84c8f8fd', 'favicon.ico' => '30672e08', @@ -390,17 +390,16 @@ 'rsrc/js/application/dashboard/behavior-dashboard-move-panels.js' => '408bf173', 'rsrc/js/application/dashboard/behavior-dashboard-query-panel-select.js' => '453c5375', 'rsrc/js/application/dashboard/behavior-dashboard-tab-panel.js' => 'd4eecc63', - 'rsrc/js/application/diff/DiffChangeset.js' => 'a1189df6', - 'rsrc/js/application/diff/DiffChangesetList.js' => '2329e40e', + 'rsrc/js/application/diff/DiffChangeset.js' => 'ed7bc580', + 'rsrc/js/application/diff/DiffChangesetList.js' => 'f9ea2d8b', 'rsrc/js/application/diff/behavior-preview-link.js' => '051c7832', 'rsrc/js/application/differential/DifferentialInlineCommentEditor.js' => '2e3f9738', 'rsrc/js/application/differential/behavior-comment-jump.js' => '4fdb476d', 'rsrc/js/application/differential/behavior-comment-preview.js' => 'b064af76', 'rsrc/js/application/differential/behavior-diff-radios.js' => 'e1ff79b1', - 'rsrc/js/application/differential/behavior-dropdown-menus.js' => 'c3d216cb', 'rsrc/js/application/differential/behavior-edit-inline-comments.js' => 'c0f1c3b5', 'rsrc/js/application/differential/behavior-keyboard-nav.js' => '92904457', - 'rsrc/js/application/differential/behavior-populate.js' => '00d88bc4', + 'rsrc/js/application/differential/behavior-populate.js' => '7356b23d', 'rsrc/js/application/differential/behavior-toggle-files.js' => 'ca3f91eb', 'rsrc/js/application/differential/behavior-user-select.js' => 'a8d8459d', 'rsrc/js/application/diffusion/DiffusionLocateFileSource.js' => 'c93358e3', @@ -624,11 +623,10 @@ 'javelin-behavior-diff-preview-link' => '051c7832', 'javelin-behavior-differential-comment-jump' => '4fdb476d', 'javelin-behavior-differential-diff-radios' => 'e1ff79b1', - 'javelin-behavior-differential-dropdown-menus' => 'c3d216cb', 'javelin-behavior-differential-edit-inline-comments' => 'c0f1c3b5', 'javelin-behavior-differential-feedback-preview' => 'b064af76', 'javelin-behavior-differential-keyboard-navigation' => '92904457', - 'javelin-behavior-differential-populate' => '00d88bc4', + 'javelin-behavior-differential-populate' => '7356b23d', 'javelin-behavior-differential-toggle-files' => 'ca3f91eb', 'javelin-behavior-differential-user-select' => 'a8d8459d', 'javelin-behavior-diffusion-browse-file' => '054a0f0b', @@ -786,8 +784,8 @@ 'phabricator-darklog' => 'c8e1ffe3', 'phabricator-darkmessage' => 'c48cccdd', 'phabricator-dashboard-css' => 'fe5b1869', - 'phabricator-diff-changeset' => 'a1189df6', - 'phabricator-diff-changeset-list' => '2329e40e', + 'phabricator-diff-changeset' => 'ed7bc580', + 'phabricator-diff-changeset-list' => 'f9ea2d8b', 'phabricator-drag-and-drop-file-upload' => '58dea2fa', 'phabricator-draggable-list' => 'bea6e7f4', 'phabricator-fatal-config-template-css' => '8f18fa41', @@ -922,14 +920,6 @@ 'unhandled-exception-css' => '4c96257a', ), 'requires' => array( - '00d88bc4' => array( - 'javelin-behavior', - 'javelin-dom', - 'javelin-stratcom', - 'phabricator-tooltip', - 'phabricator-diff-changeset-list', - 'phabricator-diff-changeset', - ), '013ffff9' => array( 'javelin-install', 'javelin-util', @@ -1087,9 +1077,6 @@ 'javelin-workflow', 'javelin-util', ), - '2329e40e' => array( - 'javelin-install', - ), 26167537 => array( 'javelin-install', 'javelin-dom', @@ -1471,6 +1458,14 @@ 'javelin-behavior', 'javelin-dom', ), + '7356b23d' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + 'phabricator-tooltip', + 'phabricator-diff-changeset-list', + 'phabricator-diff-changeset', + ), '73d09eef' => array( 'javelin-behavior', 'javelin-vector', @@ -1706,16 +1701,6 @@ 'javelin-util', 'phabricator-keyboard-shortcut', ), - 'a1189df6' => array( - 'javelin-dom', - 'javelin-util', - 'javelin-stratcom', - 'javelin-install', - 'javelin-workflow', - 'javelin-router', - 'javelin-behavior-device', - 'javelin-vector', - ), 'a155550f' => array( 'javelin-install', 'javelin-dom', @@ -1942,18 +1927,6 @@ 'javelin-vector', 'differential-inline-comment-editor', ), - 'c3d216cb' => array( - 'javelin-behavior', - 'javelin-dom', - 'javelin-util', - 'javelin-stratcom', - 'javelin-workflow', - 'phuix-dropdown-menu', - 'phuix-action-list-view', - 'phuix-action-view', - 'phabricator-phtize', - 'phabricator-diff-changeset', - ), 'c420b0b9' => array( 'javelin-behavior', 'javelin-behavior-device', @@ -2182,6 +2155,16 @@ 'javelin-dom', 'phabricator-draggable-list', ), + 'ed7bc580' => array( + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-install', + 'javelin-workflow', + 'javelin-router', + 'javelin-behavior-device', + 'javelin-vector', + ), 'eded9ee8' => array( 'javelin-behavior', 'javelin-typeahead-ondemand-source', @@ -2239,6 +2222,9 @@ 'javelin-install', 'javelin-dom', ), + 'f9ea2d8b' => array( + 'javelin-install', + ), 'fbe497e7' => array( 'javelin-behavior', 'javelin-util', @@ -2465,7 +2451,6 @@ 'javelin-behavior-repository-crossreference', 'javelin-behavior-load-blame', 'differential-inline-comment-editor', - 'javelin-behavior-differential-dropdown-menus', 'javelin-behavior-differential-toggle-files', 'javelin-behavior-differential-user-select', 'javelin-behavior-aphront-more', diff --git a/resources/celerity/packages.php b/resources/celerity/packages.php --- a/resources/celerity/packages.php +++ b/resources/celerity/packages.php @@ -204,7 +204,6 @@ 'javelin-behavior-load-blame', 'differential-inline-comment-editor', - 'javelin-behavior-differential-dropdown-menus', 'javelin-behavior-differential-toggle-files', 'javelin-behavior-differential-user-select', 'javelin-behavior-aphront-more', diff --git a/src/applications/differential/view/DifferentialChangesetListView.php b/src/applications/differential/view/DifferentialChangesetListView.php --- a/src/applications/differential/view/DifferentialChangesetListView.php +++ b/src/applications/differential/view/DifferentialChangesetListView.php @@ -138,29 +138,6 @@ ), )); - Javelin::initBehavior( - 'differential-dropdown-menus', - array( - 'pht' => array( - 'Open in Editor' => pht('Open in Editor'), - 'Show All Context' => pht('Show All Context'), - 'All Context Shown' => pht('All Context Shown'), - "Can't Toggle Unloaded File" => pht("Can't Toggle Unloaded File"), - 'Expand File' => pht('Expand File'), - 'Collapse File' => pht('Collapse File'), - 'Browse in Diffusion' => pht('Browse in Diffusion'), - 'View Standalone' => pht('View Standalone'), - 'Show Raw File (Left)' => pht('Show Raw File (Left)'), - 'Show Raw File (Right)' => pht('Show Raw File (Right)'), - 'Configure Editor' => pht('Configure Editor'), - 'Load Changes' => pht('Load Changes'), - 'View Side-by-Side' => pht('View Side-by-Side'), - 'View Unified' => pht('View Unified'), - 'Change Text Encoding...' => pht('Change Text Encoding...'), - 'Highlight As...' => pht('Highlight As...'), - ), - )); - $renderer = DifferentialChangesetParser::getDefaultRendererForViewer( $viewer); @@ -238,8 +215,28 @@ $this->requireResource('aphront-tooltip-css'); - $this->initBehavior('differential-populate', array( + $this->initBehavior( + 'differential-populate', + array( 'changesetViewIDs' => $ids, + 'pht' => array( + 'Open in Editor' => pht('Open in Editor'), + 'Show All Context' => pht('Show All Context'), + 'All Context Shown' => pht('All Context Shown'), + "Can't Toggle Unloaded File" => pht("Can't Toggle Unloaded File"), + 'Expand File' => pht('Expand File'), + 'Collapse File' => pht('Collapse File'), + 'Browse in Diffusion' => pht('Browse in Diffusion'), + 'View Standalone' => pht('View Standalone'), + 'Show Raw File (Left)' => pht('Show Raw File (Left)'), + 'Show Raw File (Right)' => pht('Show Raw File (Right)'), + 'Configure Editor' => pht('Configure Editor'), + 'Load Changes' => pht('Load Changes'), + 'View Side-by-Side' => pht('View Side-by-Side'), + 'View Unified' => pht('View Unified'), + 'Change Text Encoding...' => pht('Change Text Encoding...'), + 'Highlight As...' => pht('Highlight As...'), + ), )); $this->initBehavior('differential-comment-jump', array()); diff --git a/webroot/rsrc/js/application/diff/DiffChangeset.js b/webroot/rsrc/js/application/diff/DiffChangeset.js --- a/webroot/rsrc/js/application/diff/DiffChangeset.js +++ b/webroot/rsrc/js/application/diff/DiffChangeset.js @@ -174,6 +174,20 @@ return this; }, + loadAllContext: function() { + var nodes = JX.DOM.scry(this._node, '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++) { + var data = JX.Stratcom.getData(show[jj]); + if (data.type != 'all') { + continue; + } + this.loadContext(data.range, nodes[ii], true); + } + } + }, + _startContentWorkflow: function(workflow) { var routable = workflow.getRoutable(); diff --git a/webroot/rsrc/js/application/diff/DiffChangesetList.js b/webroot/rsrc/js/application/diff/DiffChangesetList.js --- a/webroot/rsrc/js/application/diff/DiffChangesetList.js +++ b/webroot/rsrc/js/application/diff/DiffChangesetList.js @@ -13,6 +13,13 @@ var onmore = JX.bind(this, this._ifawake, this._onmore); JX.Stratcom.listen('click', 'show-more', onmore); + + var onmenu = JX.bind(this, this._ifawake, this._onmenu); + JX.Stratcom.listen('click', 'differential-view-options', onmenu); + }, + + properties: { + translations: null }, members: { @@ -80,8 +87,221 @@ var target = e.getNode('context-target'); changeset.loadContext(data.range, target); + }, + + _onmenu: function(e) { + var button = e.getNode('differential-view-options'); + + var data = JX.Stratcom.getData(button); + if (data.menu) { + // We've already built this menu, so we can let the menu itself handle + // the event. + return; + } + + e.prevent(); + + var pht = this.getTranslations(); + + var node = JX.DOM.findAbove( + button, + 'div', + 'differential-changeset'); + + var changeset = this.getChangesetForNode(node); + + var menu = new JX.PHUIXDropdownMenu(button); + var list = new JX.PHUIXActionListView(); + + var add_link = function(icon, name, href, local) { + if (!href) { + return; + } + + var link = new JX.PHUIXActionView() + .setIcon(icon) + .setName(name) + .setHref(href) + .setHandler(function(e) { + if (local) { + window.location.assign(href); + } else { + window.open(href); + } + menu.close(); + e.prevent(); + }); + + list.addItem(link); + return link; + }; + + var reveal_item = new JX.PHUIXActionView() + .setIcon('fa-eye'); + list.addItem(reveal_item); + + var visible_item = new JX.PHUIXActionView() + .setHandler(function(e) { + var diff = JX.DOM.scry( + JX.$(data.containerID), + 'table', + 'differential-diff'); + + JX.Stratcom.invoke('differential-toggle-file', null, {diff: diff}); + e.prevent(); + menu.close(); + }); + list.addItem(visible_item); + + add_link('fa-file-text', pht('Browse in Diffusion'), data.diffusionURI); + add_link('fa-file-o', pht('View Standalone'), data.standaloneURI); + + var up_item = new JX.PHUIXActionView() + .setHandler(function(e) { + if (changeset.isLoaded()) { + var renderer = changeset.getRenderer(); + if (renderer == '1up') { + renderer = '2up'; + } else { + renderer = '1up'; + } + changeset.setRenderer(renderer); + } + changeset.reload(); + + e.prevent(); + menu.close(); + }); + list.addItem(up_item); + + var encoding_item = new JX.PHUIXActionView() + .setIcon('fa-font') + .setName(pht('Change Text Encoding...')) + .setHandler(function(e) { + var params = { + encoding: changeset.getEncoding() + }; + + new JX.Workflow('/services/encoding/', params) + .setHandler(function(r) { + changeset.setEncoding(r.encoding); + changeset.reload(); + }) + .start(); + + e.prevent(); + menu.close(); + }); + list.addItem(encoding_item); + + var highlight_item = new JX.PHUIXActionView() + .setIcon('fa-sun-o') + .setName(pht('Highlight As...')) + .setHandler(function(e) { + var params = { + highlight: changeset.getHighlight() + }; + + new JX.Workflow('/services/highlight/', params) + .setHandler(function(r) { + changeset.setHighlight(r.highlight); + changeset.reload(); + }) + .start(); + + e.prevent(); + menu.close(); + }); + list.addItem(highlight_item); + + add_link('fa-arrow-left', pht('Show Raw File (Left)'), data.leftURI); + add_link('fa-arrow-right', pht('Show Raw File (Right)'), data.rightURI); + add_link('fa-pencil', pht('Open in Editor'), data.editor, true); + add_link('fa-wrench', pht('Configure Editor'), data.editorConfigure); + + menu.setContent(list.getNode()); + + 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) + .setName(pht('Show All Context')) + .setIcon('fa-file-o') + .setHandler(function(e) { + changeset.loadAllContext(); + e.prevent(); + menu.close(); + }); + } else { + reveal_item + .setDisabled(true) + .setIcon('fa-file') + .setName(pht('All Context Shown')) + .setHandler(function(e) { e.prevent(); }); + } + + encoding_item.setDisabled(!changeset.isLoaded()); + highlight_item.setDisabled(!changeset.isLoaded()); + + if (changeset.isLoaded()) { + if (changeset.getRenderer() == '2up') { + up_item + .setIcon('fa-list-alt') + .setName(pht('View Unified')); + } else { + up_item + .setIcon('fa-files-o') + .setName(pht('View Side-by-Side')); + } + } else { + up_item + .setIcon('fa-refresh') + .setName(pht('Load Changes')); + } + + visible_item + .setDisabled(true) + .setIcon('fa-expand') + .setName(pht('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) { + var diff = diffs[0]; + visible_item.setDisabled(false); + if (JX.Stratcom.getData(diff).hidden) { + visible_item + .setName(pht('Expand File')) + .setIcon('fa-expand'); + } else { + visible_item + .setName(pht('Collapse File')) + .setIcon('fa-compress'); + } + } else { + // Do nothing when there is no diff shown in the table. For example, + // the file is binary. + } + + }); + + data.menu = menu; + menu.open(); } + + } }); diff --git a/webroot/rsrc/js/application/differential/behavior-dropdown-menus.js b/webroot/rsrc/js/application/differential/behavior-dropdown-menus.js deleted file mode 100644 --- a/webroot/rsrc/js/application/differential/behavior-dropdown-menus.js +++ /dev/null @@ -1,240 +0,0 @@ -/** - * @provides javelin-behavior-differential-dropdown-menus - * @requires javelin-behavior - * javelin-dom - * javelin-util - * javelin-stratcom - * javelin-workflow - * phuix-dropdown-menu - * phuix-action-list-view - * phuix-action-view - * phabricator-phtize - * phabricator-diff-changeset - */ - -JX.behavior('differential-dropdown-menus', function(config) { - var pht = JX.phtize(config.pht); - - function show_more(container) { - var view = JX.DiffChangeset.getForNode(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++) { - var data = JX.Stratcom.getData(show[jj]); - if (data.type != 'all') { - continue; - } - view.loadContext(data.range, nodes[ii], true); - } - } - } - - var buildmenu = function(e) { - var button = e.getNode('differential-view-options'); - var data = JX.Stratcom.getData(button); - if (data.menu) { - return; - } - - e.prevent(); - - var changeset = JX.DOM.findAbove( - button, - 'div', - 'differential-changeset'); - - var view = JX.DiffChangeset.getForNode(changeset); - var menu = new JX.PHUIXDropdownMenu(button); - var list = new JX.PHUIXActionListView(); - - var add_link = function(icon, name, href, local) { - if (!href) { - return; - } - - var link = new JX.PHUIXActionView() - .setIcon(icon) - .setName(name) - .setHref(href) - .setHandler(function(e) { - if (local) { - window.location.assign(href); - } else { - window.open(href); - } - menu.close(); - e.prevent(); - }); - - list.addItem(link); - return link; - }; - - var reveal_item = new JX.PHUIXActionView() - .setIcon('fa-eye'); - list.addItem(reveal_item); - - var visible_item = new JX.PHUIXActionView() - .setHandler(function(e) { - var diff = JX.DOM.scry( - JX.$(data.containerID), - 'table', - 'differential-diff'); - - JX.Stratcom.invoke('differential-toggle-file', null, {diff: diff}); - e.prevent(); - menu.close(); - }); - list.addItem(visible_item); - - add_link('fa-file-text', pht('Browse in Diffusion'), data.diffusionURI); - add_link('fa-file-o', pht('View Standalone'), data.standaloneURI); - - var up_item = new JX.PHUIXActionView() - .setHandler(function(e) { - if (view.isLoaded()) { - var renderer = view.getRenderer(); - if (renderer == '1up') { - renderer = '2up'; - } else { - renderer = '1up'; - } - view.setRenderer(renderer); - } - view.reload(); - - e.prevent(); - menu.close(); - }); - list.addItem(up_item); - - var encoding_item = new JX.PHUIXActionView() - .setIcon('fa-font') - .setName(pht('Change Text Encoding...')) - .setHandler(function(e) { - var params = { - encoding: view.getEncoding() - }; - - new JX.Workflow('/services/encoding/', params) - .setHandler(function(r) { - view.setEncoding(r.encoding); - view.reload(); - }) - .start(); - - e.prevent(); - menu.close(); - }); - list.addItem(encoding_item); - - var highlight_item = new JX.PHUIXActionView() - .setIcon('fa-sun-o') - .setName(pht('Highlight As...')) - .setHandler(function(e) { - var params = { - highlight: view.getHighlight() - }; - - new JX.Workflow('/services/highlight/', params) - .setHandler(function(r) { - view.setHighlight(r.highlight); - view.reload(); - }) - .start(); - - e.prevent(); - menu.close(); - }); - list.addItem(highlight_item); - - add_link('fa-arrow-left', pht('Show Raw File (Left)'), data.leftURI); - add_link('fa-arrow-right', pht('Show Raw File (Right)'), data.rightURI); - add_link('fa-pencil', pht('Open in Editor'), data.editor, true); - add_link('fa-wrench', pht('Configure Editor'), data.editorConfigure); - - menu.setContent(list.getNode()); - - 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) - .setName(pht('Show All Context')) - .setIcon('fa-file-o') - .setHandler(function(e) { - show_more(JX.$(data.containerID)); - e.prevent(); - menu.close(); - }); - } else { - reveal_item - .setDisabled(true) - .setIcon('fa-file') - .setName(pht('All Context Shown')) - .setHandler(function(e) { e.prevent(); }); - } - - encoding_item.setDisabled(!view.isLoaded()); - highlight_item.setDisabled(!view.isLoaded()); - - if (view.isLoaded()) { - if (view.getRenderer() == '2up') { - up_item - .setIcon('fa-list-alt') - .setName(pht('View Unified')); - } else { - up_item - .setIcon('fa-files-o') - .setName(pht('View Side-by-Side')); - } - } else { - up_item - .setIcon('fa-refresh') - .setName(pht('Load Changes')); - } - - visible_item - .setDisabled(true) - .setIcon('fa-expand') - .setName(pht('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) { - var diff = diffs[0]; - visible_item.setDisabled(false); - if (JX.Stratcom.getData(diff).hidden) { - visible_item - .setName(pht('Expand File')) - .setIcon('fa-expand'); - } else { - visible_item - .setName(pht('Collapse File')) - .setIcon('fa-compress'); - } - } else { - // Do nothing when there is no diff shown in the table. For example, - // the file is binary. - } - - }); - - data.menu = menu; - menu.open(); - }; - - JX.Stratcom.listen('click', 'differential-view-options', buildmenu); -}); diff --git a/webroot/rsrc/js/application/differential/behavior-populate.js b/webroot/rsrc/js/application/differential/behavior-populate.js --- a/webroot/rsrc/js/application/differential/behavior-populate.js +++ b/webroot/rsrc/js/application/differential/behavior-populate.js @@ -58,7 +58,8 @@ }); } - var changeset_list = new JX.DiffChangesetList(); + var changeset_list = new JX.DiffChangesetList() + .setTranslations(JX.phtize(config.pht)); // Install and activate the current page. var page_id = JX.Quicksand.getCurrentPageID();