Add scrollTo methods to gr-new-diff
Change-Id: Ie6137b434807a004bfbc55517ff39fc6a83c5c4f
This commit is contained in:
@@ -27,6 +27,12 @@
|
||||
Polymer({
|
||||
is: 'gr-new-diff',
|
||||
|
||||
/**
|
||||
* Fired when the diff is rendered.
|
||||
*
|
||||
* @event render
|
||||
*/
|
||||
|
||||
properties: {
|
||||
availablePatches: Array,
|
||||
changeNum: String,
|
||||
@@ -60,6 +66,14 @@
|
||||
observer: '_selectionSideChanged',
|
||||
},
|
||||
_comments: Object,
|
||||
_focusedSection: {
|
||||
type: Number,
|
||||
value: -1,
|
||||
},
|
||||
_focusedThread: {
|
||||
type: Number,
|
||||
value: -1,
|
||||
},
|
||||
},
|
||||
|
||||
observers: [
|
||||
@@ -90,6 +104,73 @@
|
||||
return Promise.all(promises);
|
||||
},
|
||||
|
||||
scrollToLine: function(lineNum) {
|
||||
if (isNaN(lineNum) || lineNum < 1) { return; }
|
||||
|
||||
var lineEls = Polymer.dom(this.root).querySelectorAll(
|
||||
'.lineNum[data-value="' + lineNum + '"]');
|
||||
|
||||
// Always choose the right side.
|
||||
var el = lineEls.length === 2 ? lineEls[1] : lineEls[0];
|
||||
this._scrollToElement(el);
|
||||
},
|
||||
|
||||
scrollToNextDiffChunk: function() {
|
||||
this._focusedSection = this._advanceElementWithinNodeList(
|
||||
this._getDeltaSections(), this._focusedSection, 1);
|
||||
},
|
||||
|
||||
scrollToPreviousDiffChunk: function() {
|
||||
this._focusedSection = this._advanceElementWithinNodeList(
|
||||
this._getDeltaSections(), this._focusedSection, -1);
|
||||
},
|
||||
|
||||
scrollToNextCommentThread: function() {
|
||||
this._focusedThread = this._advanceElementWithinNodeList(
|
||||
this._getCommentThreads(), this._focusedThread, 1);
|
||||
},
|
||||
|
||||
scrollToPreviousCommentThread: function() {
|
||||
this._focusedThread = this._advanceElementWithinNodeList(
|
||||
this._getCommentThreads(), this._focusedThread, -1);
|
||||
},
|
||||
|
||||
_advanceElementWithinNodeList: function(els, curIndex, direction) {
|
||||
var idx = Math.max(0, Math.min(els.length - 1, curIndex + direction));
|
||||
if (curIndex !== idx) {
|
||||
this._scrollToElement(els[idx]);
|
||||
return idx;
|
||||
}
|
||||
return curIndex;
|
||||
},
|
||||
|
||||
_getCommentThreads: function() {
|
||||
return Polymer.dom(this.root).querySelectorAll('gr-diff-comment-thread');
|
||||
},
|
||||
|
||||
_getDeltaSections: function() {
|
||||
return Polymer.dom(this.root).querySelectorAll('.section.delta');
|
||||
},
|
||||
|
||||
_scrollToElement: function(el) {
|
||||
if (!el) { return; }
|
||||
|
||||
// Calculate where the element is relative to the window.
|
||||
var top = el.offsetTop;
|
||||
for (var offsetParent = el.offsetParent;
|
||||
offsetParent;
|
||||
offsetParent = offsetParent.offsetParent) {
|
||||
top += offsetParent.offsetTop;
|
||||
}
|
||||
|
||||
// Scroll the element to the middle of the window. Dividing by a third
|
||||
// instead of half the inner height feels a bit better otherwise the
|
||||
// element appears to be below the center of the window even when it
|
||||
// isn't.
|
||||
window.scrollTo(0, top - (window.innerHeight / 3) +
|
||||
(el.offsetHeight / 2));
|
||||
},
|
||||
|
||||
_computeContainerClass: function(loggedIn, viewMode) {
|
||||
var classes = ['diffContainer'];
|
||||
switch (viewMode) {
|
||||
@@ -238,6 +319,10 @@
|
||||
this.updateStyles();
|
||||
this._builder = this._getDiffBuilder(diff, comments, prefs);
|
||||
this._builder.emitDiff(diff.content);
|
||||
|
||||
this.async(function() {
|
||||
this.fire('render', null, {bubbles: false});
|
||||
}.bind(this), 1);
|
||||
},
|
||||
|
||||
_clearDiffContent: function() {
|
||||
|
||||
@@ -41,9 +41,6 @@ limitations under the License.
|
||||
element = fixture('basic');
|
||||
});
|
||||
|
||||
teardown(function() {
|
||||
});
|
||||
|
||||
test('get drafts logged out', function(done) {
|
||||
element.patchRange = {basePatchNum: 0, patchNum: 0};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user