" )
.appendTo( this.element );
- classes = "ui-slider-range" +
+ classes = this._classes( "ui-slider-range" ) +
// note: this isn't the most fittingly semantic framework class for this element,
// but worked best visually with a variety of themes
- " ui-widget-header ui-corner-all";
+ " ui-widget-header";
} else {
- this.range.removeClass( "ui-slider-range-min ui-slider-range-max" )
+ this.range.removeClass( this._classes( "ui-slider-range-min ui-slider-range-max" ) )
// Handle range switching from true to min/max
.css({
"left": "",
@@ -139,8 +146,8 @@ return $.widget( "ui.slider", $.ui.mouse, {
});
}
- this.range.addClass( classes +
- ( ( options.range === "min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) );
+ this.range.addClass( classes + " " +
+ this._classes( ( options.range === "min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) );
} else {
if ( this.range ) {
this.range.remove();
@@ -163,12 +170,8 @@ return $.widget( "ui.slider", $.ui.mouse, {
}
this.element
- .removeClass( "ui-slider" +
- " ui-slider-horizontal" +
- " ui-slider-vertical" +
- " ui-widget" +
- " ui-widget-content" +
- " ui-corner-all" );
+ .removeClass( this._classes( "ui-slider ui-slider-horizontal ui-slider-vertical" ) +
+ " ui-widget ui-widget-content" );
this._mouseDestroy();
},
@@ -424,6 +427,28 @@ return $.widget( "ui.slider", $.ui.mouse, {
}
},
+ _elementsFromClassKey: function( classKey ) {
+ switch ( classKey ) {
+ case "ui-slider-handle":
+ return this.handles;
+ case "ui-slider-range-min":
+ case "ui-slider-range-max":
+ case "ui-slider-range":
+ if ( this.range === true && ( classKey === "ui-slider-range" ) ||
+ classKey.match( this.options.range ) ) {
+ return this.range;
+ }
+ return $();
+ case "ui-slider-vertical":
+ case "ui-slider-horizontal":
+ if ( !classKey.match( this.options.range ) ) {
+ return $();
+ }
+ break;
+ }
+ return this._superApply( arguments );
+ },
+
_setOption: function( key, value ) {
var i,
valsLength = 0;
@@ -452,8 +477,8 @@ return $.widget( "ui.slider", $.ui.mouse, {
case "orientation":
this._detectOrientation();
this.element
- .removeClass( "ui-slider-horizontal ui-slider-vertical" )
- .addClass( "ui-slider-" + this.orientation );
+ .removeClass( this._classes( "ui-slider-horizontal ui-slider-vertical" ) )
+ .addClass( this._classes( "ui-slider-" + this.orientation ) );
this._refreshValue();
// Reset positioning from previous orientation
diff --git a/ui/spinner.js b/ui/spinner.js
index 263b29d3fbb..fee1998334c 100644
--- a/ui/spinner.js
+++ b/ui/spinner.js
@@ -41,6 +41,13 @@ return $.widget( "ui.spinner", {
defaultElement: "
",
widgetEventPrefix: "spin",
options: {
+ classes: {
+ "ui-spinner-input": "",
+ "ui-spinner": "ui-corner-all",
+ "ui-spinner-button": "",
+ "ui-spinner-up": "ui-corner-tr",
+ "ui-spinner-down": "ui-corner-br"
+ },
culture: null,
icons: {
down: "ui-icon-triangle-1-s",
@@ -203,7 +210,7 @@ return $.widget( "ui.spinner", {
_draw: function() {
var uiSpinner = this.uiSpinner = this.element
- .addClass( "ui-spinner-input" )
+ .addClass( this._classes( "ui-spinner-input" ) )
.attr( "autocomplete", "off" )
.wrap( this._uiSpinnerHtml() )
.parent()
@@ -254,15 +261,15 @@ return $.widget( "ui.spinner", {
},
_uiSpinnerHtml: function() {
- return "
";
+ return "
";
},
_buttonHtml: function() {
return "" +
- "
" +
+ "" +
"▲" +
"" +
- "
" +
+ "" +
"▼" +
"";
},
@@ -370,6 +377,18 @@ return $.widget( "ui.spinner", {
this._trigger( "stop", event );
},
+ _elementsFromClassKey: function( classKey ) {
+ switch ( classKey ) {
+ case "ui-spinner":
+ return this.uiSpinner;
+ case "ui-spinner-up":
+ case "ui-spinner-down":
+ return this.element.find( classKey );
+ default:
+ return this._superApply( arguments );
+ }
+ },
+
_setOption: function( key, value ) {
if ( key === "culture" || key === "numberFormat" ) {
var prevValue = this._parse( this.element.val() );
@@ -461,7 +480,7 @@ return $.widget( "ui.spinner", {
_destroy: function() {
this.element
- .removeClass( "ui-spinner-input" )
+ .removeClass( this._classes( "ui-spinner-input" ) )
.prop( "disabled", false )
.removeAttr( "autocomplete" )
.removeAttr( "role" )
diff --git a/ui/tabs.js b/ui/tabs.js
index c0b24e74374..e0adaf64b3f 100644
--- a/ui/tabs.js
+++ b/ui/tabs.js
@@ -29,6 +29,16 @@ return $.widget( "ui.tabs", {
delay: 300,
options: {
active: null,
+ classes: {
+ "ui-tabs": "ui-corner-all",
+ "ui-tabs-collapsible": "",
+ "ui-tabs-active": "",
+ "ui-tabs-nav": "ui-corner-all",
+ "ui-tab": "ui-corner-top",
+ "ui-tabs-anchor": "",
+ "ui-tabs-panel": "ui-corner-bottom",
+ "ui-tabs-loading": ""
+ },
collapsible: false,
event: "click",
heightStyle: "content",
@@ -70,8 +80,8 @@ return $.widget( "ui.tabs", {
this.running = false;
this.element
- .addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
- .toggleClass( "ui-tabs-collapsible", options.collapsible );
+ .addClass( this._classes( "ui-tabs" ) + " ui-widget ui-widget-content" )
+ .toggleClass( this._classes( "ui-tabs-collapsible" ), options.collapsible );
this._processTabs();
options.active = this._initialActive();
@@ -262,6 +272,32 @@ return $.widget( "ui.tabs", {
return index;
},
+ _elementsFromClassKey: function( classKey ) {
+ switch ( classKey ) {
+ case "ui-tabs-collapsible":
+ if ( !this.options.collapsible ) {
+ return $();
+ }
+ break;
+ case "ui-tabs-active":
+ return this.active;
+ case "ui-tabs-nav":
+ return this.tablist;
+ case "ui-tab":
+ return this.tabs;
+ case "ui-tabs-anchor":
+ return this.anchors;
+ case "ui-tabs-panel":
+ return this.panels;
+ case "ui-tabs-loading":
+ if ( this.tab.hasClass( classKey ) ) {
+ return this.tab;
+ }
+ return $();
+ }
+ return this._superApply( arguments );
+ },
+
_setOption: function( key, value ) {
if ( key === "active" ) {
// _activate() will handle invalid values and update this.options
@@ -278,7 +314,7 @@ return $.widget( "ui.tabs", {
this._super( key, value);
if ( key === "collapsible" ) {
- this.element.toggleClass( "ui-tabs-collapsible", value );
+ this.element.toggleClass( this._classes( "ui-tabs-collapsible" ), value );
// Setting collapsible: false while collapsed; open first panel
if ( !value && this.options.active === false ) {
this._activate( 0 );
@@ -354,7 +390,7 @@ return $.widget( "ui.tabs", {
this.tabs.eq( 0 ).attr( "tabIndex", 0 );
} else {
this.active
- .addClass( "ui-tabs-active ui-state-active" )
+ .addClass( this._classes( "ui-tabs-active" ) + " ui-state-active" )
.attr({
"aria-selected": "true",
"aria-expanded": "true",
@@ -375,7 +411,7 @@ return $.widget( "ui.tabs", {
prevPanels = this.panels;
this.tablist = this._getList()
- .addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
+ .addClass( this._classes( "ui-tabs-nav" ) + " ui-helper-reset ui-helper-clearfix ui-widget-header" )
.attr( "role", "tablist" )
// Prevent users from focusing disabled tabs via click
@@ -398,7 +434,7 @@ return $.widget( "ui.tabs", {
});
this.tabs = this.tablist.find( "> li:has(a[href])" )
- .addClass( "ui-state-default ui-corner-top" )
+ .addClass( this._classes( "ui-tab" ) + " ui-state-default" )
.attr({
role: "tab",
tabIndex: -1
@@ -407,7 +443,7 @@ return $.widget( "ui.tabs", {
this.anchors = this.tabs.map(function() {
return $( "a", this )[ 0 ];
})
- .addClass( "ui-tabs-anchor" )
+ .addClass( that._classes( "ui-tabs-anchor" ) )
.attr({
role: "presentation",
tabIndex: -1
@@ -454,7 +490,7 @@ return $.widget( "ui.tabs", {
});
this.panels
- .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+ .addClass( this._classes( "ui-tabs-panel" ) + " ui-widget-content" )
.attr( "role", "tabpanel" );
// Avoid memory leaks (#10056)
@@ -473,7 +509,7 @@ return $.widget( "ui.tabs", {
_createPanel: function( id ) {
return $( "
" )
.attr( "id", id )
- .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+ .addClass( this._classes( "ui-tabs-panel" ) + " ui-widget-content" )
.data( "ui-tabs-destroy", true );
},
@@ -621,7 +657,7 @@ return $.widget( "ui.tabs", {
}
function show() {
- eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
+ eventData.newTab.closest( "li" ).addClass( that._classes( "ui-tabs-active" ) + " ui-state-active" );
if ( toShow.length && that.options.show ) {
that._show( toShow, that.options.show, complete );
@@ -634,11 +670,11 @@ return $.widget( "ui.tabs", {
// start out by hiding, then showing, then completing
if ( toHide.length && this.options.hide ) {
this._hide( toHide, this.options.hide, function() {
- eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+ eventData.oldTab.closest( "li" ).removeClass( that._classes( "ui-tabs-active" ) + " ui-state-active" );
show();
});
} else {
- eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+ eventData.oldTab.closest( "li" ).removeClass( this._classes( "ui-tabs-active" ) + " ui-state-active" );
toHide.hide();
show();
}
@@ -704,18 +740,19 @@ return $.widget( "ui.tabs", {
},
_destroy: function() {
+ var that = this;
if ( this.xhr ) {
this.xhr.abort();
}
- this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
+ this.element.removeClass( this._classes( "ui-tabs ui-tabs-collapsible" ) + " ui-widget ui-widget-content" );
this.tablist
- .removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
+ .removeClass( this._classes( "ui-tabs-nav" ) + " ui-helper-reset ui-helper-clearfix ui-widget-header" )
.removeAttr( "role" );
this.anchors
- .removeClass( "ui-tabs-anchor" )
+ .removeClass( this._classes( "ui-tabs-anchor" ) )
.removeAttr( "role" )
.removeAttr( "tabIndex" )
.removeUniqueId();
@@ -727,8 +764,8 @@ return $.widget( "ui.tabs", {
$( this ).remove();
} else {
$( this )
- .removeClass( "ui-state-default ui-state-active ui-state-disabled " +
- "ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
+ .removeClass( that._classes( "ui-tabs-active ui-tab ui-tabs-panel" ) +
+ " ui-helper-reset ui-helper-clearfix ui-widget-content ui-state-default ui-state-active ui-state-disabled" )
.removeAttr( "tabIndex" )
.removeAttr( "aria-live" )
.removeAttr( "aria-busy" )
@@ -826,7 +863,7 @@ return $.widget( "ui.tabs", {
// jQuery <1.8 returns false if the request is canceled in beforeSend,
// but as of 1.8, $.ajax() always returns a jqXHR object.
if ( this.xhr && this.xhr.statusText !== "canceled" ) {
- tab.addClass( "ui-tabs-loading" );
+ tab.addClass( this._classes( "ui-tabs-loading" ) );
panel.attr( "aria-busy", "true" );
this.xhr
@@ -846,7 +883,7 @@ return $.widget( "ui.tabs", {
that.panels.stop( false, true );
}
- tab.removeClass( "ui-tabs-loading" );
+ tab.removeClass( that._classes( "ui-tabs-loading" ) );
panel.removeAttr( "aria-busy" );
if ( jqXHR === that.xhr ) {
diff --git a/ui/tooltip.js b/ui/tooltip.js
index 180c9f8e24c..02e8970f595 100644
--- a/ui/tooltip.js
+++ b/ui/tooltip.js
@@ -25,9 +25,13 @@
}
}(function( $ ) {
-return $.widget( "ui.tooltip", {
+$.widget( "ui.tooltip", {
version: "@VERSION",
options: {
+ classes: {
+ "ui-tooltip": "ui-corner-all",
+ "ui-tooltip-content": ""
+ },
content: function() {
// support: IE<9, Opera in jQuery <1.7
// .text() can't accept undefined, so coerce to a string
@@ -44,7 +48,6 @@ return $.widget( "ui.tooltip", {
collision: "flipfit flip"
},
show: true,
- tooltipClass: null,
track: false,
// callbacks
@@ -105,6 +108,18 @@ return $.widget( "ui.tooltip", {
.appendTo( this.document[ 0 ].body );
},
+ _elementsFromClassKey: function( classKey ) {
+ switch ( classKey ) {
+ case "ui-tooltip":
+ return this.tooltips;
+ case "ui-tooltip-content":
+ return this.tooltips.map(function() {
+ return $( this ).find( classKey );
+ });
+ }
+ return $();
+ },
+
_setOption: function( key, value ) {
var that = this;
@@ -404,12 +419,11 @@ return $.widget( "ui.tooltip", {
_tooltip: function( element ) {
var tooltip = $( "
" )
.attr( "role", "tooltip" )
- .addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
- ( this.options.tooltipClass || "" ) ),
+ .addClass( this._classes( "ui-tooltip" ) + " ui-widget ui-widget-content " ),
id = tooltip.uniqueId().attr( "id" );
$( "
" )
- .addClass( "ui-tooltip-content" )
+ .addClass( this._classes( "ui-tooltip-content" ) )
.appendTo( tooltip );
tooltip.appendTo( this.document[0].body );
@@ -458,4 +472,22 @@ return $.widget( "ui.tooltip", {
}
});
+// DEPRECATED
+if ( $.uiBackCompat !== false ) {
+
+ // TooltipClass option
+ $.widget( "ui.tooltip", $.ui.tooltip, {
+ options: {
+ tooltipClass: null
+ },
+ _tooltip: function() {
+ var tooltip = this._superApply( arguments );
+ tooltip.tooltip.addClass( this.options.tooltipClass || "" );
+ return tooltip;
+ }
+ });
+}
+
+return $.ui.tooltip;
+
}));
diff --git a/ui/widget.js b/ui/widget.js
index 41425b1a9d3..4ac503654ba 100644
--- a/ui/widget.js
+++ b/ui/widget.js
@@ -357,6 +357,7 @@ $.Widget.prototype = {
return this;
},
+
_setOptions: function( options ) {
var key;
@@ -366,7 +367,26 @@ $.Widget.prototype = {
return this;
},
+
+ _elementsFromClassKey: function( classKey ) {
+ if ( this.options.classes[ classKey ] ) {
+ return this.element;
+ } else {
+ return $();
+ }
+ },
+
_setOption: function( key, value ) {
+ if ( key === "classes" ) {
+ for ( var classKey in value ) {
+ if ( value[ classKey ] !== this.options.classes[ classKey ] ) {
+ this._elementsFromClassKey( classKey )
+ .removeClass( this._classesFromObject( classKey, this.options.classes ) )
+ .addClass( this._classesFromObject( classKey, value ) );
+ }
+ }
+ }
+
this.options[ key ] = value;
if ( key === "disabled" ) {
@@ -383,6 +403,27 @@ $.Widget.prototype = {
return this;
},
+ _classesFromObject: function( key, classes ) {
+ var out = [],
+ parts = key.split( " " ),
+ i = parts.length;
+
+ while ( i-- ) {
+ out.push( parts[ i ] );
+
+ // Avoid extra spaces in the return value resulting from pushing an empty classes value
+ if ( classes[ parts[ i ] ] ) {
+ out.push( classes[ parts[ i ] ] );
+ }
+ }
+
+ return out.join( " " );
+ },
+
+ _classes: function( key ) {
+ return this._classesFromObject( key, this.options.classes );
+ },
+
enable: function() {
return this._setOptions({ disabled: false });
},