/*!
- * OOjs UI v0.18.2
+ * OOjs UI v0.19.1
* https://www.mediawiki.org/wiki/OOjs_UI
*
- * Copyright 2011–2016 OOjs UI Team and other contributors.
+ * Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2016-12-06T23:32:53Z
+ * Date: 2017-02-08T00:38:31Z
*/
( function ( OO ) {
}
this.$element
.addClass( 'oo-ui-draggableGroupElement' )
+ .attr( 'role', 'listbox' )
.append( this.$status )
.toggleClass( 'oo-ui-draggableGroupElement-horizontal', this.orientation === 'horizontal' );
};
* @constructor
* @param {Object} [config] Configuration options
* @cfg {boolean} [continuous=false] Show all pages, one after another
- * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new page is displayed.
+ * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new page is displayed. Disabled on mobile.
* @cfg {boolean} [outlined=false] Show the outline. The outline is used to navigate through the pages of the booklet.
* @cfg {boolean} [editable=false] Show controls for adding, removing and reordering pages
*/
OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
var layout = this;
if ( !this.scrolling && page ) {
- page.scrollElementIntoView( {
- complete: function () {
- if ( layout.autoFocus ) {
- layout.focus();
- }
+ page.scrollElementIntoView().done( function () {
+ if ( layout.autoFocus && !OO.ui.isMobile() ) {
+ layout.focus();
}
} );
}
// meaningless because the next page is not visible yet and thus can't hold focus.
if (
this.autoFocus &&
+ !OO.ui.isMobile() &&
this.stackLayout.continuous &&
OO.ui.findFocusable( page.$element ).length !== 0
) {
* @param {Object} [config] Configuration options
* @cfg {boolean} [continuous=false] Show all cards, one after another
* @cfg {boolean} [expanded=true] Expand the content panel to fill the entire parent element.
- * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new card is displayed.
+ * @cfg {boolean} [autoFocus=true] Focus on the first focusable element when a new card is displayed. Disabled on mobile.
*/
OO.ui.IndexLayout = function OoUiIndexLayout( config ) {
// Configuration initialization
OO.ui.IndexLayout.prototype.onStackLayoutSet = function ( card ) {
var layout = this;
if ( card ) {
- card.scrollElementIntoView( {
- complete: function () {
- if ( layout.autoFocus ) {
- layout.focus();
- }
+ card.scrollElementIntoView().done( function () {
+ if ( layout.autoFocus && !OO.ui.isMobile() ) {
+ layout.focus();
}
} );
}
// meaningless because the next card is not visible yet and thus can't hold focus.
if (
this.autoFocus &&
+ !OO.ui.isMobile() &&
this.stackLayout.continuous &&
OO.ui.findFocusable( card.$element ).length !== 0
) {
/* Static Properties */
+/**
+ * @static
+ * @inheritdoc
+ */
OO.ui.OutlineOptionWidget.static.highlightable = true;
+/**
+ * @static
+ * @inheritdoc
+ */
OO.ui.OutlineOptionWidget.static.scrollIntoViewOnSelect = true;
+/**
+ * @static
+ * @inheritable
+ * @property {string}
+ */
OO.ui.OutlineOptionWidget.static.levelClass = 'oo-ui-outlineOptionWidget-level-';
+/**
+ * @static
+ * @inheritable
+ * @property {number}
+ */
OO.ui.OutlineOptionWidget.static.levels = 3;
/* Methods */
/* Static Properties */
-// Allow button mouse down events to pass through so they can be handled by the parent select widget
+/**
+ * Allow button mouse down events to pass through so they can be handled by the parent select widget
+ *
+ * @static
+ * @inheritdoc
+ */
OO.ui.ButtonOptionWidget.static.cancelButtonMouseDownEvents = false;
+/**
+ * @static
+ * @inheritdoc
+ */
OO.ui.ButtonOptionWidget.static.highlightable = false;
/* Methods */
/* Static Properties */
+/**
+ * @static
+ * @inheritdoc
+ */
OO.ui.TabOptionWidget.static.highlightable = false;
/**
* @param {Object} [config] Configuration options
* @cfg {string} [placeholder] Placeholder text
* @cfg {boolean} [allowArbitrary=false] Allow data items to be added even if not present in the menu.
+ * @cfg {boolean} [allowDuplicates=false] Allow duplicate items to be added.
* @cfg {Object} [menu] (required) Configuration options to pass to the
* {@link OO.ui.MenuSelectWidget menu select widget}.
* @cfg {Object} [popup] Configuration options to pass to the {@link OO.ui.PopupWidget popup widget}.
// Configuration initialization
config = $.extend( {
allowArbitrary: false,
+ allowDuplicates: false,
$overlay: this.$element
}, config );
align: 'forwards',
anchor: false
} );
- OO.ui.mixin.PopupElement.call( this, config );
+ OO.ui.mixin.PopupElement.call( this, $.extend( true, {}, config, {
+ popup: {
+ $floatableContainer: this.$element
+ }
+ } ) );
$tabFocus = $( '<span>' );
OO.ui.mixin.TabIndexedElement.call( this, $.extend( {}, config, { $tabIndexed: $tabFocus } ) );
} else {
// Properties
this.$content = $( '<div>' );
this.allowArbitrary = config.allowArbitrary;
+ this.allowDuplicates = config.allowDuplicates;
this.$overlay = config.$overlay;
this.menu = new OO.ui.FloatingMenuSelectWidget( $.extend(
{
// Events
if ( this.popup ) {
$tabFocus.on( {
- focus: this.onFocusForPopup.bind( this )
+ focus: this.focus.bind( this )
} );
this.popup.$element.on( 'focusout', this.onPopupFocusOut.bind( this ) );
if ( this.popup.$autoCloseIgnore ) {
this.$element.addClass( 'oo-ui-capsuleMultiselectWidget' )
.append( this.$handle );
if ( this.popup ) {
+ this.popup.$element.addClass( 'oo-ui-capsuleMultiselectWidget-popup' );
this.$content.append( $tabFocus );
this.$overlay.append( this.popup.$element );
} else {
this.$content.append( this.$input );
this.$overlay.append( this.menu.$element );
}
+ if ( $tabFocus ) {
+ $tabFocus.addClass( 'oo-ui-capsuleMultiselectWidget-focusTrap' );
+ }
// Input size needs to be calculated after everything else is rendered
setTimeout( function () {
$.each( datas, function ( i, data ) {
var item;
- if ( !widget.getItemFromData( data ) ) {
+ if ( !widget.getItemFromData( data ) || widget.allowDuplicates ) {
item = menu.getItemFromData( data );
if ( item ) {
item = widget.createItemWidget( data, item.label );
this.clearInput();
};
-/**
- * Handle focus events
- *
- * @private
- * @param {jQuery.Event} event
- */
-OO.ui.CapsuleMultiselectWidget.prototype.onFocusForPopup = function () {
- if ( !this.isDisabled() ) {
- this.popup.setSize( this.$handle.width() );
- this.popup.toggle( true );
- OO.ui.findFocusable( this.popup.$element ).focus();
- }
-};
-
/**
* Handles popup focus out events.
*
OO.ui.CapsuleMultiselectWidget.prototype.focus = function () {
if ( !this.isDisabled() ) {
if ( this.popup ) {
- this.popup.setSize( this.$handle.width() );
+ this.popup.setSize( this.$handle.outerWidth() );
this.popup.toggle( true );
OO.ui.findFocusable( this.popup.$element ).focus();
} else {
};
/**
+ * The old name for the CapsuleMultiselectWidget widget, provided for backwards-compatibility.
+ *
* @class
+ * @extends OO.ui.CapsuleMultiselectWidget
+ *
+ * @constructor
* @deprecated since 0.17.3; use OO.ui.CapsuleMultiselectWidget instead
*/
-OO.ui.CapsuleMultiSelectWidget = OO.ui.CapsuleMultiselectWidget;
+OO.ui.CapsuleMultiSelectWidget = function OoUiCapsuleMultiSelectWidget() {
+ OO.ui.warnDeprecation( 'CapsuleMultiSelectWidget is deprecated. Use the CapsuleMultiselectWidget instead.' );
+ // Parent constructor
+ OO.ui.CapsuleMultiSelectWidget.parent.apply( this, arguments );
+};
+
+OO.inheritClass( OO.ui.CapsuleMultiSelectWidget, OO.ui.CapsuleMultiselectWidget );
/**
* SelectFileWidgets allow for selecting files, using the HTML5 File API. These
return false;
}
- /* eslint-disable no-bitwise */
- if ( this.isInteger && ( n | 0 ) !== n ) {
+ if ( this.isInteger && Math.floor( n ) !== n ) {
return false;
}
- /* eslint-enable no-bitwise */
if ( n < this.min || n > this.max ) {
return false;