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