jQuery UI 1.10 has already been released, and 1.11 is on the horizon (1.9 is marked "legacy" as of writing). 1.10 drops the compatibility layer for 1.8 API. So, users should definitely be encouraged to upgrade their code to move away from the deprecated 1.8 APIs. However, to take it one step at a time, this commit upgrades us to 1.9 first. That way we're at least not using an unsupported code base anymore, while at the same time not rolling out breaking changes. jQuery UI has redesigned many of its APIs[1], but compatibility with the jQuery UI 1.8 API is maintained throughout 1.9.x. * Base theme is now called "Smoothness". * Sorting the entries in Resources.php alphabetically to make it easier to ensure all files are listed when comparing them side-by-side. * Update dependencies to match the "Depends:" header inside the javascript files. * In jQuery UI 1.9, effect files were renamed to match the jquery.ui.*.js naming pattern. * New modules: - jquery.ui.menu - jquery.ui.spinner - jquery.ui.tooltip * Release notes: - http://blog.jqueryui.com/2012/10/jquery-ui-1-9-0/ - http://jqueryui.com/upgrade-guide/1.9/ - http://jqueryui.com/changelog/1.9.0/ - http://blog.jqueryui.com/2012/10/jquery-ui-1-9-1/ - http://jqueryui.com/changelog/1.9.1/ - http://blog.jqueryui.com/2012/11/jquery-ui-1-9-2/ [1] http://blog.jqueryui.com/2011/03/api-redesigns-the-past-present-and-future/ Bug: 47076 Change-Id: I0e10b42fb7c25b9d4704719f21c44c08f36ddfa7
418 lines
11 KiB
JavaScript
418 lines
11 KiB
JavaScript
/*!
|
|
* jQuery UI Button 1.9.2
|
|
* http://jqueryui.com
|
|
*
|
|
* Copyright 2012 jQuery Foundation and other contributors
|
|
* Released under the MIT license.
|
|
* http://jquery.org/license
|
|
*
|
|
* http://api.jqueryui.com/button/
|
|
*
|
|
* Depends:
|
|
* jquery.ui.core.js
|
|
* jquery.ui.widget.js
|
|
*/
|
|
(function( $, undefined ) {
|
|
|
|
var lastActive, startXPos, startYPos, clickDragged,
|
|
baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
|
|
stateClasses = "ui-state-hover ui-state-active ",
|
|
typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
|
|
formResetHandler = function() {
|
|
var buttons = $( this ).find( ":ui-button" );
|
|
setTimeout(function() {
|
|
buttons.button( "refresh" );
|
|
}, 1 );
|
|
},
|
|
radioGroup = function( radio ) {
|
|
var name = radio.name,
|
|
form = radio.form,
|
|
radios = $( [] );
|
|
if ( name ) {
|
|
if ( form ) {
|
|
radios = $( form ).find( "[name='" + name + "']" );
|
|
} else {
|
|
radios = $( "[name='" + name + "']", radio.ownerDocument )
|
|
.filter(function() {
|
|
return !this.form;
|
|
});
|
|
}
|
|
}
|
|
return radios;
|
|
};
|
|
|
|
$.widget( "ui.button", {
|
|
version: "1.9.2",
|
|
defaultElement: "<button>",
|
|
options: {
|
|
disabled: null,
|
|
text: true,
|
|
label: null,
|
|
icons: {
|
|
primary: null,
|
|
secondary: null
|
|
}
|
|
},
|
|
_create: function() {
|
|
this.element.closest( "form" )
|
|
.unbind( "reset" + this.eventNamespace )
|
|
.bind( "reset" + this.eventNamespace, formResetHandler );
|
|
|
|
if ( typeof this.options.disabled !== "boolean" ) {
|
|
this.options.disabled = !!this.element.prop( "disabled" );
|
|
} else {
|
|
this.element.prop( "disabled", this.options.disabled );
|
|
}
|
|
|
|
this._determineButtonType();
|
|
this.hasTitle = !!this.buttonElement.attr( "title" );
|
|
|
|
var that = this,
|
|
options = this.options,
|
|
toggleButton = this.type === "checkbox" || this.type === "radio",
|
|
activeClass = !toggleButton ? "ui-state-active" : "",
|
|
focusClass = "ui-state-focus";
|
|
|
|
if ( options.label === null ) {
|
|
options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
|
|
}
|
|
|
|
this._hoverable( this.buttonElement );
|
|
|
|
this.buttonElement
|
|
.addClass( baseClasses )
|
|
.attr( "role", "button" )
|
|
.bind( "mouseenter" + this.eventNamespace, function() {
|
|
if ( options.disabled ) {
|
|
return;
|
|
}
|
|
if ( this === lastActive ) {
|
|
$( this ).addClass( "ui-state-active" );
|
|
}
|
|
})
|
|
.bind( "mouseleave" + this.eventNamespace, function() {
|
|
if ( options.disabled ) {
|
|
return;
|
|
}
|
|
$( this ).removeClass( activeClass );
|
|
})
|
|
.bind( "click" + this.eventNamespace, function( event ) {
|
|
if ( options.disabled ) {
|
|
event.preventDefault();
|
|
event.stopImmediatePropagation();
|
|
}
|
|
});
|
|
|
|
this.element
|
|
.bind( "focus" + this.eventNamespace, function() {
|
|
// no need to check disabled, focus won't be triggered anyway
|
|
that.buttonElement.addClass( focusClass );
|
|
})
|
|
.bind( "blur" + this.eventNamespace, function() {
|
|
that.buttonElement.removeClass( focusClass );
|
|
});
|
|
|
|
if ( toggleButton ) {
|
|
this.element.bind( "change" + this.eventNamespace, function() {
|
|
if ( clickDragged ) {
|
|
return;
|
|
}
|
|
that.refresh();
|
|
});
|
|
// if mouse moves between mousedown and mouseup (drag) set clickDragged flag
|
|
// prevents issue where button state changes but checkbox/radio checked state
|
|
// does not in Firefox (see ticket #6970)
|
|
this.buttonElement
|
|
.bind( "mousedown" + this.eventNamespace, function( event ) {
|
|
if ( options.disabled ) {
|
|
return;
|
|
}
|
|
clickDragged = false;
|
|
startXPos = event.pageX;
|
|
startYPos = event.pageY;
|
|
})
|
|
.bind( "mouseup" + this.eventNamespace, function( event ) {
|
|
if ( options.disabled ) {
|
|
return;
|
|
}
|
|
if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
|
|
clickDragged = true;
|
|
}
|
|
});
|
|
}
|
|
|
|
if ( this.type === "checkbox" ) {
|
|
this.buttonElement.bind( "click" + this.eventNamespace, function() {
|
|
if ( options.disabled || clickDragged ) {
|
|
return false;
|
|
}
|
|
$( this ).toggleClass( "ui-state-active" );
|
|
that.buttonElement.attr( "aria-pressed", that.element[0].checked );
|
|
});
|
|
} else if ( this.type === "radio" ) {
|
|
this.buttonElement.bind( "click" + this.eventNamespace, function() {
|
|
if ( options.disabled || clickDragged ) {
|
|
return false;
|
|
}
|
|
$( this ).addClass( "ui-state-active" );
|
|
that.buttonElement.attr( "aria-pressed", "true" );
|
|
|
|
var radio = that.element[ 0 ];
|
|
radioGroup( radio )
|
|
.not( radio )
|
|
.map(function() {
|
|
return $( this ).button( "widget" )[ 0 ];
|
|
})
|
|
.removeClass( "ui-state-active" )
|
|
.attr( "aria-pressed", "false" );
|
|
});
|
|
} else {
|
|
this.buttonElement
|
|
.bind( "mousedown" + this.eventNamespace, function() {
|
|
if ( options.disabled ) {
|
|
return false;
|
|
}
|
|
$( this ).addClass( "ui-state-active" );
|
|
lastActive = this;
|
|
that.document.one( "mouseup", function() {
|
|
lastActive = null;
|
|
});
|
|
})
|
|
.bind( "mouseup" + this.eventNamespace, function() {
|
|
if ( options.disabled ) {
|
|
return false;
|
|
}
|
|
$( this ).removeClass( "ui-state-active" );
|
|
})
|
|
.bind( "keydown" + this.eventNamespace, function(event) {
|
|
if ( options.disabled ) {
|
|
return false;
|
|
}
|
|
if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
|
|
$( this ).addClass( "ui-state-active" );
|
|
}
|
|
})
|
|
.bind( "keyup" + this.eventNamespace, function() {
|
|
$( this ).removeClass( "ui-state-active" );
|
|
});
|
|
|
|
if ( this.buttonElement.is("a") ) {
|
|
this.buttonElement.keyup(function(event) {
|
|
if ( event.keyCode === $.ui.keyCode.SPACE ) {
|
|
// TODO pass through original event correctly (just as 2nd argument doesn't work)
|
|
$( this ).click();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
// TODO: pull out $.Widget's handling for the disabled option into
|
|
// $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
|
|
// be overridden by individual plugins
|
|
this._setOption( "disabled", options.disabled );
|
|
this._resetButton();
|
|
},
|
|
|
|
_determineButtonType: function() {
|
|
var ancestor, labelSelector, checked;
|
|
|
|
if ( this.element.is("[type=checkbox]") ) {
|
|
this.type = "checkbox";
|
|
} else if ( this.element.is("[type=radio]") ) {
|
|
this.type = "radio";
|
|
} else if ( this.element.is("input") ) {
|
|
this.type = "input";
|
|
} else {
|
|
this.type = "button";
|
|
}
|
|
|
|
if ( this.type === "checkbox" || this.type === "radio" ) {
|
|
// we don't search against the document in case the element
|
|
// is disconnected from the DOM
|
|
ancestor = this.element.parents().last();
|
|
labelSelector = "label[for='" + this.element.attr("id") + "']";
|
|
this.buttonElement = ancestor.find( labelSelector );
|
|
if ( !this.buttonElement.length ) {
|
|
ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
|
|
this.buttonElement = ancestor.filter( labelSelector );
|
|
if ( !this.buttonElement.length ) {
|
|
this.buttonElement = ancestor.find( labelSelector );
|
|
}
|
|
}
|
|
this.element.addClass( "ui-helper-hidden-accessible" );
|
|
|
|
checked = this.element.is( ":checked" );
|
|
if ( checked ) {
|
|
this.buttonElement.addClass( "ui-state-active" );
|
|
}
|
|
this.buttonElement.prop( "aria-pressed", checked );
|
|
} else {
|
|
this.buttonElement = this.element;
|
|
}
|
|
},
|
|
|
|
widget: function() {
|
|
return this.buttonElement;
|
|
},
|
|
|
|
_destroy: function() {
|
|
this.element
|
|
.removeClass( "ui-helper-hidden-accessible" );
|
|
this.buttonElement
|
|
.removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
|
|
.removeAttr( "role" )
|
|
.removeAttr( "aria-pressed" )
|
|
.html( this.buttonElement.find(".ui-button-text").html() );
|
|
|
|
if ( !this.hasTitle ) {
|
|
this.buttonElement.removeAttr( "title" );
|
|
}
|
|
},
|
|
|
|
_setOption: function( key, value ) {
|
|
this._super( key, value );
|
|
if ( key === "disabled" ) {
|
|
if ( value ) {
|
|
this.element.prop( "disabled", true );
|
|
} else {
|
|
this.element.prop( "disabled", false );
|
|
}
|
|
return;
|
|
}
|
|
this._resetButton();
|
|
},
|
|
|
|
refresh: function() {
|
|
//See #8237 & #8828
|
|
var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
|
|
|
|
if ( isDisabled !== this.options.disabled ) {
|
|
this._setOption( "disabled", isDisabled );
|
|
}
|
|
if ( this.type === "radio" ) {
|
|
radioGroup( this.element[0] ).each(function() {
|
|
if ( $( this ).is( ":checked" ) ) {
|
|
$( this ).button( "widget" )
|
|
.addClass( "ui-state-active" )
|
|
.attr( "aria-pressed", "true" );
|
|
} else {
|
|
$( this ).button( "widget" )
|
|
.removeClass( "ui-state-active" )
|
|
.attr( "aria-pressed", "false" );
|
|
}
|
|
});
|
|
} else if ( this.type === "checkbox" ) {
|
|
if ( this.element.is( ":checked" ) ) {
|
|
this.buttonElement
|
|
.addClass( "ui-state-active" )
|
|
.attr( "aria-pressed", "true" );
|
|
} else {
|
|
this.buttonElement
|
|
.removeClass( "ui-state-active" )
|
|
.attr( "aria-pressed", "false" );
|
|
}
|
|
}
|
|
},
|
|
|
|
_resetButton: function() {
|
|
if ( this.type === "input" ) {
|
|
if ( this.options.label ) {
|
|
this.element.val( this.options.label );
|
|
}
|
|
return;
|
|
}
|
|
var buttonElement = this.buttonElement.removeClass( typeClasses ),
|
|
buttonText = $( "<span></span>", this.document[0] )
|
|
.addClass( "ui-button-text" )
|
|
.html( this.options.label )
|
|
.appendTo( buttonElement.empty() )
|
|
.text(),
|
|
icons = this.options.icons,
|
|
multipleIcons = icons.primary && icons.secondary,
|
|
buttonClasses = [];
|
|
|
|
if ( icons.primary || icons.secondary ) {
|
|
if ( this.options.text ) {
|
|
buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
|
|
}
|
|
|
|
if ( icons.primary ) {
|
|
buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
|
|
}
|
|
|
|
if ( icons.secondary ) {
|
|
buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
|
|
}
|
|
|
|
if ( !this.options.text ) {
|
|
buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
|
|
|
|
if ( !this.hasTitle ) {
|
|
buttonElement.attr( "title", $.trim( buttonText ) );
|
|
}
|
|
}
|
|
} else {
|
|
buttonClasses.push( "ui-button-text-only" );
|
|
}
|
|
buttonElement.addClass( buttonClasses.join( " " ) );
|
|
}
|
|
});
|
|
|
|
$.widget( "ui.buttonset", {
|
|
version: "1.9.2",
|
|
options: {
|
|
items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(button)"
|
|
},
|
|
|
|
_create: function() {
|
|
this.element.addClass( "ui-buttonset" );
|
|
},
|
|
|
|
_init: function() {
|
|
this.refresh();
|
|
},
|
|
|
|
_setOption: function( key, value ) {
|
|
if ( key === "disabled" ) {
|
|
this.buttons.button( "option", key, value );
|
|
}
|
|
|
|
this._super( key, value );
|
|
},
|
|
|
|
refresh: function() {
|
|
var rtl = this.element.css( "direction" ) === "rtl";
|
|
|
|
this.buttons = this.element.find( this.options.items )
|
|
.filter( ":ui-button" )
|
|
.button( "refresh" )
|
|
.end()
|
|
.not( ":ui-button" )
|
|
.button()
|
|
.end()
|
|
.map(function() {
|
|
return $( this ).button( "widget" )[ 0 ];
|
|
})
|
|
.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
|
|
.filter( ":first" )
|
|
.addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
|
|
.end()
|
|
.filter( ":last" )
|
|
.addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
|
|
.end()
|
|
.end();
|
|
},
|
|
|
|
_destroy: function() {
|
|
this.element.removeClass( "ui-buttonset" );
|
|
this.buttons
|
|
.map(function() {
|
|
return $( this ).button( "widget" )[ 0 ];
|
|
})
|
|
.removeClass( "ui-corner-left ui-corner-right" )
|
|
.end()
|
|
.button( "destroy" );
|
|
}
|
|
});
|
|
|
|
}( jQuery ) );
|