diff options
Diffstat (limited to 'src/jquery.ui.waitbutton.js')
-rw-r--r-- | src/jquery.ui.waitbutton.js | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/src/jquery.ui.waitbutton.js b/src/jquery.ui.waitbutton.js new file mode 100644 index 0000000..0225378 --- /dev/null +++ b/src/jquery.ui.waitbutton.js @@ -0,0 +1,149 @@ +/*! + * Copyright (c) 2013 Ben Olson (https://github.com/bseth99/jquery-ui-extensions) + * jQuery UI WaitButton @VERSION + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.button.js + */ + (function ( $, undefined ) { + $.widget( "ui.waitbutton", $.ui.button, { + + version: "@VERSION", + + // Keep button prefix instead of waitbutton + // otherwise waiting event is waitbuttonwaiting + // which is weird. + widgetEventPrefix: "button", + + options: { + waitLabel: null, + waitIcon: 'ui-icon-waiting' + }, + + _saved: null, + + _create: function() { + + this._super(); + + this.element.addClass('ui-wait-button'); + this._saved = {}; + + this._saveOptions(); + + }, + + _init: function() { + + this._super(); + + this.disable(); + this._toggleWaitState(); + this._initWaitClick(); + + }, + + _initWaitClick: function() { + + /** + * channel clicks through waiting event instead + * base button does not listen to click - + * it listens to mousedown/up. This prevents any external + * listeners from firing when we want to use the callback + * provided by the waiting event. + */ + this.element.off( 'click' ); + + this.element.one( 'click', $.proxy( this, '_toggleWaitState' ) ); + }, + + _toggleWaitState: function() { + + var event; + + if ( this.options.disabled ) { + + this._setOptions({ + disabled: false, + label: this._saved.label, + icons: { primary: this._saved.icon } + }); + + } else { + + this._saveOptions(); + + this._setOptions({ + disabled: true, + label: this.options.waitLabel || this.options.label, + icons: { primary: this.options.waitIcon } + }); + + event = arguments[0] || (new jQuery.Event( 'click', { target: this.element } ) ); + + /* channel clicks through waiting event instead */ + event.preventDefault(); + event.stopPropagation(); + event.stopImmediatePropagation(); + + this._trigger( 'waiting', event, { done: $.proxy( this, '_waitComplete' ) } ); + } + + }, + + _waitComplete: function() { + + // Juggle arguments + var label = (arguments[0] && typeof( arguments[0] ) == 'string' ? arguments[0] : null), + enable = (label ? arguments[1] : arguments[0]); + + // Determine next state - either return to start or + // use a different label and/or leave in disabled state + + if ( typeof( enable ) == 'undefined' ) enable = true; + + this._toggleWaitState(); + if ( enable ) { + this._initWaitClick(); + } else { + this.disable(); + } + + if ( label ) { + this._setOption( 'label', label ); + } + }, + + _saveOptions: function() { + + this._saved.icon = this.options.icons.primary; + this._saved.label = this.options.label; + + } + + }); + +})(jQuery); |