/**
* PopupButtonWidgets toggle the visibility of a contained {@link OO.ui.PopupWidget PopupWidget},
* which is used to display additional information or options.
*
* @example
* // A PopupButtonWidget.
* const popupButton = new OO.ui.PopupButtonWidget( {
* label: 'Popup button with options',
* icon: 'menu',
* popup: {
* $content: $( '<p>Additional options here.</p>' ),
* padded: true,
* align: 'force-left'
* }
* } );
* // Append the button to the DOM.
* $( document.body ).append( popupButton.$element );
*
* @class
* @extends OO.ui.ButtonWidget
* @mixes OO.ui.mixin.PopupElement
*
* @constructor
* @param {Object} [config] Configuration options
* @param {jQuery} [config.$overlay] Render the popup into a separate layer. This configuration is useful
* in cases where the expanded popup is larger than its containing `<div>`. The specified overlay
* layer is usually on top of the containing `<div>` and has a larger area. By default, the popup
* uses relative positioning.
* See <https://www.mediawiki.org/wiki/OOUI/Concepts#Overlays>.
*/
OO.ui.PopupButtonWidget = function OoUiPopupButtonWidget( config ) {
// Configuration initialization
config = config || {};
// Parent constructor
OO.ui.PopupButtonWidget.super.call( this, config );
// Mixin constructors
OO.ui.mixin.PopupElement.call( this, config );
// Properties
this.$overlay = ( config.$overlay === true ?
OO.ui.getDefaultOverlay() : config.$overlay ) || this.$element;
// Events
this.connect( this, {
click: 'onAction'
} );
// Initialization
this.$element.addClass( 'oo-ui-popupButtonWidget' );
this.$button.attr( {
'aria-haspopup': 'dialog',
'aria-owns': this.popup.getElementId()
} );
this.popup.$element
.addClass( 'oo-ui-popupButtonWidget-popup' )
.attr( {
role: 'dialog',
'aria-describedby': this.getElementId()
} )
.toggleClass( 'oo-ui-popupButtonWidget-framed-popup', this.isFramed() )
.toggleClass( 'oo-ui-popupButtonWidget-frameless-popup', !this.isFramed() );
this.$overlay.append( this.popup.$element );
};
/* Setup */
OO.inheritClass( OO.ui.PopupButtonWidget, OO.ui.ButtonWidget );
OO.mixinClass( OO.ui.PopupButtonWidget, OO.ui.mixin.PopupElement );
/* Methods */
/**
* Handle the button action being triggered.
*
* @private
*/
OO.ui.PopupButtonWidget.prototype.onAction = function () {
this.popup.toggle();
};