mediawiki-extensions-Revisi.../modules/ext.RevisionSlider.PointerLine.js
WMDE-Fisch 218b85d0bb Remove 4px pointer margins
It seems the magic done with the 4px margin and its calculations
are not really needed. Getting rid of this does not only clean
the code but is also very helpfull for the new slider logic.

Change-Id: Iae86b8024d3b56517bdc4db5e8baec69bd61afbf
2017-04-05 09:42:49 +00:00

229 lines
6.9 KiB
JavaScript

( function ( mw, $ ) {
/**
* Module containing presentation logic for the revision pointer lines
*
* @param {Pointer} pointer
* @param {string} name
* @constructor
*/
var PointerLine = function ( pointer, name ) {
this.pointer = pointer;
this.name = name;
};
$.extend( PointerLine.prototype, {
/**
* @type {string}
*/
name: '',
/**
* @type {Pointer}
*/
pointer: null,
/**
* @type {jQuery}
*/
$html: null,
/**
* Check if the offset method is available for the diff element
*
* @return {boolean}
*/
offsetNotAvailable: function () {
return typeof $( '.diff-ntitle' ).offset() === 'undefined';
},
/**
* Calculate the relative distance in between the given pointer and column
*
* @param {jQuery} $sourcePointer
* @param {jQuery} $targetColumn
*
* @return {int} distance between the given elements
*/
calculateDistance: function ( $sourcePointer, $targetColumn ) {
return ( $targetColumn.offset().left + $targetColumn.width() / 2 ) -
( $sourcePointer.offset().left + ( $sourcePointer.width() ) / 2 );
},
/**
* Calculate and set line's width and position with the given pointer and column
*
* @param {jQuery} $sourcePointer
* @param {jQuery} $targetColumn
*/
setCssProperties: function ( $sourcePointer, $targetColumn ) {
var distance, widthToSet, leftToSet;
distance = this.calculateDistance( $sourcePointer, $targetColumn );
widthToSet = Math.abs( distance );
leftToSet = ( $targetColumn.offset().left + $targetColumn.width() / 2 ) -
$( '.mw-revslider-revision-slider' ).offset().left;
if ( distance > 0 ) {
// targetColumn is right relative to sourcePointer
leftToSet -= widthToSet;
leftToSet -= 1;
} else {
// targetColumn is left relative to sourcePointer
leftToSet += 1;
}
this.$html.css( {
width: widthToSet + 'px',
left: leftToSet + 'px'
} );
},
/**
* Check if the target column is located right form the source pointer
*
* @param {jQuery} $sourcePointer
* @param {jQuery} $targetColumn
*
* @return {boolean}
*/
targetColumnIsRightFromPointer: function ( $sourcePointer, $targetColumn ) {
return this.calculateDistance( $sourcePointer, $targetColumn ) > 0;
},
/**
* Draws the line between pointer and column by setting borders, position and width of the line box
*
* @return {boolean}
*/
drawLine: function () {
var $upperLineDiv = this.$html.find( '.mw-revslider-pointer-line-upper' ),
$lowerLineDiv = this.$html.find( '.mw-revslider-pointer-line-lower' ),
$newerUnderLineDiv = this.$html.find( '.mw-revslider-pointer-line-underline' )
.filter( '.mw-revslider-pointer-newer' ),
$olderUnderLineDiv = this.$html.find( '.mw-revslider-pointer-line-underline' )
.filter( '.mw-revslider-pointer-older' ),
$sourcePointer = this.pointer.getView().getElement(),
$table = $( '.diff-otitle' ),
$targetColumn;
if ( this.offsetNotAvailable() ) {
// offset is not available in QUnit tests so skip calculation and drawing
return false;
}
if ( this.pointer.getView().isUpperPointer() ) {
$lowerLineDiv.removeClass( 'mw-revslider-lower-color' ).addClass( 'mw-revslider-upper-color' );
$upperLineDiv.removeClass( 'mw-revslider-lower-color' ).addClass( 'mw-revslider-upper-color' );
$newerUnderLineDiv.removeClass( 'mw-revslider-lower-color' ).addClass( 'mw-revslider-upper-color' );
$olderUnderLineDiv.removeClass( 'mw-revslider-lower-color' ).addClass( 'mw-revslider-upper-color' );
$targetColumn = $( '.diff-ntitle' );
} else {
$lowerLineDiv.removeClass( 'mw-revslider-upper-color' ).addClass( 'mw-revslider-lower-color' );
$upperLineDiv.removeClass( 'mw-revslider-upper-color' ).addClass( 'mw-revslider-lower-color' );
$olderUnderLineDiv.removeClass( 'mw-revslider-upper-color' ).addClass( 'mw-revslider-lower-color' );
$newerUnderLineDiv.removeClass( 'mw-revslider-upper-color' ).addClass( 'mw-revslider-lower-color' );
$targetColumn = $( '.diff-otitle' );
}
this.setCssProperties( $sourcePointer, $targetColumn );
$upperLineDiv.addClass( 'mw-revslider-bottom-line' );
if ( this.targetColumnIsRightFromPointer( $sourcePointer, $targetColumn ) ) {
$upperLineDiv.addClass( 'mw-revslider-left-line' );
$lowerLineDiv.addClass( 'mw-revslider-right-line' );
$( $newerUnderLineDiv ).css( {
width: $table.width() + 'px',
'margin-right': -$table.width() / 2 + 'px',
'margin-left': 0,
'float': 'right'
} );
$( $olderUnderLineDiv ).css( {
width: $table.width() + 'px',
'margin-right': -$table.width() / 2 + 'px',
'margin-left': 0,
'float': 'right'
} );
} else {
$upperLineDiv.addClass( 'mw-revslider-right-line' );
$lowerLineDiv.addClass( 'mw-revslider-left-line' );
$( $newerUnderLineDiv ).css( {
width: $table.width() + 'px',
'margin-left': -$table.width() / 2 + 'px',
'margin-right': 0,
'float': 'left'
} );
$( $olderUnderLineDiv ).css( {
width: $table.width() + 'px',
'margin-left': -$table.width() / 2 + 'px',
'margin-right': 0,
'float': 'left'
} );
}
return true;
},
/**
* Initializes the DOM element with the line-box for drawing the lines
*/
initialize: function () {
this.$html = $( '<div>' )
.addClass( 'mw-revslider-pointer-line ' + this.name )
.append(
$( '<div>' ).addClass( 'mw-revslider-pointer-line-upper ' + this.name ),
$( '<div>' ).addClass( 'mw-revslider-pointer-line-lower ' + this.name ),
$( '<div>' ).addClass( 'mw-revslider-pointer-line-underline ' + this.name )
);
},
/**
* Adds colored top-borders for the diff columns fitting the line colors between pointers and columns
*/
addColoredColumnBorders: function () {
$( '#mw-diff-otitle1' ).addClass( 'mw-revslider-older-diff-column' );
$( '#mw-diff-ntitle1' ).addClass( 'mw-revslider-newer-diff-column' );
},
/**
* Remove colored top-borders for the diff columns fitting the line colors between pointers and columns
*/
removeColoredColumnBorders: function () {
$( '#mw-diff-otitle1' ).removeClass( 'mw-revslider-older-diff-column' );
$( '#mw-diff-ntitle1' ).removeClass( 'mw-revslider-newer-diff-column' );
},
/**
* Sets the hooks to draw the column borders
*/
setColumnBorderHooks: function () {
mw.hook( 'wikipage.diff' ).add( this.addColoredColumnBorders );
mw.hook( 'revslider.expand' ).add( this.addColoredColumnBorders );
mw.hook( 'revslider.collapse' ).add( this.removeColoredColumnBorders );
},
/**
* @return {jQuery}
*/
render: function () {
this.initialize();
this.setColumnBorderHooks();
return this.getElement();
},
/**
* @return {jQuery}
*/
getElement: function () {
return this.$html;
}
} );
mw.libs.revisionSlider = mw.libs.revisionSlider || {};
mw.libs.revisionSlider.PointerLine = PointerLine;
}( mediaWiki, jQuery ) );