summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/UploadWizard/resources/details/uw.SingleLanguageInputWidget.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/UploadWizard/resources/details/uw.SingleLanguageInputWidget.js')
-rw-r--r--www/wiki/extensions/UploadWizard/resources/details/uw.SingleLanguageInputWidget.js248
1 files changed, 248 insertions, 0 deletions
diff --git a/www/wiki/extensions/UploadWizard/resources/details/uw.SingleLanguageInputWidget.js b/www/wiki/extensions/UploadWizard/resources/details/uw.SingleLanguageInputWidget.js
new file mode 100644
index 00000000..3edea4ea
--- /dev/null
+++ b/www/wiki/extensions/UploadWizard/resources/details/uw.SingleLanguageInputWidget.js
@@ -0,0 +1,248 @@
+( function ( mw, uw, $, OO ) {
+
+ /**
+ * A single language input field in UploadWizard's "Details" step form.
+ *
+ * @extends uw.DetailsWidget
+ * @constructor
+ * @param {Object} config
+ * @param {Object} config.languages { langcode: text } map of languages
+ * @param {Object} [config.defaultLanguage]
+ * @param {boolean} [config.canBeRemoved=true]
+ * @param {mw.Message} [config.placeholder] Placeholder text for input field
+ * @param {mw.Message} [config.remove] Title text for remove icon
+ * @param {number} [config.minLength=0] Minimum input length
+ * @param {number} [config.maxLength=99999] Maximum input length
+ */
+ uw.SingleLanguageInputWidget = function UWSingleLanguageInputWidget( config ) {
+ this.config = $.extend( {
+ placeholder: mw.message( '' ),
+ remove: mw.message( '' ),
+ minLength: 0,
+ maxLength: 99999
+ }, config );
+
+ uw.SingleLanguageInputWidget.parent.call( this );
+ uw.ValidationMessageElement.call( this );
+
+ if ( mw.loader.getState( 'ext.uls.mediawiki' ) === 'ready' ) {
+ this.languageSelector = new uw.UlsWidget( {
+ languages: config.languages,
+ classes: [ 'mwe-upwiz-singleLanguageInputWidget-language' ]
+ } );
+ } else {
+ this.languageSelector = new uw.LanguageDropdownWidget( {
+ languages: config.languages,
+ classes: [ 'mwe-upwiz-singleLanguageInputWidget-language' ]
+ } );
+ }
+ this.languageSelector.setValue( config.defaultLanguage || this.getDefaultLanguage() );
+
+ this.textInput = new OO.ui.MultilineTextInputWidget( {
+ classes: [ 'mwe-upwiz-singleLanguageInputWidget-text' ],
+ placeholder: this.config.placeholder.exists() ? this.config.placeholder.text() : '',
+ autosize: true,
+ rows: 2
+ } );
+ this.removeButton = new OO.ui.ButtonWidget( {
+ classes: [ 'mwe-upwiz-singleLanguageInputWidget-removeItem' ],
+ icon: 'trash',
+ framed: false,
+ flags: [ 'destructive' ],
+ title: this.config.remove.exists() ? this.config.remove.text() : ''
+ } );
+
+ this.removeButton.connect( this, {
+ click: 'onRemoveClick'
+ } );
+
+ this.languageSelector.connect( this, { select: [ 'emit', 'select' ] } );
+ // Aggregate 'change' event
+ // (but do not flash warnings in the user's face while they're typing)
+ this.textInput.on( 'change', OO.ui.debounce( this.emit.bind( this, 'change' ), 500 ) );
+
+ this.$element.addClass( 'mwe-upwiz-singleLanguageInputWidget' );
+ this.$element.append(
+ this.languageSelector.getElement(),
+ this.textInput.$element
+ );
+ // HACK: ValidationMessageElement will append messages after this.$body
+ this.$body = this.textInput.$element;
+ if ( this.config.canBeRemoved !== false ) {
+ this.$element.append( this.removeButton.$element );
+ this.$body = this.removeButton.$element; // HACK
+ }
+ };
+ OO.inheritClass( uw.SingleLanguageInputWidget, uw.DetailsWidget );
+ OO.mixinClass( uw.SingleLanguageInputWidget, uw.ValidationMessageElement );
+
+ /**
+ * Handle remove button click events.
+ *
+ * @private
+ */
+ uw.SingleLanguageInputWidget.prototype.onRemoveClick = function () {
+ var element = this.getElementGroup();
+
+ if ( element && $.isFunction( element.removeItems ) ) {
+ element.removeItems( [ this ] );
+ }
+ };
+
+ /**
+ * Check if the given language code can be used for inputs.
+ * If not, try finding a similar language code that can be.
+ *
+ * @private
+ * @param {string} code Language code
+ * @param {string} [fallback] Language code to use when there's nothing close,
+ * defaults to result of #getDefaultLanguage
+ * @return {string|null}
+ */
+ uw.SingleLanguageInputWidget.prototype.getClosestAllowedLanguage = function ( code, fallback ) {
+ // Is this still needed?
+ if ( code === 'nan' || code === 'minnan' ) {
+ code = 'zh-min-nan';
+ }
+ if ( this.config.languages[ code ] ) {
+ return code;
+ }
+ if ( code.lastIndexOf( '-' ) !== -1 ) {
+ return this.getClosestAllowedLanguage( code.substring( 0, code.lastIndexOf( '-' ) ) );
+ }
+ return arguments.length > 1 ? fallback : this.getDefaultLanguage();
+ };
+
+ /**
+ * Get the default language to use for inputs.
+ * Choose a sane default based on user preferences and wiki config.
+ *
+ * @private
+ * @return {string}
+ */
+ uw.SingleLanguageInputWidget.prototype.getDefaultLanguage = function () {
+ var defaultLanguage;
+
+ if ( this.defaultLanguage !== undefined ) {
+ return this.defaultLanguage;
+ }
+
+ if ( this.getClosestAllowedLanguage( mw.config.get( 'wgUserLanguage' ), null ) ) {
+ defaultLanguage = this.getClosestAllowedLanguage( mw.config.get( 'wgUserLanguage' ) );
+ } else if ( this.getClosestAllowedLanguage( mw.config.get( 'wgContentLanguage' ), null ) ) {
+ defaultLanguage = this.getClosestAllowedLanguage( mw.config.get( 'wgContentLanguage' ) );
+ } else if ( this.getClosestAllowedLanguage( 'en', null ) ) {
+ defaultLanguage = this.getClosestAllowedLanguage( 'en' );
+ } else {
+ defaultLanguage = Object.keys( this.config.languages )[ 0 ];
+ }
+
+ // Logic copied from MediaWiki:UploadForm.js
+ // Per request from Portuguese and Brazilian users, treat Brazilian Portuguese as Portuguese.
+ if ( defaultLanguage === 'pt-br' ) {
+ defaultLanguage = 'pt';
+ // this was also in UploadForm.js, but without the heartwarming justification
+ } else if ( defaultLanguage === 'en-gb' ) {
+ defaultLanguage = 'en';
+ }
+
+ this.defaultLanguage = defaultLanguage;
+ return defaultLanguage;
+ };
+
+ /**
+ * @inheritdoc
+ */
+ uw.SingleLanguageInputWidget.prototype.getErrors = function () {
+ var
+ errors = [],
+ text = this.textInput.getValue().trim();
+
+ if ( text.length !== 0 && text.length < this.config.minLength ) {
+ // Empty input is allowed
+ errors.push( mw.message( 'mwe-upwiz-error-too-short', this.config.minLength ) );
+ }
+ if ( text.length > this.config.maxLength ) {
+ errors.push( mw.message( 'mwe-upwiz-error-too-long', this.config.maxLength ) );
+ }
+
+ return $.Deferred().resolve( errors ).promise();
+ };
+
+ /**
+ * @param {object} languages
+ */
+ uw.SingleLanguageInputWidget.prototype.updateLanguages = function ( languages ) {
+ this.languageSelector.updateLanguages( languages );
+ };
+
+ /**
+ * @return {string} language code
+ */
+ uw.SingleLanguageInputWidget.prototype.getLanguage = function () {
+ return this.languageSelector.getValue();
+ };
+
+ /**
+ * @param {string} value language code
+ */
+ uw.SingleLanguageInputWidget.prototype.setLanguage = function ( value ) {
+ this.languageSelector.setValue( value );
+ };
+
+ /**
+ * @return {string} text input
+ */
+ uw.SingleLanguageInputWidget.prototype.getText = function () {
+ return this.textInput.getValue().trim();
+ };
+
+ /**
+ * @param {string} value text input
+ */
+ uw.SingleLanguageInputWidget.prototype.setText = function ( value ) {
+ this.textInput.setValue( value );
+ };
+
+ /**
+ * @inheritdoc
+ */
+ uw.SingleLanguageInputWidget.prototype.getWikiText = function () {
+ var
+ language = this.getLanguage(),
+ text = this.getText();
+
+ if ( !text ) {
+ return '';
+ }
+
+ if ( mw.UploadWizard.config.languageTemplateFixups[ language ] ) {
+ language = mw.UploadWizard.config.languageTemplateFixups[ language ];
+ }
+
+ return '{{' + language + '|1=' + mw.Escaper.escapeForTemplate( text ) + '}}';
+ };
+
+ /**
+ * @inheritdoc
+ * @return {Object} See #setSerialized
+ */
+ uw.SingleLanguageInputWidget.prototype.getSerialized = function () {
+ return {
+ language: this.languageSelector.getValue(),
+ text: this.textInput.getValue()
+ };
+ };
+
+ /**
+ * @inheritdoc
+ * @param {Object} serialized
+ * @param {string} serialized.language Language code
+ * @param {string} serialized.text Text
+ */
+ uw.SingleLanguageInputWidget.prototype.setSerialized = function ( serialized ) {
+ this.setLanguage( serialized.language );
+ this.setText( serialized.text );
+ };
+
+}( mediaWiki, mediaWiki.uploadWizard, jQuery, OO ) );