Merge "Implement mw.toolbar.addButtons"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 1 Jul 2013 21:13:48 +0000 (21:13 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 1 Jul 2013 21:13:48 +0000 (21:13 +0000)
RELEASE-NOTES-1.22
resources/Resources.php
resources/mediawiki.action/mediawiki.action.edit.js

index 3e12e92..fb8896a 100644 (file)
@@ -117,6 +117,8 @@ production.
 * (bug 46513) Vector: Add the collapsibleTabs script from the Vector extension.
 * Added $wgRecentChangesFlags for defining new flags for RecentChanges and
   watchlists.
+* (bug 40518) mw.toolbar: Implemented mw.toolbar.addButtons for adding multiple
+ button objects in one call.
 
 === Bug fixes in 1.22 ===
 * Disable Special:PasswordReset when $wgEnableEmail is false. Previously one
index f931ad8..d6852c3 100644 (file)
@@ -719,6 +719,7 @@ return array(
        'mediawiki.action.edit' => array(
                'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.js',
                'dependencies' => array(
+                       'mediawiki.legacy.wikibits',
                        'jquery.textSelection',
                        'jquery.byteLimit',
                ),
index 1c5a018..d29ee42 100644 (file)
@@ -5,7 +5,7 @@
  * @singleton
  */
 ( function ( mw, $ ) {
-       var toolbar, isReady, $toolbar, queue, slice, currentFocused;
+       var toolbar, isReady, $toolbar, queue, slice, $currentFocused;
 
        /**
         * Internal helper that does the actual insertion of the button into the toolbar.
 
        isReady = false;
        $toolbar = false;
+       /**
+        * @private
+        * @property {Array}
+        * Contains button objects (and for backwards compatibilty, it can
+        * also contains an arguments array for insertButton).
+        */
        queue = [];
        slice = queue.slice;
 
                                queue.push( slice.call( arguments ) );
                        }
                },
+               /**
+                * Example usage:
+                *     addButtons( [ { .. }, { .. }, { .. } ] );
+                *     addButtons( { .. }, { .. } );
+                *
+                * @param {Object|Array} [buttons...] An array of button objects or the first
+                *  button object in a list of variadic arguments.
+                */
+               addButtons: function ( buttons ) {
+                       if ( !$.isArray( buttons ) ) {
+                               buttons = slice.call( arguments );
+                       }
+                       if ( isReady ) {
+                               $.each( buttons, function () {
+                                       insertButton( this );
+                               } );
+                       } else {
+                               // Push each button into the queue
+                               queue.push.apply( queue, buttons );
+                       }
+               },
 
                /**
                 * Apply tagOpen/tagClose to selection in currently focused textarea.
                 * @param {string} sampleText
                 */
                insertTags: function ( tagOpen, tagClose, sampleText ) {
-                       if ( currentFocused && currentFocused.length ) {
-                               currentFocused.textSelection(
+                       if ( $currentFocused && $currentFocused.length ) {
+                               $currentFocused.textSelection(
                                        'encapsulateSelection', {
-                                               'pre': tagOpen,
-                                               'peri': sampleText,
-                                               'post': tagClose
+                                               pre: tagOpen,
+                                               peri: sampleText,
+                                               post: tagClose
                                        }
                                );
                        }
                var buttons, i, b, $iframe, editBox, scrollTop, $editForm;
 
                // currentFocus is used to determine where to insert tags
-               currentFocused = $( '#wpTextbox1' );
+               $currentFocused = $( '#wpTextbox1' );
 
                // Populate the selector cache for $toolbar
                $toolbar = $( '#toolbar' );
                buttons = [].concat( queue, window.mwCustomEditButtons );
                // Clear queue
                queue.length = 0;
+
                for ( i = 0; i < buttons.length; i++ ) {
                        b = buttons[i];
                        if ( $.isArray( b ) ) {
                                // Forwarded arguments array from mw.toolbar.addButton
                                insertButton.apply( toolbar, b );
                        } else {
-                               // Raw object from legacy mwCustomEditButtons
+                               // Raw object from mw.toolbar.addButtons or mwCustomEditButtons
                                insertButton( b );
                        }
                }
 
                // This causes further calls to addButton to go to insertion directly
-               // instead of to the toolbar.buttons queue.
+               // instead of to the queue.
                // It is important that this is after the one and only loop through
-               // the the toolbar.buttons queue
+               // the the queue
                isReady = true;
 
                // Make sure edit summary does not exceed byte limit
 
                // Apply to dynamically created textboxes as well as normal ones
                $( document ).on( 'focus', 'textarea, input:text', function () {
-                       currentFocused = $( this );
+                       $currentFocused = $( this );
                } );
 
-               // HACK: make currentFocused work with the usability iframe
+               // HACK: make $currentFocused work with the usability iframe
                // With proper focus detection support (HTML 5!) this'll be much cleaner
                // TODO: Get rid of this WikiEditor code from MediaWiki core!
                $iframe = $( '.wikiEditor-ui-text iframe' );
                                // for IE
                                .add( $iframe.get( 0 ).contentWindow.document.body )
                                .focus( function () {
-                                       currentFocused = $iframe;
+                                       $currentFocused = $iframe;
                                } );
                }
        });