From ceb522427ed72d80fb5a36bab68ca92461c017e8 Mon Sep 17 00:00:00 2001 From: vrana Date: Sat, 4 Aug 2012 09:47:51 -0700 Subject: [PATCH] Highlight lines on drag and drop in Diffusion Summary: Nobody knows that it's possible to highlight more lines because there's no interface for it. Test Plan: Highlighted: - single line - top to bottom - bottom to top - inside to outside Reviewers: Korvin, epriestley Reviewed By: epriestley CC: aran, epriestley Differential Revision: https://secure.phabricator.com/D3150 --- src/__celerity_resource_map__.php | 15 +++- .../DiffusionBrowseFileController.php | 10 ++- .../diffusion/diffusion-source.css | 4 + .../diffusion/behavior-line-linker.js | 78 +++++++++++++++++++ 4 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 webroot/rsrc/js/application/diffusion/behavior-line-linker.js diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php index eda699d37d..f0413cf3f3 100644 --- a/src/__celerity_resource_map__.php +++ b/src/__celerity_resource_map__.php @@ -778,7 +778,7 @@ celerity_register_resource_map(array( ), 'diffusion-source-css' => array( - 'uri' => '/res/501fcd3a/rsrc/css/application/diffusion/diffusion-source.css', + 'uri' => '/res/0ffedfa2/rsrc/css/application/diffusion/diffusion-source.css', 'type' => 'css', 'requires' => array( @@ -1252,6 +1252,19 @@ celerity_register_resource_map(array( ), 'disk' => '/rsrc/js/application/diffusion/behavior-jump-to.js', ), + 'javelin-behavior-diffusion-line-linker' => + array( + 'uri' => '/res/d3cf5499/rsrc/js/application/diffusion/behavior-line-linker.js', + 'type' => 'js', + 'requires' => + array( + 0 => 'javelin-behavior', + 1 => 'javelin-stratcom', + 2 => 'javelin-dom', + 3 => 'javelin-uri', + ), + 'disk' => '/rsrc/js/application/diffusion/behavior-line-linker.js', + ), 'javelin-behavior-diffusion-pull-lastmodified' => array( 'uri' => '/res/29fe2790/rsrc/js/application/diffusion/behavior-pull-lastmodified.js', diff --git a/src/applications/diffusion/controller/DiffusionBrowseFileController.php b/src/applications/diffusion/controller/DiffusionBrowseFileController.php index 326afd4f28..18da351575 100644 --- a/src/applications/diffusion/controller/DiffusionBrowseFileController.php +++ b/src/applications/diffusion/controller/DiffusionBrowseFileController.php @@ -244,10 +244,11 @@ final class DiffusionBrowseFileController extends DiffusionController { )); } - $corpus_table = phutil_render_tag( + $corpus_table = javelin_render_tag( 'table', array( 'class' => "diffusion-source remarkup-code PhabricatorMonospaced", + 'sigil' => 'diffusion-source', ), implode("\n", $rows)); $corpus = phutil_render_tag( @@ -592,14 +593,17 @@ final class DiffusionBrowseFileController extends DiffusionController { ), phutil_escape_html($line['line'])); - $blame[] = phutil_render_tag( + $blame[] = javelin_render_tag( 'th', array( 'class' => 'diffusion-line-link', + 'sigil' => 'diffusion-line-link', 'style' => isset($color) ? 'background: '.$color : null, ), $line_link); + Javelin::initBehavior('diffusion-line-linker'); + $blame = implode('', $blame); if ($line['target']) { @@ -624,7 +628,7 @@ final class DiffusionBrowseFileController extends DiffusionController { $rows[] = phutil_render_tag( 'tr', array( - 'style' => ($line['highlighted'] ? 'background: #ffff00;' : null), + 'class' => ($line['highlighted'] ? 'highlighted' : null), ), $blame. $line_text); diff --git a/webroot/rsrc/css/application/diffusion/diffusion-source.css b/webroot/rsrc/css/application/diffusion/diffusion-source.css index afd4983c49..b99200776d 100644 --- a/webroot/rsrc/css/application/diffusion/diffusion-source.css +++ b/webroot/rsrc/css/application/diffusion/diffusion-source.css @@ -9,6 +9,10 @@ font-size: 10px; } +.diffusion-source tr.highlighted { + background: #ffff00; +} + .diffusion-source th { text-align: right; vertical-align: top; diff --git a/webroot/rsrc/js/application/diffusion/behavior-line-linker.js b/webroot/rsrc/js/application/diffusion/behavior-line-linker.js new file mode 100644 index 0000000000..383ce448b0 --- /dev/null +++ b/webroot/rsrc/js/application/diffusion/behavior-line-linker.js @@ -0,0 +1,78 @@ +/** + * @provides javelin-behavior-diffusion-line-linker + * @requires javelin-behavior + * javelin-stratcom + * javelin-dom + * javelin-uri + */ + +JX.behavior('diffusion-line-linker', function() { + + var origin = null; + var target = null; + var root = null; + + function getRowNumber(tr) { + var th = JX.DOM.find(tr, 'th', 'diffusion-line-link'); + return +(th.textContent || th.innerText); + } + + JX.Stratcom.listen( + 'mousedown', + 'diffusion-line-link', + function(e) { + if (e.isRightButton()) { + return; + } + origin = e.getNode('tag:tr'); + target = origin; + root = e.getNode('diffusion-source'); + e.kill(); + }); + + JX.Stratcom.listen( + 'mouseover', + 'diffusion-source', + function(e) { + if (!origin || e.getNode('diffusion-source') !== root) { + return; + } + target = e.getNode('tag:tr'); + + var highlighting = false; + var source = null; + var trs = JX.DOM.scry(root, 'tr'); + for (var i = 0; i < trs.length; i++) { + if (!highlighting && (trs[i] === origin || trs[i] === target)) { + highlighting = true; + source = trs[i]; + } + JX.DOM.alterClass(trs[i], 'highlighted', highlighting); + if (trs[i] === (source === origin ? target : origin)) { + highlighting = false; + } + } + }); + + JX.Stratcom.listen( + 'mouseup', + null, + function(e) { + if (!origin) { + return; + } + + var o = getRowNumber(origin); + var t = getRowNumber(target); + var lines = (o == t ? o : Math.min(o, t) + '-' + Math.max(o, t)); + var th = JX.DOM.find(origin, 'th', 'diffusion-line-link'); + var uri = JX.DOM.find(th, 'a').href; + uri = uri.replace(/(.*\$)\d+/, '$1' + lines); + + origin = null; + target = null; + e.kill(); + JX.$U(uri).go(); + }); + +}); -- 2.51.2