mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-11-16 10:59:56 +00:00
29f5630957
The purpose is to flip the direction of the input inside the link widget for RTL wikis, but flip it again to LTR if the user inserts an external URL. This is my first VE fix, I tried to follow conventions and avoid touching the parent objects that are unrelated to URLs. Bug: 47717 Change-Id: Ic13b9c3b155ce2979298cac9518c7419b9d45bac
131 lines
2.9 KiB
JavaScript
131 lines
2.9 KiB
JavaScript
/*!
|
|
* VisualEditor UserInterface LinkTargetInputWidget class.
|
|
*
|
|
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
|
|
* @license The MIT License (MIT); see LICENSE.txt
|
|
*/
|
|
|
|
/**
|
|
* Creates an ve.ui.LinkTargetInputWidget object.
|
|
*
|
|
* @class
|
|
* @extends ve.ui.TextInputWidget
|
|
*
|
|
* @constructor
|
|
* @param {Object} [config] Config options
|
|
*/
|
|
ve.ui.LinkTargetInputWidget = function VeUiLinkTargetInputWidget( config ) {
|
|
// Parent constructor
|
|
ve.ui.TextInputWidget.call( this, config );
|
|
|
|
// Properties
|
|
this.annotation = null;
|
|
|
|
// Initialization
|
|
this.$.addClass( 've-ui-linkTargetInputWidget' );
|
|
|
|
// Default RTL/LTR check
|
|
if ( $( 'body' ).hasClass( 'rtl' ) ) {
|
|
this.$input.addClass( 've-ui-rtl' );
|
|
}
|
|
};
|
|
|
|
/* Inheritance */
|
|
|
|
ve.inheritClass( ve.ui.LinkTargetInputWidget, ve.ui.TextInputWidget );
|
|
|
|
/* Methods */
|
|
|
|
/**
|
|
* Handle value-changing events
|
|
*
|
|
* Overrides onEdit to perform RTL test based on the typed URL
|
|
*
|
|
* @method
|
|
*/
|
|
ve.ui.LinkTargetInputWidget.prototype.onEdit = function () {
|
|
if ( !this.disabled ) {
|
|
|
|
// Allow the stack to clear so the value will be updated
|
|
setTimeout( ve.bind( function () {
|
|
// RTL/LTR check
|
|
if ( $( 'body' ).hasClass( 'rtl' ) ) {
|
|
var isExt = ve.init.platform.getExternalLinkUrlProtocolsRegExp().test( this.$input.val() );
|
|
// If URL is external, flip to LTR. Otherwise, set back to RTL
|
|
this.setRTL( !isExt );
|
|
}
|
|
this.setValue( this.$input.val() );
|
|
}, this ) );
|
|
}
|
|
|
|
};
|
|
/**
|
|
* Set the value of the input.
|
|
*
|
|
* Overrides setValue to keep annotations in sync.
|
|
*
|
|
* @method
|
|
* @param {string} value New value
|
|
*/
|
|
ve.ui.LinkTargetInputWidget.prototype.setValue = function ( value ) {
|
|
// Keep annotation in sync with value
|
|
value = this.sanitizeValue( value );
|
|
if ( value === '' ) {
|
|
this.annotation = null;
|
|
} else {
|
|
this.setAnnotation( new ve.dm.LinkAnnotation( {
|
|
'type': 'link',
|
|
'attributes': {
|
|
'href': value
|
|
}
|
|
} ) );
|
|
}
|
|
|
|
// Call parent method
|
|
ve.ui.TextInputWidget.prototype.setValue.call( this, value );
|
|
};
|
|
|
|
/**
|
|
* Sets the annotation value.
|
|
*
|
|
* The input value will automatically be updated.
|
|
*
|
|
* @method
|
|
* @param {ve.dm.LinkAnnotation} annotation Link annotation
|
|
* @chainable
|
|
*/
|
|
ve.ui.LinkTargetInputWidget.prototype.setAnnotation = function ( annotation ) {
|
|
this.annotation = annotation;
|
|
|
|
// Call parent method
|
|
ve.ui.TextInputWidget.prototype.setValue.call(
|
|
this, this.getTargetFromAnnotation( annotation )
|
|
);
|
|
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* Gets the annotation value.
|
|
*
|
|
* @method
|
|
* @returns {ve.dm.LinkAnnotation} Link annotation
|
|
*/
|
|
ve.ui.LinkTargetInputWidget.prototype.getAnnotation = function () {
|
|
return this.annotation;
|
|
};
|
|
|
|
/**
|
|
* Gets a target from an annotation.
|
|
*
|
|
* @method
|
|
* @param {ve.dm.LinkAnnotation} annotation Link annotation
|
|
* @returns {string} Target
|
|
*/
|
|
ve.ui.LinkTargetInputWidget.prototype.getTargetFromAnnotation = function ( annotation ) {
|
|
if ( annotation instanceof ve.dm.LinkAnnotation ) {
|
|
return annotation.getAttribute( 'href' );
|
|
}
|
|
return '';
|
|
};
|