Skip to content

Commit 04b670e

Browse files
committed
Controlgroup: Don't remove existing classes classes
unless its a corner class Fixes #14960
1 parent 83ec5e8 commit 04b670e

File tree

4 files changed

+94
-9
lines changed

4 files changed

+94
-9
lines changed

tests/unit/controlgroup/controlgroup.html

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,27 @@
3636
<option>Slow</option>
3737
</select>
3838
</div>
39+
<select id="select-sanatize">
40+
<option>Fast</option>
41+
<option>Medium</option>
42+
<option>Slow</option>
43+
</select>
44+
<div class="controlgroup-pre">
45+
<select id="select-pre">
46+
<option>Fast</option>
47+
<option>Medium</option>
48+
<option>Slow</option>
49+
</select>
50+
<button>Button with icon on the bottom</button>
51+
</div>
52+
<div class="controlgroup-refresh">
53+
<select id="select-refresh">
54+
<option>Fast</option>
55+
<option>Medium</option>
56+
<option>Slow</option>
57+
</select>
58+
<button>Button with icon on the bottom</button>
59+
</div>
3960
</div>
4061
</body>
4162
</html>

tests/unit/controlgroup/core.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,29 @@ QUnit.test( "selectmenu: controlgroupLabel", function( assert ) {
7474
assert.hasClasses( label.find( "span" ), "ui-controlgroup-label-contents" );
7575
} );
7676

77+
var assertSanatized = function( assert, initClasses, expectedClasses, message ) {
78+
var selectmenu = $( "#select-sanatize" ).selectmenu({
79+
classes: {
80+
"ui-selectmenu-button-open": initClasses
81+
}
82+
}).selectmenu( "instance" );
83+
var classes = {
84+
"ui-selectmenu-button-open": "ui-corner-top"
85+
};
86+
var result = $.ui.controlgroup.prototype._resolveClassesValues( classes, selectmenu );
87+
assert.deepEqual( result, {
88+
"ui-selectmenu-button-open": expectedClasses + " ui-corner-top"
89+
}, message );
90+
}
91+
92+
QUnit.test( "_resolveClassesValues", function( assert ) {
93+
assert.expect( 6 );
94+
assertSanatized( assert, "bar ui-corner-bottom", "bar", "Single Corner Class Removed end" );
95+
assertSanatized( assert, "ui-corner-bottom bar", "bar", "Single Corner Class Removed beginning" );
96+
assertSanatized( assert, "bar ui-corner-bottom ui-corner-left", "bar", "Multiple Corner Class Removed end" );
97+
assertSanatized( assert, "ui-corner-bottom ui-corner-left bar", "bar", "Multiple Corner Class Removed beginning" );
98+
assertSanatized( assert, "bar ui-corner-bottom ui-corner-left foo", "bar foo", "Multiple Corner Class Removed Middle" );
99+
assertSanatized( assert, "bar", "bar", "No corner Class" );
100+
} );
101+
77102
} );

tests/unit/controlgroup/methods.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,27 @@ $.each( tests, function( widget, html ) {
148148
} );
149149
} );
150150

151+
QUnit.test( "Child Classes Option: init", function( assert ) {
152+
assert.expect( 1 );
153+
var selectmenu = $( "#select-pre" ).selectmenu( {
154+
classes: {
155+
"ui-selectmenu-button-closed": "test-class"
156+
}
157+
} );
158+
var controlgroup = $( ".controlgroup-pre" ).controlgroup();
159+
assert.hasClasses( selectmenu.selectmenu( "widget" ), "test-class" );
160+
} );
161+
162+
QUnit.test( "Child Classes Option: refresh", function( assert ) {
163+
assert.expect( 1 );
164+
var controlgroup = $( ".controlgroup-refresh" ).controlgroup();
165+
var selectmenu = $( "#select-refresh" ).selectmenu( {
166+
classes: {
167+
"ui-selectmenu-button-closed": "test-class"
168+
}
169+
} );
170+
controlgroup.controlgroup( "refresh" );
171+
assert.hasClasses( selectmenu.selectmenu( "widget" ), "test-class" );
172+
} );
173+
151174
} );

ui/widgets/controlgroup.js

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
factory( jQuery );
3131
}
3232
}( function( $ ) {
33+
var removeClassRegex = /ui-corner-([a-z]){2,6}/g;
3334

3435
return $.widget( "ui.controlgroup", {
3536
version: "@VERSION",
@@ -107,15 +108,20 @@ return $.widget( "ui.controlgroup", {
107108

108109
// Find instances of this widget inside controlgroup and init them
109110
that.element
110-
.find( selector )[ widget ]( options )
111+
.find( selector )
111112
.each( function() {
112113
var element = $( this );
114+
var instance = element[ widget ]( "instance" );
115+
if ( instance ) {
116+
options.classes = that._resolveClassesValues( options.classes, instance );
117+
}
118+
element[ widget ]( options );
113119

114120
// Store an instance of the controlgroup to be able to reference
115121
// from the outermost element for changing options and refresh
116122
var widgetElement = element[ widget ]( "widget" );
117123
$.data( widgetElement[ 0 ], "ui-controlgroup-data",
118-
element[ widget ]( "instance" ) );
124+
instance ? instance : element[ widget ]( "instance" ) );
119125

120126
childWidgets.push( widgetElement[ 0 ] );
121127
} );
@@ -149,7 +155,7 @@ return $.widget( "ui.controlgroup", {
149155
classes: {}
150156
};
151157
result.classes[ key ] = {
152-
"middle": null,
158+
"middle": "",
153159
"first": "ui-corner-" + ( direction ? "top" : "left" ),
154160
"last": "ui-corner-" + ( direction ? "bottom" : "right" )
155161
}[ position ];
@@ -180,22 +186,31 @@ return $.widget( "ui.controlgroup", {
180186
width: direction ? "auto" : false,
181187
classes: {
182188
middle: {
183-
"ui-selectmenu-button-open": null,
184-
"ui-selectmenu-button-closed": null
189+
"ui-selectmenu-button-open": "",
190+
"ui-selectmenu-button-closed": ""
185191
},
186192
first: {
187193
"ui-selectmenu-button-open": "ui-corner-" + ( direction ? "top" : "tl" ),
188194
"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "top" : "left" )
189195
},
190196
last: {
191-
"ui-selectmenu-button-open": direction ? null : "ui-corner-tr",
197+
"ui-selectmenu-button-open": direction ? "" : "ui-corner-tr",
192198
"ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "bottom" : "right" )
193199
}
194200

195201
}[ position ]
196202
};
197203
},
198204

205+
_resolveClassesValues: function( classes, instance ) {
206+
$.each( classes, function( key ) {
207+
var current = instance.options.classes[ key ] || "";
208+
current = current.replace( removeClassRegex, "" ).trim();
209+
classes[ key ] = ( current + " " + classes[ key ] ).replace( / +/g, " " );
210+
} );
211+
return classes;
212+
},
213+
199214
_setOption: function( key, value ) {
200215
if ( key === "direction" ) {
201216
this._removeClass( "ui-controlgroup-" + this.options.direction );
@@ -236,9 +251,10 @@ return $.widget( "ui.controlgroup", {
236251
var instance = children[ value ]().data( "ui-controlgroup-data" );
237252

238253
if ( instance && that[ "_" + instance.widgetName + "Options" ] ) {
239-
instance.element[ instance.widgetName ](
240-
that[ "_" + instance.widgetName + "Options" ]( value )
241-
);
254+
var options = that[ "_" + instance.widgetName + "Options" ]( value );
255+
256+
options.classes = that._resolveClassesValues( options.classes, instance );
257+
instance.element[ instance.widgetName ]( options );
242258
} else {
243259
that._updateCornerClass( children[ value ](), value );
244260
}

0 commit comments

Comments
 (0)