Implement mw.toolbar.addButtons
authorhelder.wiki <helder.wiki@gmail.com>
Wed, 26 Sep 2012 14:52:57 +0000 (11:52 -0300)
committerHelder.wiki <helder.wiki@gmail.com>
Mon, 1 Jul 2013 20:43:56 +0000 (20:43 +0000)
Example:

```
var skinPath;
if ( mw.toolbar ) {
    skinPath = mw.config.get( 'stylepath' );
    mw.toolbar.addButtons( [ {
        imageFile: skinPath + '/common/images/button_bold.png',
        speedTip: 'add foo tag',
        tagOpen: '<foo>',
        tagClose: '</foo>',
        sampleText: 'foo here',
        imageId: 'foo-id'
    }, {
        // ..
    } ] );

    mw.toolbar.addButtons( {
        imageFile: skinPath + '/common/images/button_bold.png',
        speedTip: 'add foo tag',
        tagOpen: '<foo>',
        tagClose: '</foo>',
        sampleText: 'foo here',
        imageId: 'foo-id'
    }, {
        // ..
    } );

    mw.toolbar.addButton( {
        imageFile: skinPath + '/common/images/button_link.png',
        speedTip: 'add baz tag',
        tagOpen: '<baz>',
        tagClose: '</baz>',
        sampleText: 'baz here',
        imageId: 'baz-id'
    } );

    mw.toolbar.addButton(
        skinPath + '/common/images/button_link.png',
        'add baz2 tag',
        '<baz2>',
        '</baz2>',
        'baz2 here',
        'baz2-id'
    );
}
```

Clean up:
* Rename currentFocused to $currentFocused (we are using jQuery);
* Add missing dependency 'mediawiki.legacy.wikibits', since this
  module uses the array window.mwCustomEditButtons.

Bug: 40518
Change-Id: I76d1f753cb9e1c119d9b5e7f565acd684f5516d1

RELEASE-NOTES-1.22
resources/Resources.php
resources/mediawiki.action/mediawiki.action.edit.js

index ca653ef..0932155 100644 (file)
@@ -115,6 +115,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;
                                } );
                }
        });