mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/RevisionSlider
synced 2024-11-16 12:00:12 +00:00
ebd9985afc
Change-Id: I3299d3a4bc66a3b85d0d0f7d8a49edbf8f6329c3
183 lines
3.8 KiB
JavaScript
183 lines
3.8 KiB
JavaScript
/**
|
|
* @external Revision
|
|
* @external RevisionListView
|
|
*/
|
|
var RevisionModule = require( './ext.RevisionSlider.Revision.js' ),
|
|
Revision = RevisionModule.Revision,
|
|
RevisionListView = require( './ext.RevisionSlider.RevisionListView.js' );
|
|
|
|
/**
|
|
* @class RevisionList
|
|
* @param {Revision[]} revs
|
|
* @param {Object[]} availableTags
|
|
* @constructor
|
|
*/
|
|
function RevisionList( revs, availableTags ) {
|
|
this.revisions = [];
|
|
this.availableTags = availableTags;
|
|
this.initialize( revs );
|
|
this.view = new RevisionListView( this );
|
|
}
|
|
|
|
$.extend( RevisionList.prototype, {
|
|
/**
|
|
* @type {Revision[]}
|
|
*/
|
|
revisions: [],
|
|
|
|
/**
|
|
* @type {RevisionListView}
|
|
*/
|
|
view: null,
|
|
|
|
/**
|
|
* Initializes the RevisionList from a list of Revisions
|
|
*
|
|
* @param {Revision[]} revs
|
|
*/
|
|
initialize: function ( revs ) {
|
|
var i, rev;
|
|
|
|
for ( i = 0; i < revs.length; i++ ) {
|
|
rev = revs[ i ];
|
|
rev.setRelativeSize( i > 0 ? rev.getSize() - revs[ i - 1 ].getSize() : rev.getSize() );
|
|
|
|
this.revisions.push( rev );
|
|
}
|
|
},
|
|
|
|
/**
|
|
* @return {number}
|
|
*/
|
|
getBiggestChangeSize: function () {
|
|
var max = 0,
|
|
i;
|
|
|
|
for ( i = 0; i < this.revisions.length; i++ ) {
|
|
max = Math.max( max, Math.abs( this.revisions[ i ].getRelativeSize() ) );
|
|
}
|
|
|
|
return max;
|
|
},
|
|
|
|
/**
|
|
* @return {Revision[]}
|
|
*/
|
|
getRevisions: function () {
|
|
return this.revisions;
|
|
},
|
|
|
|
/**
|
|
* @return {number}
|
|
*/
|
|
getLength: function () {
|
|
return this.revisions.length;
|
|
},
|
|
|
|
/**
|
|
* @return {RevisionListView}
|
|
*/
|
|
getView: function () {
|
|
return this.view;
|
|
},
|
|
|
|
/**
|
|
* @return {Object[]}
|
|
*/
|
|
getAvailableTags: function () {
|
|
return this.availableTags;
|
|
},
|
|
|
|
getUserGenders: function () {
|
|
var userGenders = {};
|
|
this.revisions.forEach( function ( revision ) {
|
|
if ( revision.getUser() ) {
|
|
userGenders[ revision.getUser() ] = revision.getUserGender();
|
|
}
|
|
} );
|
|
return userGenders;
|
|
},
|
|
|
|
/**
|
|
* Adds revisions to the end of the list.
|
|
*
|
|
* @param {Revision[]} revs
|
|
*/
|
|
push: function ( revs ) {
|
|
var i, rev;
|
|
for ( i = 0; i < revs.length; i++ ) {
|
|
rev = revs[ i ];
|
|
rev.setRelativeSize(
|
|
i > 0 ?
|
|
rev.getSize() - revs[ i - 1 ].getSize() :
|
|
rev.getSize() - this.revisions[ this.revisions.length - 1 ].getSize()
|
|
);
|
|
|
|
this.revisions.push( rev );
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Adds revisions to the beginning of the list.
|
|
*
|
|
* @param {Revision[]} revs
|
|
* @param {number} sizeBefore optional size of the revision preceding the first of revs, defaults to 0
|
|
*/
|
|
unshift: function ( revs, sizeBefore ) {
|
|
var originalFirstRev = this.revisions[ 0 ],
|
|
i, rev;
|
|
sizeBefore = sizeBefore || 0;
|
|
|
|
originalFirstRev.setRelativeSize( originalFirstRev.getSize() - revs[ revs.length - 1 ].getSize() );
|
|
for ( i = revs.length - 1; i >= 0; i-- ) {
|
|
rev = revs[ i ];
|
|
rev.setRelativeSize( i > 0 ? rev.getSize() - revs[ i - 1 ].getSize() : rev.getSize() - sizeBefore );
|
|
|
|
this.revisions.unshift( rev );
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Returns a subset of the list.
|
|
*
|
|
* @param {number} begin
|
|
* @param {number} end
|
|
* @return {RevisionList}
|
|
*/
|
|
slice: function ( begin, end ) {
|
|
var slicedList = new RevisionList( [], this.getAvailableTags() );
|
|
slicedList.view = new RevisionListView( slicedList );
|
|
slicedList.revisions = this.revisions.slice( begin, end );
|
|
return slicedList;
|
|
},
|
|
|
|
/**
|
|
* @param {number} pos
|
|
* @return {boolean}
|
|
*/
|
|
isValidPosition: function ( pos ) {
|
|
return pos > 0 && pos <= this.getLength();
|
|
}
|
|
} );
|
|
|
|
/**
|
|
* Transforms an array of revision data returned by MediaWiki API (including user gender information) into
|
|
* an array of Revision objects
|
|
*
|
|
* @param {Array} revs
|
|
* @return {Revision[]}
|
|
*/
|
|
function makeRevisions( revs ) {
|
|
return revs.map( function ( revData ) {
|
|
return new Revision( revData );
|
|
} );
|
|
}
|
|
|
|
module.exports = {
|
|
Revision: Revision,
|
|
RevisionList: RevisionList,
|
|
RevisionListView: RevisionListView,
|
|
makeRevisions: makeRevisions,
|
|
setUserOffset: RevisionModule.setUserOffset
|
|
};
|