mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-11-18 11:46:01 +00:00
59079978ff
This is the language inspector UI engine with ULS core. The Language Inspector works alongside ULS to choose and change language blocks in text. The inspector was based on ve.ui.TextInputWidget and now changed to inherit ve.ui.Widget and display details in a table instead of an input textbox. Added jQuery.ULS module: * Repository: https://github.com/wikimedia/jquery.uls * Latest Commit 728f112ffc90b03b50c0109487886a2647f12020 * Taken 'src' / 'images' and 'css' folders into modules/jquery.uls Bug: 47759 Change-Id: I3c9fd6c135c05a54f6c7fc28c5962fc0a6677806
201 lines
5.3 KiB
JavaScript
201 lines
5.3 KiB
JavaScript
/*!
|
|
* VisualEditor UserInterface LanguageInputWidget class.
|
|
*
|
|
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
|
|
* @license The MIT License (MIT); see LICENSE.txt
|
|
*/
|
|
|
|
/**
|
|
* Creates an ve.ui.LanguageInputWidget object.
|
|
*
|
|
* @class
|
|
* @extends ve.ui.TextInputWidget
|
|
*
|
|
* @constructor
|
|
* @param {Object} [config] Config options
|
|
*/
|
|
ve.ui.LanguageInputWidget = function VeUiLanguageInputWidget( config ) {
|
|
var ulsParams, langInpObj, table;
|
|
|
|
// Parent constructor
|
|
ve.ui.Widget.call( this, config );
|
|
|
|
// Properties
|
|
this.$langCodeDisp = this.getDisplayElement( config ); // language code
|
|
this.$langNameDisp = this.getDisplayElement( config ); // human-readable language name
|
|
this.$dirDisp = this.getDisplayElement( config );
|
|
|
|
// Placeholders for annotation value
|
|
this.annotation = null;
|
|
this.lang = '';
|
|
this.dir = '';
|
|
|
|
// Create the informational table:
|
|
table = $( '<table>' ).css( { 'width': '100%' } )
|
|
.addClass( 've-LanguageInspector-information' )
|
|
.append( $( '<tr>' )
|
|
.append( $( '<td>' )
|
|
.addClass( 've-ui-LanguageInspector-info-title' )
|
|
.text( ve.msg( 'visualeditor-languageinspector-widget-label-language' ) ) )
|
|
.append( $( '<td>' )
|
|
.addClass( 've-ui-LanguageInspector-info-langname' )
|
|
.append( this.$langNameDisp ) ) )
|
|
.append( $( '<tr>' )
|
|
.append( $( '<td>' )
|
|
.addClass( 've-ui-LanguageInspector-info-title' )
|
|
.text( ve.msg( 'visualeditor-languageinspector-widget-label-langcode' ) ) )
|
|
.append( $( '<td>' )
|
|
.addClass( 've-ui-LanguageInspector-info-langcode' )
|
|
.append( this.$langCodeDisp ) ) )
|
|
.append( $( '<tr>' )
|
|
.append( $( '<td>' )
|
|
.addClass( 've-ui-LanguageInspector-info-title' )
|
|
.text( ve.msg( 'visualeditor-languageinspector-widget-label-direction' ) ) )
|
|
.append( $( '<td>' )
|
|
.addClass( 've-ui-LanguageInspector-info-dir' )
|
|
.append( this.$dirDisp ) ) );
|
|
this.$.append( table );
|
|
|
|
// Use a different reference than 'this' to avoid scope problems
|
|
// inside the $.ULS callback:
|
|
langInpObj = this;
|
|
|
|
// Initialization
|
|
this.$.addClass( 've-ui-LangInputWidget' );
|
|
|
|
ulsParams = {
|
|
onSelect: function( language ) {
|
|
langInpObj.setValue( language );
|
|
},
|
|
compact: true,
|
|
// Temporary Quicklist for the Prototype:
|
|
// (This will likely change once we find a better list)
|
|
quickList: [ 'en', 'hi', 'he', 'ml', 'ta', 'fr' ]
|
|
};
|
|
|
|
// Create a 'change language' Button:
|
|
this.$button = new ve.ui.ButtonWidget({
|
|
'label': ve.msg( 'visualeditor-languageinspector-widget-changelang' ),
|
|
'flags': ['primary']
|
|
});
|
|
|
|
// Attach ULS event call
|
|
this.$button.$.uls( ulsParams );
|
|
|
|
this.$.append( this.$button.$ );
|
|
};
|
|
|
|
/* Inheritance */
|
|
|
|
ve.inheritClass( ve.ui.LanguageInputWidget, ve.ui.Widget );
|
|
|
|
/* Methods */
|
|
/**
|
|
* Get display element. This replaces the 'getInputElement'
|
|
* of the InputWidget
|
|
*
|
|
* @method
|
|
* @param {Object} [config] Config options
|
|
* @returns {jQuery} span element
|
|
*/
|
|
ve.ui.LanguageInputWidget.prototype.getDisplayElement = function () {
|
|
return this.$$( '<span>' );
|
|
};
|
|
|
|
/**
|
|
* Set the value of the language display
|
|
*
|
|
* Overrides setValue to keep annotations in sync.
|
|
*
|
|
* @method
|
|
* @param {string} value New value
|
|
*/
|
|
ve.ui.LanguageInputWidget.prototype.setValue = function ( value ) {
|
|
// Keep annotation in sync with value
|
|
if ( value === '' ) {
|
|
this.annotation = null;
|
|
} else {
|
|
// Set up the annotation:
|
|
this.setAnnotation( new ve.dm.LanguageAnnotation( {
|
|
'type': 'language',
|
|
'attributes': {
|
|
'lang': value,
|
|
'dir': $.uls.data.getDir( value )
|
|
}
|
|
} ) );
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Get the value of the current annotation
|
|
*/
|
|
ve.ui.LanguageInputWidget.prototype.getValue = function () {
|
|
// Specifically to be displayed
|
|
return this.lang;
|
|
};
|
|
/**
|
|
* Sets the annotation value.
|
|
*
|
|
* The input value will automatically be updated.
|
|
*
|
|
* @method
|
|
* @param {ve.dm.LanguageAnnotation} annotation Language annotation
|
|
* @chainable
|
|
*/
|
|
ve.ui.LanguageInputWidget.prototype.setAnnotation = function ( annotation ) {
|
|
var langNameDisp = '';
|
|
this.annotation = annotation;
|
|
|
|
// Give precedence to dir value if it already exists:
|
|
if ( annotation.element.attributes.dir ) {
|
|
this.dir = annotation.element.attributes.dir;
|
|
}
|
|
|
|
// Set language according to currently set language
|
|
// or leave blank if element has no language set
|
|
if ( annotation.element.attributes.lang ) {
|
|
this.lang = annotation.element.attributes.lang;
|
|
// Take the full name of the language from its code:
|
|
langNameDisp = $.uls.data.getAutonym( this.lang );
|
|
} else {
|
|
this.lang = '';
|
|
}
|
|
|
|
// If language exists, but dir is undefined/null,
|
|
// fix the dir in terms of language:
|
|
if ( this.lang && !this.dir ) {
|
|
this.dir = $.uls.data.getDir( this.lang );
|
|
}
|
|
|
|
// Display the information in the table:
|
|
this.$langCodeDisp.html( this.lang );
|
|
this.$langNameDisp.html( langNameDisp );
|
|
this.$dirDisp.html( this.dir );
|
|
|
|
return this;
|
|
};
|
|
|
|
/**
|
|
* Gets the annotation value.
|
|
*
|
|
* @method
|
|
* @returns {ve.dm.LanguageAnnotation} Language annotation
|
|
*/
|
|
ve.ui.LanguageInputWidget.prototype.getAnnotation = function () {
|
|
return this.annotation;
|
|
};
|
|
|
|
/**
|
|
* Gets a target from an annotation.
|
|
*
|
|
* @method
|
|
* @param {ve.dm.LanguageAnnotation} annotation Language annotation
|
|
* @returns {string} Language
|
|
*/
|
|
ve.ui.LanguageInputWidget.prototype.getLanguageFromAnnotation = function ( annotation ) {
|
|
if ( annotation instanceof ve.dm.LanguageAnnotation ) {
|
|
return annotation.getAttribute( 'lang' );
|
|
}
|
|
return '';
|
|
};
|