diff --git a/resources/celerity/map.php b/resources/celerity/map.php index e58c5a8158..00e394851c 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -390,7 +390,7 @@ return array( 'rsrc/js/application/diffusion/behavior-pull-lastmodified.js' => 'f01586dc', 'rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js' => '1db13e70', 'rsrc/js/application/drydock/drydock-live-operation-status.js' => '901935ef', - 'rsrc/js/application/files/behavior-document-engine.js' => 'ed539253', + 'rsrc/js/application/files/behavior-document-engine.js' => '6760beb4', 'rsrc/js/application/files/behavior-icon-composer.js' => '8499b6ab', 'rsrc/js/application/files/behavior-launch-icon-composer.js' => '48086888', 'rsrc/js/application/harbormaster/behavior-harbormaster-log.js' => '191b4909', @@ -604,7 +604,7 @@ return array( 'javelin-behavior-diffusion-jump-to' => '73d09eef', 'javelin-behavior-diffusion-locate-file' => '6d3e1947', 'javelin-behavior-diffusion-pull-lastmodified' => 'f01586dc', - 'javelin-behavior-document-engine' => 'ed539253', + 'javelin-behavior-document-engine' => '6760beb4', 'javelin-behavior-doorkeeper-tag' => '1db13e70', 'javelin-behavior-drydock-live-operation-status' => '901935ef', 'javelin-behavior-durable-column' => '2ae077e1', @@ -1398,6 +1398,11 @@ return array( 'javelin-json', 'phuix-form-control-view', ), + '6760beb4' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-stratcom', + ), '680ea2c8' => array( 'javelin-install', 'javelin-dom', @@ -2116,11 +2121,6 @@ return array( 'javelin-stratcom', 'javelin-vector', ), - 'ed539253' => array( - 'javelin-behavior', - 'javelin-dom', - 'javelin-stratcom', - ), 'edf8a145' => array( 'javelin-behavior', 'javelin-uri', diff --git a/src/view/layout/PhabricatorSourceCodeView.php b/src/view/layout/PhabricatorSourceCodeView.php index 19fa17c582..e6fb1803bc 100644 --- a/src/view/layout/PhabricatorSourceCodeView.php +++ b/src/view/layout/PhabricatorSourceCodeView.php @@ -130,8 +130,8 @@ final class PhabricatorSourceCodeView extends AphrontView { $lines = idx($blame_map, $line_number); if ($lines) { - $skip_blame = 'skip;'.$lines; - $info_blame = 'info;'.$lines; + $skip_blame = 'skip'; + $info_blame = 'info'; } else { $skip_blame = null; $info_blame = null; @@ -149,6 +149,7 @@ final class PhabricatorSourceCodeView extends AphrontView { array( 'class' => 'phabricator-source-blame-info', 'data-blame' => $info_blame, + 'data-blame-lines' => $lines, )), ); } else { diff --git a/webroot/rsrc/js/application/files/behavior-document-engine.js b/webroot/rsrc/js/application/files/behavior-document-engine.js index ea01ba3aca..eb4216ee15 100644 --- a/webroot/rsrc/js/application/files/behavior-document-engine.js +++ b/webroot/rsrc/js/application/files/behavior-document-engine.js @@ -239,31 +239,48 @@ JX.behavior('document-engine', function(config, statics) { // We're ready to render. var viewport = JX.$(data.viewportID); - var cells = JX.DOM.scry(viewport, 'th'); + var row_nodes = JX.DOM.scry(viewport, 'tr'); + var row_list = []; + var ii; - for (var ii = 0; ii < cells.length; ii++) { - var cell = cells[ii]; + for (ii = 0; ii < row_nodes.length; ii++) { + var row = {}; + var keep = false; + var node = row_nodes[ii]; - var spec = cell.getAttribute('data-blame'); - if (!spec) { - continue; + for (var jj = 0; jj < node.childNodes.length; jj++) { + var child = node.childNodes[jj]; + + if (!JX.DOM.isType(child, 'th')) { + continue; + } + + var spec = child.getAttribute('data-blame'); + if (spec) { + row[spec] = child; + keep = true; + } + + if (spec === 'info') { + row.lines = child.getAttribute('data-blame-lines'); + } } - spec = spec.split(';'); - var type = spec[0]; - var lines = spec[1]; - - var content = null; - switch (type) { - case 'skip': - content = renderSkip(data.blame.value, lines); - break; - case 'info': - content = renderInfo(data.blame.value, lines); - break; + if (keep) { + row_list.push(row); } + } - JX.DOM.setContent(cell, content); + var last = null; + for (ii = 0; ii < row_list.length; ii++) { + var commit = data.blame.value.blame[row_list[ii].lines - 1]; + row_list[ii].commit = commit; + row_list[ii].last = last; + last = commit; + } + + for (ii = 0; ii < row_list.length; ii++) { + renderBlame(row_list[ii], data.blame.value); } } @@ -273,26 +290,25 @@ JX.behavior('document-engine', function(config, statics) { blame(data); } - function renderSkip(blame, lines) { - var commit = blame.blame[lines - 1]; - if (!commit) { - return null; + function renderBlame(row, blame) { + var spec = blame.map[row.commit]; + + + var info = null; + var skip = null; + + if (spec && (row.commit != row.last)) { + skip = JX.$H(spec.skip); + info = JX.$H(spec.info); } - var spec = blame.map[commit]; - - return JX.$H(spec.skip); - } - - function renderInfo(blame, lines) { - var commit = blame.blame[lines - 1]; - if (!commit) { - return null; + if (row.skip) { + JX.DOM.setContent(row.skip, skip); } - var spec = blame.map[commit]; - - return JX.$H(spec.info); + if (row.info) { + JX.DOM.setContent(row.info, info); + } } if (!statics.initialized) {