Henning Snater has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/101202


Change subject: Create only one rank selector menu
......................................................................

Create only one rank selector menu

Since only one rank selector menu may be displayed at a time, there is no need 
to create
individual menus for each rank selector widget.

Change-Id: I002931069429c867bda51a25a975430f3b684900
---
M lib/resources/jquery.wikibase/jquery.wikibase.statementview.RankSelector.js
M 
lib/tests/qunit/jquery.wikibase/jquery.wikibase.statementview.RankSelector.tests.js
2 files changed, 114 insertions(+), 40 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/02/101202/1

diff --git 
a/lib/resources/jquery.wikibase/jquery.wikibase.statementview.RankSelector.js 
b/lib/resources/jquery.wikibase/jquery.wikibase.statementview.RankSelector.js
index dfb35bb..e1b9b29 100644
--- 
a/lib/resources/jquery.wikibase/jquery.wikibase.statementview.RankSelector.js
+++ 
b/lib/resources/jquery.wikibase/jquery.wikibase.statementview.RankSelector.js
@@ -8,6 +8,12 @@
        var PARENT = $.Widget;
 
        /**
+        * The node of the rank selector menu to select a rank from.
+        * @type {jQuery}
+        */
+       var $menu = null;
+
+       /**
         * Selector for choosing a statement rank.
         * @since 0.5
         *
@@ -35,10 +41,11 @@
                },
 
                /**
-                * The node of the menu to select the rank from.
-                * @type {jQuery}
+                * The rank currently featured by the rank selector.
+                * @see wikibase.Statement.RANK
+                * @type {number}
                 */
-               $menu: null,
+               _rank: null,
 
                /**
                 * Icon node.
@@ -52,7 +59,18 @@
                _create: function() {
                        var self = this;
 
-                       this.$menu = this._buildMenu().appendTo( 'body' 
).hide();
+                       if( !$menu ) {
+                               $menu = this._buildMenu().appendTo( 'body' 
).hide();
+
+                               $menu.on( 'click.' + this.widgetName, function( 
event ) {
+                                       var $li = $( event.target ).closest( 
'li' ),
+                                               rank = $li.data( 
self.widgetName + '-menuitem-rank' );
+
+                                       if( rank !== undefined ) {
+                                               $.data( this, self.widgetName 
).rank( rank );
+                                       }
+                               } );
+                       }
 
                        this.element
                        .addClass( this.widgetBaseClass )
@@ -67,12 +85,14 @@
                                }
                        } )
                        .on( 'click.' + this.widgetName, function( event ) {
-                               if( self.isDisabled() || self.$menu.is( 
':visible' ) ) {
-                                       self.$menu.hide();
+                               if( self.isDisabled() || $menu.is( ':visible' ) 
) {
+                                       $menu.hide();
                                        return;
                                }
 
-                               self.$menu.show();
+                               $menu.data( self.widgetName, self );
+                               $menu.show();
+                               self._updateMenuCss();
                                self.repositionMenu();
 
                                self.element.addClass( 'ui-state-active' );
@@ -81,7 +101,7 @@
                                // menu itself or outside of it:
                                var degrade = function( event ) {
                                        if ( event.target !== self.element.get( 
0 ) ) {
-                                               self.$menu.hide();
+                                               $menu.hide();
                                                self.element.removeClass( 
'ui-state-active' );
                                        }
                                        self._unbindGlobalEventListeners();
@@ -93,15 +113,6 @@
 
                        this.$icon = mw.template( 'wb-rankselector', '', '' 
).appendTo( this.element );
 
-                       self.$menu.on( 'click.' + this.widgetName, function( 
event ) {
-                               var $li = $( event.target ).closest( 'li' ),
-                                       rank = $li.data( self.widgetName + 
'-menuitem-rank' );
-
-                               if( rank !== undefined ) {
-                                       self.rank( rank );
-                               }
-                       } );
-
                        this._setRank( this.options.rank );
                },
 
@@ -109,8 +120,11 @@
                 * @see jQuery.Widget.destroy
                 */
                destroy: function() {
-                       this.$menu.data( 'menu' ).destroy();
-                       this.$menu.remove();
+                       if( $( '.' + this.widgetBaseClass ).length === 0 ) {
+                               $menu.data( 'menu' ).destroy();
+                               $menu.remove();
+                               $menu = null;
+                       }
                        this.$icon.remove();
 
                        this.element.removeClass( 'ui-state-default 
ui-state-hover ' + this.widgetBaseClass );
@@ -179,10 +193,7 @@
                 */
                rank: function( rank ) {
                        if( rank === undefined ) {
-                               var $activeItem = this.$menu.children( 
'.ui-state-active' );
-                               return ( $activeItem.length )
-                                       ? $activeItem.data( this.widgetName + 
'-menuitem-rank' )
-                                       : null;
+                               return this._rank;
                        }
 
                        this._setRank( rank );
@@ -196,16 +207,23 @@
                 * @param {number} rank
                 */
                _setRank: function( rank ) {
-                       if( rank === this.rank() ) {
-                               return;
+                       this._rank = rank;
+
+                       if( $menu && $menu.data( this.widgetName ) === this ) {
+                               this._updateMenuCss();
                        }
 
-                       this.$menu.children().removeClass( 'ui-state-active' );
-                       this.$menu
-                       .children( '.' + this.widgetBaseClass + '-menuitem-' + 
getRankString( rank ) )
-                       .addClass( 'ui-state-active' );
-
                        this._updateIcon();
+               },
+
+               /**
+                * Updates the menu's css classes.
+                */
+               _updateMenuCss: function() {
+                       $menu.children().removeClass( 'ui-state-active' );
+                       $menu
+                       .children( '.' + this.widgetBaseClass + '-menuitem-' + 
getRankString( this.rank() ) )
+                       .addClass( 'ui-state-active' );
                },
 
                /**
@@ -233,7 +251,7 @@
                                ? this.options.isRTL
                                : $( 'body' ).hasClass( 'rtl' );
 
-                       this.$menu.position( {
+                       $menu.position( {
                                of: this.$icon,
                                my: ( isRtl ? 'right' : 'left' ) + ' top',
                                at: ( isRtl ? 'right' : 'left' ) + ' bottom',
@@ -247,7 +265,10 @@
                 * @since 0.5
                 */
                disable: function() {
-                       this.$menu.hide();
+                       if( $menu && $menu.data( this.widgetName ) === this ) {
+                               // Disabling the rank selector the menu 
currently references to.
+                               $menu.hide();
+                       }
                        this.element.removeClass( 'ui-state-active 
ui-state-hover' );
                        this.element.addClass( 'ui-state-disabled' );
                        return PARENT.prototype.disable.call( this );
diff --git 
a/lib/tests/qunit/jquery.wikibase/jquery.wikibase.statementview.RankSelector.tests.js
 
b/lib/tests/qunit/jquery.wikibase/jquery.wikibase.statementview.RankSelector.tests.js
index 9982e20..1f99d3d 100644
--- 
a/lib/tests/qunit/jquery.wikibase/jquery.wikibase.statementview.RankSelector.tests.js
+++ 
b/lib/tests/qunit/jquery.wikibase/jquery.wikibase.statementview.RankSelector.tests.js
@@ -35,9 +35,9 @@
                var rankSelector = createTestRankSelector( { rank: 
wb.Statement.RANK.DEPRECATED } );
 
                assert.equal(
-                       wb.Statement.RANK.DEPRECATED,
                        rankSelector.rank(),
-                       'Instantiated rank selector with "deprecated" rank'
+                       wb.Statement.RANK.DEPRECATED,
+                       'Instantiated rank selector with "deprecated" rank.'
                );
        } );
 
@@ -47,24 +47,24 @@
                rankSelector.rank( wb.Statement.RANK.DEPRECATED );
 
                assert.equal(
-                       wb.Statement.RANK.DEPRECATED,
                        rankSelector.rank(),
+                       wb.Statement.RANK.DEPRECATED,
                        'Set "deprecated" rank.'
                );
 
                rankSelector.rank( wb.Statement.RANK.PREFERRED );
 
                assert.equal(
-                       wb.Statement.RANK.PREFERRED,
                        rankSelector.rank(),
+                       wb.Statement.RANK.PREFERRED,
                        'Set "preferred" rank.'
                );
 
                rankSelector.rank( wb.Statement.RANK.NORMAL );
 
                assert.equal(
-                       wb.Statement.RANK.NORMAL,
                        rankSelector.rank(),
+                       wb.Statement.RANK.NORMAL,
                        'Set "normal" rank.'
                );
        } );
@@ -75,24 +75,24 @@
                rankSelector.option( 'rank', wb.Statement.RANK.DEPRECATED );
 
                assert.equal(
-                       wb.Statement.RANK.DEPRECATED,
                        rankSelector.option( 'rank' ),
+                       wb.Statement.RANK.DEPRECATED,
                        'Set "deprecated" rank.'
                );
 
                rankSelector.option( 'rank', wb.Statement.RANK.PREFERRED );
 
                assert.equal(
-                       wb.Statement.RANK.PREFERRED,
                        rankSelector.option( 'rank' ),
+                       wb.Statement.RANK.PREFERRED,
                        'Set "preferred" rank.'
                );
 
                rankSelector.option( 'rank', wb.Statement.RANK.NORMAL );
 
                assert.equal(
-                       wb.Statement.RANK.NORMAL,
                        rankSelector.option( 'rank' ),
+                       wb.Statement.RANK.NORMAL,
                        'Set "normal" rank.'
                );
        } );
@@ -120,4 +120,57 @@
                );
        } );
 
+       QUnit.test( 'Multiple rank selectors', function ( assert ) {
+               var rankSelector1 = createTestRankSelector( { rank: 
wb.Statement.RANK.DEPRECATED } );
+
+               assert.equal(
+                       rankSelector1.rank(),
+                       wb.Statement.RANK.DEPRECATED,
+                       'Instantiated first rank selector with "deprecated" 
rank.'
+               );
+
+               var rankSelector2 = createTestRankSelector( { rank: 
wb.Statement.RANK.PREFERRED } );
+
+               assert.equal(
+                       rankSelector2.rank(),
+                       wb.Statement.RANK.PREFERRED,
+                       'Instantiated second rank selector with "preferred" 
rank.'
+               );
+
+               assert.equal(
+                       rankSelector1.rank(),
+                       wb.Statement.RANK.DEPRECATED,
+                       'First rank selector still features "deprecated" rank.'
+               );
+
+               rankSelector1.rank( wb.Statement.RANK.NORMAL );
+
+               assert.equal(
+                       rankSelector1.rank(),
+                       wb.Statement.RANK.NORMAL,
+                       'Changed first rank selector\'s rank to "normal".'
+               );
+
+               assert.equal(
+                       rankSelector2.rank(),
+                       wb.Statement.RANK.PREFERRED,
+                       'Second rank selector still features "preferred" rank.'
+               );
+
+               rankSelector2.rank( wb.Statement.RANK.DEPRECATED );
+
+               assert.equal(
+                       rankSelector2.rank(),
+                       wb.Statement.RANK.DEPRECATED,
+                       'Changed second rank selector\'s rank to "deprecated".'
+               );
+
+               assert.equal(
+                       rankSelector1.rank(),
+                       wb.Statement.RANK.NORMAL,
+                       'First rank selector still features "normal" rank.'
+               );
+
+       } );
+
 } )( jQuery, mediaWiki, wikibase );

-- 
To view, visit https://gerrit.wikimedia.org/r/101202
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I002931069429c867bda51a25a975430f3b684900
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Henning Snater <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to