/* * HTMLForm enhancements: * Add a dynamic max length to the reason field of SelectAndOther. */ ( function ( mw, $ ) { // cache the separator to avoid object creation on each keypress var colonSeparator = mw.message( 'colon-separator' ).text(); mw.hook( 'htmlform.enhance' ).add( function ( $root ) { // This checks the length together with the value from the select field // When the reason list is changed and the bytelimit is longer than the allowed, // nothing is done $root .find( '.mw-htmlform-select-and-other-field' ) .each( function () { var $reasonList, currentValReasonList, maxlengthUnit, lengthLimiter, widget, $this = $( this ), $widget = $this.closest( '.oo-ui-widget[data-ooui]' ); if ( $widget ) { mw.loader.using( 'mediawiki.widgets.SelectWithInputWidget', function () { widget = OO.ui.Widget.static.infuse( $widget ); maxlengthUnit = widget.getData().maxlengthUnit; lengthLimiter = maxlengthUnit === 'codepoints' ? 'codePointLimit' : 'byteLimit'; widget.textinput.$input[ lengthLimiter ]( function ( input ) { // Should be built the same as in HTMLSelectAndOtherField::loadDataFromRequest var comment = widget.dropdowninput.getValue(); if ( comment === 'other' ) { comment = input; } else if ( input !== '' ) { // Entry from drop down menu + additional comment comment += colonSeparator + input; } return comment; } ); } ); } else { // find the reason list $reasonList = $root.find( '#' + $this.data( 'id-select' ) ); // cache the current selection to avoid expensive lookup currentValReasonList = $reasonList.val(); $reasonList.change( function () { currentValReasonList = $reasonList.val(); } ); // Select the function for the length limit maxlengthUnit = $this.data( 'mw-maxlength-unit' ); lengthLimiter = maxlengthUnit === 'codepoints' ? 'codePointLimit' : 'byteLimit'; $this[ lengthLimiter ]( function ( input ) { // Should be built the same as in HTMLSelectAndOtherField::loadDataFromRequest var comment = currentValReasonList; if ( comment === 'other' ) { comment = input; } else if ( input !== '' ) { // Entry from drop down menu + additional comment comment += colonSeparator + input; } return comment; } ); } } ); } ); }( mediaWiki, jQuery ) );