Files
moodle/theme/bootstrap/javascript/bootstrapdropdown.js
T
Bas Brands 8903b17b01 MDL-38016 Themes - Add a bootstrap theme to core
This theme has been contributed by:
Bas Brands <bmbrands@gmail.com>
David Scotson <david.scotson@glasgow.ac.uk>
Michael Aherne <michael.aherne@strath.ac.uk>
Stuart Lamour <thisismyrice@gmail.com>

Thanks for your hard work.
2013-04-03 09:43:18 +08:00

115 lines
3.0 KiB
JavaScript

YUI.add('gallery-bootstrap-dropdown', function(Y) {
/**
A Plugin which provides dropdown behaviors for dropdown buttons and menu
groups. This utilizes the markup from the Twitter Bootstrap Project.
@module gallery-bootstrap-dropdown
**/
/**
A Plugin which provides dropdown behaviors for dropdown buttons and menu
groups. This utilizes the markup from the Twitter Bootstrap Project.
To automatically gain this functionality, you can simply add the
<code>data-toggle=dropdown</code> attribute to any element.
It can also be plugged into any node or node list.
@example
var node = Y.one('.someNode');
node.plug( Y.Bootstrap.Dropdown );
node.dropdown.show();
@class Bootstrap.Dropdown
**/
var NS = Y.namespace('Bootstrap');
function DropdownPlugin(config) {
DropdownPlugin.superclass.constructor.apply(this, arguments);
}
DropdownPlugin.NAME = 'Bootstrap.Dropdown';
DropdownPlugin.NS = 'dropdown';
Y.extend( DropdownPlugin, Y.Plugin.Base, {
defaults : {
className : 'open',
target : 'target',
selector : ''
},
initializer : function(config) {
this._node = config.host;
this.config = Y.mix( config, this.defaults );
this.publish('show', { preventable : true, defaultFn : this.show });
this.publish('hide', { preventable : true, defaultFn : this.hide });
this._node.on('click', this.toggle, this);
},
toggle : function() {
var target = this.getTarget(),
className = this.config.className;
target.toggleClass( className );
target.once('clickoutside', function(e) {
target.toggleClass( className );
});
},
show : function() {
this.getTarget().addClass( this.config.className );
},
hide : function() {
this.getTarget().removeClass( this.config.className );
},
open : function() {
this.getTarget().addClass( this.config.className );
},
close : function() {
this.getTarget().removeClass( this.config.className );
},
/**
@method getTarget
@description Fetches a Y.NodeList or Y.Node that should be used to modify class names
**/
getTarget : function() {
var node = this._node,
selector = node.getData( this.config.target ),
target;
if ( !selector ) {
selector = node.getAttribute('href');
selector = target && target.replace(/.*(?=#[^\s]*$)/, ''); //strip for ie7
}
target = Y.all(selector);
if ( target.size() === 0 ) {
target = node.get('parentNode');
}
return target;
}
});
NS.Dropdown = DropdownPlugin;
NS.dropdown_delegation = function() {
Y.delegate('click', function(e) {
var target = e.currentTarget;
e.preventDefault();
if ( typeof e.target.dropdown === 'undefined' ) {
target.plug( DropdownPlugin );
target.dropdown.toggle();
}
}, document.body, '*[data-toggle=dropdown]' );
};
}, '@VERSION@' ,{requires:['plugin','event','event-outside']});
;