Merge "Introduce separate log action for deleting pages on move"
[lhc/web/wiklou.git] / resources / src / mediawiki / htmlform / hide-if.js
index f739746..5f60097 100644 (file)
         * @private
         * @param {jQuery} $el
         * @param {string} name
-        * @return {jQuery|null}
+        * @return {jQuery|OO.ui.Widget|null}
         */
        function hideIfGetField( $el, name ) {
-               var $found, $p,
+               var $found, $p, $widget,
                        suffix = name.replace( /^([^\[]+)/, '[$1]' );
 
                function nameFilter() {
                for ( $p = $el.parent(); $p.length > 0; $p = $p.parent() ) {
                        $found = $p.find( '[name]' ).filter( nameFilter );
                        if ( $found.length ) {
+                               $widget = $found.closest( '.oo-ui-widget[data-ooui]' );
+                               if ( $widget.length ) {
+                                       return OO.ui.Widget.static.infuse( $widget );
+                               }
                                return $found;
                        }
                }
         * @param {jQuery} $el
         * @param {Array} spec
         * @return {Array}
-        * @return {jQuery} return.0 Dependent fields
+        * @return {Array} return.0 Dependent fields, array of jQuery objects or OO.ui.Widgets
         * @return {Function} return.1 Test function
         */
        function hideIfParse( $el, spec ) {
-               var op, i, l, v, $field, $fields, fields, func, funcs, getVal;
+               var op, i, l, v, field, $field, fields, func, funcs, getVal;
 
                op = spec[ 0 ];
                l = spec.length;
                                                throw new Error( op + ' parameters must be arrays' );
                                        }
                                        v = hideIfParse( $el, spec[ i ] );
-                                       fields = fields.concat( v[ 0 ].toArray() );
+                                       fields = fields.concat( v[ 0 ] );
                                        funcs.push( v[ 1 ] );
                                }
-                               $fields = $( fields );
 
                                l = funcs.length;
                                switch ( op ) {
                                                break;
                                }
 
-                               return [ $fields, func ];
+                               return [ fields, func ];
 
                        case 'NOT':
                                if ( l !== 2 ) {
                                        throw new Error( 'NOT parameters must be arrays' );
                                }
                                v = hideIfParse( $el, spec[ 1 ] );
-                               $fields = v[ 0 ];
+                               fields = v[ 0 ];
                                func = v[ 1 ];
-                               return [ $fields, function () {
+                               return [ fields, function () {
                                        return !func();
                                } ];
 
                                if ( l !== 3 ) {
                                        throw new Error( op + ' takes exactly two parameters' );
                                }
-                               $field = hideIfGetField( $el, spec[ 1 ] );
-                               if ( !$field ) {
-                                       return [ $(), function () {
+                               field = hideIfGetField( $el, spec[ 1 ] );
+                               if ( !field ) {
+                                       return [ [], function () {
                                                return false;
                                        } ];
                                }
                                v = spec[ 2 ];
 
-                               if ( $field.first().prop( 'type' ) === 'radio' ||
-                                       $field.first().prop( 'type' ) === 'checkbox'
-                               ) {
-                                       getVal = function () {
-                                               var $selected = $field.filter( ':checked' );
-                                               return $selected.length ? $selected.val() : '';
-                                       };
+                               if ( !( field instanceof jQuery ) ) {
+                                       // field is a OO.ui.Widget
+                                       if ( field.supports( 'isSelected' ) ) {
+                                               getVal = function () {
+                                                       var selected = field.isSelected();
+                                                       return selected ? field.getValue() : '';
+                                               };
+                                       } else {
+                                               getVal = function () {
+                                                       return field.getValue();
+                                               };
+                                       }
                                } else {
-                                       getVal = function () {
-                                               return $field.val();
-                                       };
+                                       $field = $( field );
+                                       if ( $field.prop( 'type' ) === 'radio' || $field.prop( 'type' ) === 'checkbox' ) {
+                                               getVal = function () {
+                                                       var $selected = $field.filter( ':checked' );
+                                                       return $selected.length ? $selected.val() : '';
+                                               };
+                                       } else {
+                                               getVal = function () {
+                                                       return $field.val();
+                                               };
+                                       }
                                }
 
                                switch ( op ) {
                                                break;
                                }
 
-                               return [ $field, func ];
+                               return [ [ field ], func ];
 
                        default:
                                throw new Error( 'Unrecognized operation \'' + op + '\'' );
 
        mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
                $root.find( '.mw-htmlform-hide-if' ).each( function () {
-                       var v, $fields, test, func,
-                               $el = $( this ),
-                               spec = $el.data( 'hideIf' );
-
-                       if ( !spec ) {
-                               return;
+                       var v, i, fields, test, func, spec, self, modules, data, extraModules,
+                               $el = $( this );
+
+                       modules = [];
+                       if ( $el.is( '[data-ooui]' ) ) {
+                               modules.push( 'mediawiki.htmlform.ooui' );
+                               data = $el.data( 'mw-modules' );
+                               if ( data ) {
+                                       // We can trust this value, 'data-mw-*' attributes are banned from user content in Sanitizer
+                                       extraModules = data.split( ',' );
+                                       modules.push.apply( modules, extraModules );
+                               }
                        }
 
-                       v = hideIfParse( $el, spec );
-                       $fields = v[ 0 ];
-                       test = v[ 1 ];
-                       func = function () {
-                               if ( test() ) {
-                                       $el.hide();
+                       mw.loader.using( modules ).done( function () {
+                               if ( $el.is( '[data-ooui]' ) ) {
+                                       // self should be a FieldLayout that mixes in mw.htmlform.Element
+                                       self = OO.ui.FieldLayout.static.infuse( $el );
+                                       spec = self.hideIf;
+                                       // The original element has been replaced with infused one
+                                       $el = self.$element;
                                } else {
-                                       $el.show();
+                                       self = $el;
+                                       spec = $el.data( 'hideIf' );
+                               }
+
+                               if ( !spec ) {
+                                       return;
+                               }
+
+                               v = hideIfParse( $el, spec );
+                               fields = v[ 0 ];
+                               test = v[ 1 ];
+                               // The .toggle() method works mostly the same for jQuery objects and OO.ui.Widget
+                               func = function () {
+                                       self.toggle( !test() );
+                               };
+                               for ( i = 0; i < fields.length; i++ ) {
+                                       // The .on() method works mostly the same for jQuery objects and OO.ui.Widget
+                                       fields[ i ].on( 'change', func );
                                }
-                       };
-                       $fields.on( 'change', func );
-                       func();
+                               func();
+                       } );
                } );
        } );