summaryrefslogtreecommitdiff
path: root/www/wiki/resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.js')
-rw-r--r--www/wiki/resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.js145
1 files changed, 145 insertions, 0 deletions
diff --git a/www/wiki/resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.js b/www/wiki/resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.js
new file mode 100644
index 00000000..19603513
--- /dev/null
+++ b/www/wiki/resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.js
@@ -0,0 +1,145 @@
+/*!
+ * MediaWiki Widgets - SelectWithInputWidget class.
+ *
+ * @copyright 2011-2017 MediaWiki Widgets Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+ /**
+ * Select with input widget. Displays an OO.ui.TextInputWidget along with
+ * an OO.ui.DropdownInputWidget.
+ * TODO Explain the OTHER option
+ *
+ * mw.loader.using( 'mediawiki.widgets.SelectWithInputWidget', function () {
+ * var swi = new mw.widgets.SelectWithInputWidget( {
+ * or: true,
+ * dropdowninput: {
+ * options: [
+ * { data: 'other', label: 'Other' },
+ * { data: 'a', label: 'First' },
+ * { data: 'b', label: 'Second' },
+ * { data: 'c', label: 'Third' }
+ * ]
+ * },
+ * textinput: {
+ * }
+ * } );
+ *
+ * $( 'body' ).append( swi.$element );
+ * } );
+ *
+ * @class mw.widgets.SelectWithInputWidget
+ * @extends OO.ui.Widget
+ *
+ * @constructor
+ * @param {Object} [config] Configuration options
+ * @cfg {Object} [dropdowninput] Config for the dropdown
+ * @cfg {Object} [textinput] Config for the text input
+ * @cfg {boolean} [or=false] Config for whether the widget is dropdown AND input
+ * or dropdown OR input
+ */
+ mw.widgets.SelectWithInputWidget = function MwWidgetsSelectWithInputWidget( config ) {
+ // Config initialization
+ config = $.extend( { or: false }, config );
+
+ // Properties
+ this.textinput = new OO.ui.TextInputWidget( config.textinput );
+ this.dropdowninput = new OO.ui.DropdownInputWidget( config.dropdowninput );
+ this.or = config.or;
+
+ // Events
+ this.dropdowninput.on( 'change', this.onChange.bind( this ) );
+
+ // Parent constructor
+ mw.widgets.SelectWithInputWidget.parent.call( this, config );
+
+ // Initialization
+ this.$element
+ .addClass( 'mw-widget-selectWithInputWidget' )
+ .append(
+ this.dropdowninput.$element,
+ this.textinput.$element
+ );
+ this.onChange();
+ };
+
+ /* Setup */
+ OO.inheritClass( mw.widgets.SelectWithInputWidget, OO.ui.Widget );
+
+ /* Static Methods */
+
+ /**
+ * @inheritdoc
+ */
+ mw.widgets.SelectWithInputWidget.static.reusePreInfuseDOM = function ( node, config ) {
+ config = mw.widgets.SelectWithInputWidget.parent.static.reusePreInfuseDOM( node, config );
+ config.dropdowninput = OO.ui.DropdownInputWidget.static.reusePreInfuseDOM(
+ $( node ).find( '.oo-ui-dropdownInputWidget' ),
+ config.dropdowninput
+ );
+ config.textinput = OO.ui.TextInputWidget.static.reusePreInfuseDOM(
+ $( node ).find( '.oo-ui-textInputWidget' ),
+ config.textinput
+ );
+ return config;
+ };
+
+ /**
+ * @inheritdoc
+ */
+ mw.widgets.SelectWithInputWidget.static.gatherPreInfuseState = function ( node, config ) {
+ var state = mw.widgets.SelectWithInputWidget.parent.static.gatherPreInfuseState( node, config );
+ state.dropdowninput = OO.ui.DropdownInputWidget.static.gatherPreInfuseState(
+ $( node ).find( '.oo-ui-dropdownInputWidget' ),
+ config.dropdowninput
+ );
+ state.textinput = OO.ui.TextInputWidget.static.gatherPreInfuseState(
+ $( node ).find( '.oo-ui-textInputWidget' ),
+ config.textinput
+ );
+ return state;
+ };
+
+ /* Methods */
+
+ /**
+ * @inheritdoc
+ */
+ mw.widgets.SelectWithInputWidget.prototype.restorePreInfuseState = function ( state ) {
+ mw.widgets.SelectWithInputWidget.parent.prototype.restorePreInfuseState.call( this, state );
+ this.dropdowninput.restorePreInfuseState( state.dropdowninput );
+ this.textinput.restorePreInfuseState( state.textinput );
+ };
+
+ /**
+ * @inheritdoc
+ */
+ mw.widgets.SelectWithInputWidget.prototype.setDisabled = function ( disabled ) {
+ var textinputIsHidden = this.or && this.dropdowninput.getValue() !== 'other';
+ mw.widgets.SelectWithInputWidget.parent.prototype.setDisabled.call( this, disabled );
+ this.dropdowninput.setDisabled( disabled );
+ // It is impossible to submit a form with hidden fields failing validation, e.g. one that
+ // is required. However, validity is not checked for disabled fields, as these are not
+ // submitted with the form. So we should also disable fields when hiding them.
+ this.textinput.setDisabled( textinputIsHidden || disabled );
+ };
+
+ /**
+ * Handle change events on the DropdownInput
+ *
+ * @param {string|undefined} value
+ * @private
+ */
+ mw.widgets.SelectWithInputWidget.prototype.onChange = function ( value ) {
+ if ( this.or ) {
+ value = value || this.dropdowninput.getValue();
+ this.textinput.$element.toggle( value === 'other' );
+ // It is impossible to submit a form with hidden fields failing validation, e.g. one that
+ // is required. However, validity is not checked for disabled fields, as these are not
+ // submitted with the form. So we should also disable fields when hiding them.
+ this.textinput.setDisabled( value !== 'other' || this.isDisabled() );
+ }
+ };
+
+}( jQuery, mediaWiki ) );