diff options
Diffstat (limited to 'www/wiki/resources/src/mediawiki/htmlform/selectandother.js')
-rw-r--r-- | www/wiki/resources/src/mediawiki/htmlform/selectandother.js | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/www/wiki/resources/src/mediawiki/htmlform/selectandother.js b/www/wiki/resources/src/mediawiki/htmlform/selectandother.js new file mode 100644 index 00000000..fda67420 --- /dev/null +++ b/www/wiki/resources/src/mediawiki/htmlform/selectandother.js @@ -0,0 +1,66 @@ +/* + * 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 ) ); |