From 00313094d3ab61a3aff6501a90c49b06b05e0777 Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 2 Jan 2017 10:48:19 -0800 Subject: [PATCH] Make "View" links on Differential inline comment previews work again Summary: Ref T11114. Recent changes broke the links to jump to inline comments from the previews because they get hooked up with JS. Restore the linking behavior. Test Plan: Clicked "View" on an inline comment preview, jumped to that comment. Reviewers: chad Reviewed By: chad Maniphest Tasks: T11114 Differential Revision: https://secure.phabricator.com/D17131 --- .../PHUIDiffInlineCommentPreviewListView.php | 8 +++++ .../application/diff/behavior-preview-link.js | 36 +++++++++++++++++++ .../transactions/behavior-comment-actions.js | 16 ++++++++- 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 webroot/rsrc/js/application/diff/behavior-preview-link.js diff --git a/src/infrastructure/diff/view/PHUIDiffInlineCommentPreviewListView.php b/src/infrastructure/diff/view/PHUIDiffInlineCommentPreviewListView.php index 5b200ed4f1..31e6b2b087 100644 --- a/src/infrastructure/diff/view/PHUIDiffInlineCommentPreviewListView.php +++ b/src/infrastructure/diff/view/PHUIDiffInlineCommentPreviewListView.php @@ -28,6 +28,14 @@ final class PHUIDiffInlineCommentPreviewListView public function render() { $viewer = $this->getViewer(); + $config = array( + 'pht' => array( + 'view' => pht('View'), + ), + ); + + Javelin::initBehavior('diff-preview-link', $config); + $inlines = $this->getInlineComments(); foreach ($inlines as $key => $inline) { $inlines[$key] = DifferentialInlineComment::newFromModernComment( diff --git a/webroot/rsrc/js/application/diff/behavior-preview-link.js b/webroot/rsrc/js/application/diff/behavior-preview-link.js new file mode 100644 index 0000000000..71cd2ecf04 --- /dev/null +++ b/webroot/rsrc/js/application/diff/behavior-preview-link.js @@ -0,0 +1,36 @@ +/** + * @provides javelin-behavior-diff-preview-link + * @requires javelin-behavior + * javelin-stratcom + * javelin-dom + */ + +JX.behavior('diff-preview-link', function(config, statics) { + if (statics.initialized) { + return; + } + statics.initialized = true; + + var pht = JX.phtize(config.pht); + + // After inline comment previews are rendered, hook up the links to the + // comments that are visible on the current page. + function link_inline_preview(e) { + var root = e.getData().rootNode; + var links = JX.DOM.scry(root, 'a', 'differential-inline-preview-jump'); + + for (var ii = 0; ii < links.length; ii++) { + var data = JX.Stratcom.getData(links[ii]); + try { + JX.$(data.anchor); + links[ii].href = '#' + data.anchor; + JX.DOM.setContent(links[ii], pht('view')); + } catch (ignored) { + // This inline comment isn't visible, e.g. on some other diff. + } + } + + } + + JX.Stratcom.listen('EditEngine.didCommentPreview', null, link_inline_preview); +}); diff --git a/webroot/rsrc/js/application/transactions/behavior-comment-actions.js b/webroot/rsrc/js/application/transactions/behavior-comment-actions.js index e1c8aee533..3383b26a24 100644 --- a/webroot/rsrc/js/application/transactions/behavior-comment-actions.js +++ b/webroot/rsrc/js/application/transactions/behavior-comment-actions.js @@ -147,13 +147,27 @@ JX.behavior('comment-actions', function(config) { if (!response.xactions.length) { JX.DOM.hide(panel); } else { + var preview_root = JX.$(config.timelineID); JX.DOM.setContent( - JX.$(config.timelineID), + preview_root, [ JX.$H(response.xactions.join('')), JX.$H(response.previewContent) ]); JX.DOM.show(panel); + + // NOTE: Resonses are currently processed before associated behaviors are + // registered. We need to defer invoking this event so that any behaviors + // accompanying the response are registered. + var invoke_preview = function() { + JX.Stratcom.invoke( + 'EditEngine.didCommentPreview', + null, + { + rootNode: preview_root + }); + }; + setTimeout(invoke_preview, 0); } }