Skip to content

Commit 43d42d8

Browse files
committed
Menu: Add classes option
1 parent 691c04d commit 43d42d8

File tree

3 files changed

+47
-27
lines changed

3 files changed

+47
-27
lines changed

tests/unit/menu/menu_common.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
TestHelpers.commonWidgetTests( "menu", {
22
defaults: {
3+
classes: {
4+
"ui-menu": "",
5+
"ui-menu-icons": "",
6+
"ui-menu-icon": "",
7+
"ui-menu-item": "",
8+
"ui-menu-item-wrapper": "",
9+
"ui-menu-divider": ""
10+
},
311
disabled: false,
412
icons: {
513
submenu: "ui-icon-caret-1-e"

tests/unit/menu/menu_core.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ module( "menu: core" );
55
test( "markup structure", function() {
66
expect( 6 );
77
var element = $( "#menu1" ).menu();
8-
ok( element.hasClass( "ui-menu" ), "main element is .ui-menu" );
8+
ok( element.hasClass( "ui-menu" ), "main element has proper classes" );
99
element.children().each(function( index ) {
1010
ok( $( this ).hasClass( "ui-menu-item" ), "child " + index + " is .ui-menu-item" );
1111
});

ui/menu.js

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ return $.widget( "ui.menu", {
3030
defaultElement: "<ul>",
3131
delay: 300,
3232
options: {
33+
classes: {
34+
"ui-menu": "",
35+
"ui-menu-icons": "",
36+
"ui-menu-icon": "",
37+
"ui-menu-item": "",
38+
"ui-menu-divider": "",
39+
"ui-menu-item-wrapper": ""
40+
},
3341
icons: {
3442
submenu: "ui-icon-caret-1-e"
3543
},
@@ -55,13 +63,13 @@ return $.widget( "ui.menu", {
5563
this.mouseHandled = false;
5664
this.element
5765
.uniqueId()
58-
.addClass( "ui-menu ui-widget ui-widget-content" )
59-
.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
6066
.attr({
6167
role: this.options.role,
6268
tabIndex: 0
6369
});
64-
70+
this._addClass( "ui-menu", "ui-widget ui-widget-content" );
71+
this[ "_" + ( !!this.element.find( ".ui-icon" ).length ? "add" : "remove" ) +
72+
"Class" ]( "ui-menu-icons" );
6573
if ( this.options.disabled ) {
6674
this.element
6775
.addClass( "ui-state-disabled" )
@@ -152,39 +160,41 @@ return $.widget( "ui.menu", {
152160

153161
_destroy: function() {
154162
// Destroy (sub)menus
155-
this.element
156-
.removeAttr( "aria-activedescendant" )
157-
.find( ".ui-menu" ).addBack()
158-
.removeClass( "ui-menu ui-widget ui-widget-content ui-menu-icons ui-front" )
163+
var menu = this.element
164+
.removeAttr( "aria-activedescendant" )
165+
.find( ".ui-menu" ).addBack()
159166
.removeAttr( "role" )
160167
.removeAttr( "tabIndex" )
161168
.removeAttr( "aria-labelledby" )
162169
.removeAttr( "aria-expanded" )
163170
.removeAttr( "aria-hidden" )
164171
.removeAttr( "aria-disabled" )
165172
.removeUniqueId()
166-
.show();
167-
168-
// Destroy menu items
169-
this.element.find( ".ui-menu-item" )
170-
.removeClass( "ui-menu-item" )
171-
.removeAttr( "role" )
172-
.removeAttr( "aria-disabled" )
173-
.children( ".ui-menu-item-wrapper" )
173+
.show(),
174+
items = this.element.find( ".ui-menu-item" )
175+
.removeClass( "ui-menu-item" )
176+
.removeAttr( "role" )
177+
.removeAttr( "aria-disabled" ),
178+
submenus = items.children( ".ui-menu-item-wrapper" )
174179
.removeUniqueId()
175-
.removeClass( "ui-menu-item-wrapper ui-state-hover" )
176180
.removeAttr( "tabIndex" )
177181
.removeAttr( "role" )
178-
.removeAttr( "aria-haspopup" )
179-
.children().each(function() {
182+
.removeAttr( "aria-haspopup" );
183+
184+
submenus.children().each(function() {
180185
var elem = $( this );
181186
if ( elem.data( "ui-menu-submenu-caret" ) ) {
182187
elem.remove();
183188
}
184189
});
185190

191+
this._removeClass( menu, "ui-menu ui-menu-icons", "ui-widget ui-widget-content ui-front" );
192+
this._removeClass( items, "ui-menu-item" );
193+
this._removeClass( submenus, "ui-menu-item-wrapper", "ui-state-hover ui-state" );
194+
186195
// Destroy menu dividers
187-
this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
196+
this._removeClass( this.element.find( ".ui-menu-divider" ), "ui-menu-divider",
197+
"ui-widget-content" );
188198
},
189199

190200
_keydown: function( event ) {
@@ -278,7 +288,7 @@ return $.widget( "ui.menu", {
278288
},
279289

280290
refresh: function() {
281-
var menus, items,
291+
var menus, items, newSubmenus, newItems,
282292
that = this,
283293
icon = this.options.icons.submenu,
284294
submenus = this.element.find( this.options.menus );
@@ -287,7 +297,6 @@ return $.widget( "ui.menu", {
287297

288298
// Initialize nested menus
289299
submenus.filter( ":not(.ui-menu)" )
290-
.addClass( "ui-menu ui-widget ui-widget-content ui-front" )
291300
.hide()
292301
.attr({
293302
role: this.options.role,
@@ -307,28 +316,31 @@ return $.widget( "ui.menu", {
307316
menu.attr( "aria-labelledby", item.attr( "id" ) );
308317
});
309318

319+
this._addClass( submenus.filter( ":not(.ui-menu)" ), "ui-menu",
320+
"ui-widget ui-widget-content ui-front" );
321+
310322
menus = submenus.add( this.element );
311323
items = menus.find( this.options.items );
312324

313325
// Initialize menu-items containing spaces and/or dashes only as dividers
314326
items.not( ".ui-menu-item" ).each(function() {
315327
var item = $( this );
316328
if ( that._isDivider( item ) ) {
317-
item.addClass( "ui-widget-content ui-menu-divider" );
329+
that._addClass( item, "ui-menu-divider", "ui-widget-content" );
318330
}
319331
});
320332

321333
// Don't refresh list items that are already adapted
322-
items.not( ".ui-menu-item, .ui-menu-divider" )
323-
.addClass( "ui-menu-item" )
324-
.children()
334+
newItems = items.not( ".ui-menu-item, .ui-menu-divider" );
335+
newSubmenus = newItems.children()
325336
.not( ".ui-menu" )
326-
.addClass( "ui-menu-item-wrapper" )
327337
.uniqueId()
328338
.attr({
329339
tabIndex: -1,
330340
role: this._itemRole()
331341
});
342+
this._addClass( newItems, "ui-menu-item" );
343+
this._addClass( newSubmenus, "ui-menu-item-wrapper" );
332344

333345
// Add aria-disabled attribute to any disabled menu item
334346
items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" );

0 commit comments

Comments
 (0)