summaryrefslogtreecommitdiff
path: root/www/wiki/resources/src/mediawiki/htmlform/selectandother.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/resources/src/mediawiki/htmlform/selectandother.js')
-rw-r--r--www/wiki/resources/src/mediawiki/htmlform/selectandother.js66
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 ) );