Skip to content

Commit d4c529d

Browse files
committed
Selectmenu: Introduce _renderButtonItem method
Fixes #10142
1 parent e9643f6 commit d4c529d

File tree

2 files changed

+65
-16
lines changed

2 files changed

+65
-16
lines changed

tests/unit/selectmenu/selectmenu_core.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,42 @@ asyncTest( "accessibility", function() {
4545
});
4646

4747

48+
test( "extend _renderButtonItem method", function() {
49+
expect( 4 );
50+
51+
var links, option,
52+
element = $( "#speed" ).selectmenu(),
53+
instance = element.selectmenu( "instance" ),
54+
button = element.selectmenu( "widget" ),
55+
menu = element.selectmenu( "menuWidget" );
56+
57+
instance._renderButtonItem = function( buttonItem, item ) {
58+
buttonItem.parent().data( "test", item.value );
59+
this._setText( buttonItem, item.label + item.index );
60+
};
61+
62+
element.selectmenu( "refresh" );
63+
links = menu.find( "li.ui-menu-item" );
64+
65+
option = element.find( "option:selected" );
66+
equal(
67+
option.text() + element[ 0 ].selectedIndex,
68+
button.text(),
69+
"refresh: button item text"
70+
);
71+
equal( button.data( "test" ), option.val(), "refresh: button item data" );
72+
73+
button.trigger( "click" );
74+
menu.find( "li" ).last().simulate( "mouseover" ).trigger( "click" );
75+
option = element.find( "option" ).last();
76+
equal(
77+
option.text() + element[ 0 ].selectedIndex,
78+
button.text(),
79+
"click: button item text"
80+
);
81+
equal( button.data( "test" ), option.val(), "click: button item data" );
82+
});
83+
4884
$.each([
4985
{
5086
type: "default",

ui/selectmenu.js

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ return $.widget( "ui.selectmenu", {
6767
},
6868

6969
_drawButton: function() {
70-
var that = this;
70+
var that = this,
71+
item = this._parseOption(
72+
this.element.find( "option:selected" ),
73+
this.element[ 0 ].selectedIndex
74+
);
7175

7276
// Associate existing label with the new button
7377
this.label = $( "label[for='" + this.ids.element + "']" ).attr( "for", this.ids.button );
@@ -99,12 +103,12 @@ return $.widget( "ui.selectmenu", {
99103
})
100104
.prependTo( this.button );
101105

102-
this.buttonText = $( "<span>", {
106+
this.buttonItem = $( "<span>", {
103107
"class": "ui-selectmenu-text"
104108
})
105109
.appendTo( this.button );
106110

107-
this._setText( this.buttonText, this.element.find( "option:selected" ).text() );
111+
this._renderButtonItem( this.buttonItem, item );
108112
this._resizeButton();
109113

110114
this._on( this.button, this._buttonEvents );
@@ -190,7 +194,7 @@ return $.widget( "ui.selectmenu", {
190194

191195
refresh: function() {
192196
this._refreshMenu();
193-
this._setText( this.buttonText, this._getSelectedItem().text() );
197+
this._renderButtonItem( this.buttonItem, this._getSelectedItem().data( "ui-selectmenu-item" ) );
194198
if ( !this.options.width ) {
195199
this._resizeButton();
196200
}
@@ -275,6 +279,10 @@ return $.widget( "ui.selectmenu", {
275279
return this.menu;
276280
},
277281

282+
_renderButtonItem: function( buttonItem, item ) {
283+
this._setText( buttonItem, item.label );
284+
},
285+
278286
_renderMenu: function( ul, items ) {
279287
var that = this,
280288
currentOptgroup = "";
@@ -480,7 +488,7 @@ return $.widget( "ui.selectmenu", {
480488

481489
// Change native select element
482490
this.element[ 0 ].selectedIndex = item.index;
483-
this._setText( this.buttonText, item.label );
491+
this._renderButtonItem( this.buttonItem, item );
484492
this._setAria( item );
485493
this._trigger( "select", event, { item: item } );
486494

@@ -590,22 +598,27 @@ return $.widget( "ui.selectmenu", {
590598
},
591599

592600
_parseOptions: function( options ) {
593-
var data = [];
601+
var that = this,
602+
data = [];
594603
options.each(function( index, item ) {
595-
var option = $( item ),
596-
optgroup = option.parent( "optgroup" );
597-
data.push({
598-
element: option,
599-
index: index,
600-
value: option.attr( "value" ),
601-
label: option.text(),
602-
optgroup: optgroup.attr( "label" ) || "",
603-
disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
604-
});
604+
data.push( that._parseOption( $( item ), index ) );
605605
});
606606
this.items = data;
607607
},
608608

609+
_parseOption: function( option, index ) {
610+
var optgroup = option.parent( "optgroup" );
611+
612+
return {
613+
element: option,
614+
index: index,
615+
value: option.attr( "value" ),
616+
label: option.text(),
617+
optgroup: optgroup.attr( "label" ) || "",
618+
disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" )
619+
};
620+
},
621+
609622
_destroy: function() {
610623
this.menuWrap.remove();
611624
this.button.remove();

0 commit comments

Comments
 (0)