mediawiki-extensions-Visual.../modules/ve/ui/widgets/ve.ui.LanguageInputWidget.js
Moriel Schottlender 59079978ff Language Inspector UI
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
2013-07-29 00:38:59 -04:00

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 '';
};