Skip to content

Commit 3483486

Browse files
committed
Selectmenu: Add classes option
Ref #7053 Ref gh-1411
1 parent 2a7873d commit 3483486

File tree

4 files changed

+68
-40
lines changed

4 files changed

+68
-40
lines changed

tests/unit/selectmenu/selectmenu.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<script src="../../../external/qunit/qunit.js"></script>
1010
<script src="../../../external/jquery-simulate/jquery.simulate.js"></script>
1111
<script src="../testsuite.js"></script>
12+
<script src="../../../external/qunit-assert-classes/qunit-assert-classes.js"></script>
1213
<script>
1314
TestHelpers.loadResources({
1415
css: [ "core", "menu" , "selectmenu" ],

tests/unit/selectmenu/selectmenu_common.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
TestHelpers.commonWidgetTests( "selectmenu", {
22
defaults: {
33
appendTo: null,
4-
classes: {},
4+
classes: {
5+
"ui-selectmenu-button-open": "ui-corner-top",
6+
"ui-selectmenu-button-closed": "ui-corner-all"
7+
},
58
disabled: null,
69
icons: {
710
button: "ui-icon-triangle-1-s"

tests/unit/selectmenu/selectmenu_core.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,21 @@
22

33
module( "selectmenu: core" );
44

5+
test( "markup structure", function( assert ) {
6+
expect( 4 );
7+
8+
var element = $( "#files" ).selectmenu(),
9+
button = element.selectmenu( "widget" ),
10+
menu = element.selectmenu( "menuWidget" ),
11+
menuWrap = menu.parent();
12+
13+
assert.hasClasses( button,
14+
"ui-selectmenu-button ui-selectmenu-button-closed ui-widget" );
15+
assert.lacksClasses( button, "ui-selectmenu-button-open" );
16+
assert.hasClasses( menuWrap, "ui-selectmenu-menu" );
17+
assert.lacksClasses( menuWrap, "ui-selectmenu-menu-open" );
18+
});
19+
520
asyncTest( "accessibility", function() {
621
var wrappers, button, menu,
722
element = $( "#speed" ).attr( "title", "A demo title" );

ui/selectmenu.js

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ return $.widget( "ui.selectmenu", {
3939
defaultElement: "<select>",
4040
options: {
4141
appendTo: null,
42+
classes: {
43+
"ui-selectmenu-button-open": "ui-corner-top",
44+
"ui-selectmenu-button-closed": "ui-corner-all"
45+
},
4246
disabled: null,
4347
icons: {
4448
button: "ui-icon-triangle-1-s"
@@ -78,7 +82,8 @@ return $.widget( "ui.selectmenu", {
7882
},
7983

8084
_drawButton: function() {
81-
var that = this,
85+
var icon,
86+
that = this,
8287
item = this._parseOption(
8388
this.element.find( "option:selected" ),
8489
this.element[ 0 ].selectedIndex
@@ -98,7 +103,6 @@ return $.widget( "ui.selectmenu", {
98103

99104
// Create button
100105
this.button = $( "<span>", {
101-
"class": "ui-selectmenu-button ui-widget ui-state-default ui-corner-all",
102106
tabindex: this.options.disabled ? -1 : 0,
103107
id: this.ids.button,
104108
role: "combobox",
@@ -110,10 +114,11 @@ return $.widget( "ui.selectmenu", {
110114
})
111115
.insertAfter( this.element );
112116

113-
$( "<span>", {
114-
"class": "ui-icon " + this.options.icons.button
115-
})
116-
.prependTo( this.button );
117+
this._addClass( this.button, "ui-selectmenu-button ui-selectmenu-button-closed",
118+
"ui-widget ui-state-default" );
119+
120+
icon = $( "<span>" ).prependTo( this.button );
121+
this._addClass( icon, null, "ui-icon " + this.options.icons.button );
117122

118123
this.buttonItem = this._renderButtonItem( item )
119124
.appendTo( this.button );
@@ -146,15 +151,16 @@ return $.widget( "ui.selectmenu", {
146151
});
147152

148153
// Wrap menu
149-
this.menuWrap = $( "<div>", {
150-
"class": "ui-selectmenu-menu ui-front"
151-
})
152-
.append( this.menu )
153-
.appendTo( this._appendTo() );
154+
this.menuWrap = $( "<div>" ).append( this.menu );
155+
this._addClass( this.menuWrap, "ui-selectmenu-menu", "ui-front" );
156+
this.menuWrap.appendTo( this._appendTo() );
154157

155158
// Initialize menu widget
156159
this.menuInstance = this.menu
157160
.menu({
161+
classes: {
162+
"ui-menu": "ui-corner-bottom"
163+
},
158164
role: "listbox",
159165
select: function( event, ui ) {
160166
event.preventDefault();
@@ -184,11 +190,6 @@ return $.widget( "ui.selectmenu", {
184190
})
185191
.menu( "instance" );
186192

187-
// Adjust menu styles to dropdown
188-
this.menu
189-
.addClass( "ui-corner-bottom" )
190-
.removeClass( "ui-corner-all" );
191-
192193
// Don't close the menu on mouseleave
193194
this.menuInstance._off( this.menu, "mouseleave" );
194195

@@ -258,7 +259,7 @@ return $.widget( "ui.selectmenu", {
258259
} else {
259260

260261
// Menu clears focus on close, reset focus to selected item
261-
this.menu.find( ".ui-state-active" ).removeClass( "ui-state-active" );
262+
this._removeClass( this.menu.find( ".ui-state-active" ), null, "ui-state-active" );
262263
this.menuInstance.focus( null, this._getSelectedItem() );
263264
}
264265

@@ -304,10 +305,10 @@ return $.widget( "ui.selectmenu", {
304305
},
305306

306307
_renderButtonItem: function( item ) {
307-
var buttonItem = $( "<span>", {
308-
"class": "ui-selectmenu-text"
309-
});
308+
var buttonItem = $( "<span>" );
309+
310310
this._setText( buttonItem, item.label );
311+
this._addClass( buttonItem, "ui-selectmenu-text" );
311312

312313
return buttonItem;
313314
},
@@ -317,15 +318,18 @@ return $.widget( "ui.selectmenu", {
317318
currentOptgroup = "";
318319

319320
$.each( items, function( index, item ) {
321+
var li;
322+
320323
if ( item.optgroup !== currentOptgroup ) {
321-
$( "<li>", {
322-
"class": "ui-selectmenu-optgroup ui-menu-divider" +
323-
( item.element.parent( "optgroup" ).prop( "disabled" ) ?
324-
" ui-state-disabled" :
325-
"" ),
324+
li = $( "<li>", {
326325
text: item.optgroup
327-
})
328-
.appendTo( ul );
326+
});
327+
that._addClass( li, "ui-selectmenu-optgroup", "ui-menu-divider" +
328+
( item.element.parent( "optgroup" ).prop( "disabled" ) ?
329+
" ui-state-disabled" :
330+
"" ) );
331+
332+
li.appendTo( ul );
329333

330334
currentOptgroup = item.optgroup;
331335
}
@@ -345,7 +349,7 @@ return $.widget( "ui.selectmenu", {
345349
});
346350

347351
if ( item.disabled ) {
348-
li.addClass( "ui-state-disabled" );
352+
this._addClass( li, null, "ui-state-disabled" );
349353
}
350354
this._setText( wrapper, item.label );
351355

@@ -542,9 +546,9 @@ return $.widget( "ui.selectmenu", {
542546

543547
_setOption: function( key, value ) {
544548
if ( key === "icons" ) {
545-
this.button.find( "span.ui-icon" )
546-
.removeClass( this.options.icons.button )
547-
.addClass( value.button );
549+
var icon = this.button.find( "span.ui-icon" );
550+
this._removeClass( icon, null, this.options.icons.button )
551+
._addClass( icon, null, value.button );
548552
}
549553

550554
this._super( key, value );
@@ -555,9 +559,8 @@ return $.widget( "ui.selectmenu", {
555559

556560
if ( key === "disabled" ) {
557561
this.menuInstance.option( "disabled", value );
558-
this.button
559-
.toggleClass( "ui-state-disabled", value )
560-
.attr( "aria-disabled", value );
562+
this.button.attr( "aria-disabled", value );
563+
this._toggleClass( this.button, null, "ui-state-disabled", value );
561564

562565
this.element.prop( "disabled", value );
563566
if ( value ) {
@@ -594,11 +597,17 @@ return $.widget( "ui.selectmenu", {
594597
},
595598

596599
_toggleAttr: function() {
597-
this.button
598-
.toggleClass( "ui-corner-top", this.isOpen )
599-
.toggleClass( "ui-corner-all", !this.isOpen )
600-
.attr( "aria-expanded", this.isOpen );
601-
this.menuWrap.toggleClass( "ui-selectmenu-open", this.isOpen );
600+
this.button.attr( "aria-expanded", this.isOpen );
601+
602+
// We can't use two _toggleClass() calls here, because we need to make sure
603+
// we always remove classes first and add them second, otherwise if both classes have the
604+
// same theme class, it will be removed after we add it.
605+
this._removeClass( this.button, "ui-selectmenu-button-" +
606+
( this.isOpen ? "closed" : "open" ) )
607+
._addClass( this.button, "ui-selectmenu-button-" +
608+
( this.isOpen ? "open" : "closed" ) )
609+
._toggleClass( this.menuWrap, "ui-selectmenu-open", null, this.isOpen );
610+
602611
this.menu.attr( "aria-hidden", !this.isOpen );
603612
},
604613

0 commit comments

Comments
 (0)