/*
* 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 ) );