Skip to content

Commit 28dccda

Browse files
committed
Spinner: Add classes option
Ref #7053 Ref gh-1411
1 parent 90c27b4 commit 28dccda

File tree

4 files changed

+57
-19
lines changed

4 files changed

+57
-19
lines changed

tests/unit/spinner/spinner.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<script src="../../../external/qunit/qunit.js"></script>
1212
<script src="../../../external/jquery-simulate/jquery.simulate.js"></script>
1313
<script src="../testsuite.js"></script>
14+
<script src="../../../external/qunit-assert-classes/qunit-assert-classes.js"></script>
1415
<script>
1516
TestHelpers.loadResources({
1617
css: [ "core", "button", "spinner" ],

tests/unit/spinner/spinner_common.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
TestHelpers.commonWidgetTests( "spinner", {
22
defaults: {
3-
classes: {},
3+
classes: {
4+
"ui-spinner": "ui-corner-all",
5+
"ui-spinner-up": "ui-corner-tr",
6+
"ui-spinner-down": "ui-corner-br"
7+
},
48
culture: null,
59
disabled: false,
610
icons: {

tests/unit/spinner/spinner_core.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,21 @@ var simulateKeyDownUp = TestHelpers.spinner.simulateKeyDownUp;
44

55
module( "spinner: core" );
66

7+
test( "markup structure", function( assert ) {
8+
expect( 6 );
9+
var element = $( "#spin" ).spinner(),
10+
spinner = element.spinner( "widget" ),
11+
up = spinner.find( ".ui-spinner-up" ),
12+
down = spinner.find( ".ui-spinner-down" );
13+
14+
assert.hasClasses( element, "ui-spinner-input" );
15+
assert.hasClasses( spinner, "ui-spinner ui-widget ui-widget-content" );
16+
assert.hasClasses( up, "ui-spinner-button ui-spinner-up ui-widget" );
17+
equal( up.length, 1, "Spinner contains exactly one up button" );
18+
assert.hasClasses( down, "ui-spinner-button ui-spinner-down ui-widget" );
19+
equal( down.length, 1, "Spinner contains exactly one down button" );
20+
});
21+
722
test( "keydown UP on input, increases value not greater than max", function() {
823
expect( 5 );
924
var element = $( "#spin" ).val( 70 ).spinner({

ui/spinner.js

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ return $.widget( "ui.spinner", {
4949
defaultElement: "<input>",
5050
widgetEventPrefix: "spin",
5151
options: {
52+
classes: {
53+
"ui-spinner": "ui-corner-all",
54+
"ui-spinner-down": "ui-corner-br",
55+
"ui-spinner-up": "ui-corner-tr"
56+
},
5257
culture: null,
5358
icons: {
5459
down: "ui-icon-triangle-1-s",
@@ -211,20 +216,31 @@ return $.widget( "ui.spinner", {
211216

212217
_draw: function() {
213218
var uiSpinner = this.uiSpinner = this.element
214-
.addClass( "ui-spinner-input" )
215219
.attr( "autocomplete", "off" )
216220
.wrap( this._uiSpinnerHtml() )
217221
.parent()
218222
// add buttons
219223
.append( this._buttonHtml() );
220224

225+
this._addClass( this.uiSpinner, "ui-spinner", "ui-widget ui-widget-content" );
226+
this._addClass( "ui-spinner-input" );
227+
221228
this.element.attr( "role", "spinbutton" );
222229

223230
// button bindings
224-
this.buttons = uiSpinner.find( ".ui-spinner-button" )
231+
this.buttons = uiSpinner.children( "a" )
225232
.attr( "tabIndex", -1 )
226-
.button()
227-
.removeClass( "ui-corner-all" );
233+
.button();
234+
235+
// TODO: Right now button does not support classes this is already updated in button PR
236+
this._removeClass( this.buttons, "ui-corner-all" );
237+
238+
this._addClass( this.buttons.first(), "ui-spinner-button ui-spinner-up" );
239+
this._addClass( this.buttons.last(), "ui-spinner-button ui-spinner-down" );
240+
this._addClass( this.buttons.first().find( ".ui-button-text span" ), null,
241+
"ui-icon " + this.options.icons.up );
242+
this._addClass( this.buttons.last().find( ".ui-button-text span" ), null,
243+
"ui-icon " + this.options.icons.down );
228244

229245
// IE 6 doesn't understand height: 50% for the buttons
230246
// unless the wrapper has an explicit height
@@ -262,16 +278,16 @@ return $.widget( "ui.spinner", {
262278
},
263279

264280
_uiSpinnerHtml: function() {
265-
return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
281+
return "<span>";
266282
},
267283

268284
_buttonHtml: function() {
269285
return "" +
270-
"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
271-
"<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +
286+
"<a>" +
287+
"<span>&#9650;</span>" +
272288
"</a>" +
273-
"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
274-
"<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +
289+
"<a>" +
290+
"<span>&#9660;</span>" +
275291
"</a>";
276292
},
277293

@@ -379,8 +395,10 @@ return $.widget( "ui.spinner", {
379395
},
380396

381397
_setOption: function( key, value ) {
398+
var prevValue, first, last;
399+
382400
if ( key === "culture" || key === "numberFormat" ) {
383-
var prevValue = this._parse( this.element.val() );
401+
prevValue = this._parse( this.element.val() );
384402
this.options[ key ] = value;
385403
this.element.val( this._format( prevValue ) );
386404
return;
@@ -392,18 +410,18 @@ return $.widget( "ui.spinner", {
392410
}
393411
}
394412
if ( key === "icons" ) {
395-
this.buttons.first().find( ".ui-icon" )
396-
.removeClass( this.options.icons.up )
397-
.addClass( value.up );
398-
this.buttons.last().find( ".ui-icon" )
399-
.removeClass( this.options.icons.down )
400-
.addClass( value.down );
413+
first = this.buttons.first().find( ".ui-icon" );
414+
this._removeClass( first, null, this.options.icons.up );
415+
this._addClass( first, null, value.up );
416+
last = this.buttons.last().find( ".ui-icon" );
417+
this._removeClass( last, null, this.options.icons.down );
418+
this._addClass( last, null, value.down );
401419
}
402420

403421
this._super( key, value );
404422

405423
if ( key === "disabled" ) {
406-
this.widget().toggleClass( "ui-state-disabled", !!value );
424+
this._toggleClass( this.uiSpinner, null, "ui-state-disabled", !!value );
407425
this.element.prop( "disabled", !!value );
408426
this.buttons.button( value ? "disable" : "enable" );
409427
}
@@ -469,13 +487,13 @@ return $.widget( "ui.spinner", {
469487

470488
_destroy: function() {
471489
this.element
472-
.removeClass( "ui-spinner-input" )
473490
.prop( "disabled", false )
474491
.removeAttr( "autocomplete" )
475492
.removeAttr( "role" )
476493
.removeAttr( "aria-valuemin" )
477494
.removeAttr( "aria-valuemax" )
478495
.removeAttr( "aria-valuenow" );
496+
479497
this.uiSpinner.replaceWith( this.element );
480498
},
481499

0 commit comments

Comments
 (0)