/*!
- * OOjs UI v0.23.2
+ * OOjs UI v0.24.2
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2017 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2017-09-26T20:18:42Z
+ * Date: 2017-11-07T22:52:40Z
*/
( function ( OO ) {
* Data can also be specified with the #setData method.
*/
OO.ui.Element = function OoUiElement( config ) {
- this.initialConfig = config;
+ if ( OO.ui.isDemo ) {
+ this.initialConfig = config;
+ }
// Configuration initialization
config = config || {};
* sub-string wrapped in highlighted span
*/
OO.ui.mixin.LabelElement.static.highlightQuery = function ( text, query, compare ) {
- var i, offset, tLen, qLen,
+ var i, tLen, qLen,
+ offset = -1,
$result = $( '<span>' );
if ( compare ) {
tLen = text.length;
qLen = query.length;
- for ( i = 0; offset === undefined && i <= tLen - qLen; i++ ) {
+ for ( i = 0; offset === -1 && i <= tLen - qLen; i++ ) {
if ( compare( query, text.slice( i, i + qLen ) ) === 0 ) {
offset = i;
}
}
if ( !query.length || offset === -1 ) {
- return $result.text( text );
- }
- $result.append(
- document.createTextNode( text.slice( 0, offset ) ),
- $( '<span>' )
- .addClass( 'oo-ui-labelElement-label-highlight' )
- .text( text.slice( offset, offset + query.length ) ),
- document.createTextNode( text.slice( offset + query.length ) )
- );
+ $result.text( text );
+ } else {
+ $result.append(
+ document.createTextNode( text.slice( 0, offset ) ),
+ $( '<span>' )
+ .addClass( 'oo-ui-labelElement-label-highlight' )
+ .text( text.slice( offset, offset + query.length ) ),
+ document.createTextNode( text.slice( offset + query.length ) )
+ );
+ }
return $result.contents();
};
floatablePos = this.$floatableContainer.offset();
floatablePos[ far ] = floatablePos[ near ] + this.$floatableContainer[ 'outer' + sizeProp ]();
// Measure where the offsetParent is and compute our position based on that and parentPosition
- offsetParentPos = this.$element.offsetParent().offset();
+ offsetParentPos = this.$element.offsetParent()[ 0 ] === document.documentElement ?
+ { top: 0, left: 0 } :
+ this.$element.offsetParent().offset();
if ( positionProp === near ) {
popupPos[ near ] = offsetParentPos[ near ] + parentPosition[ near ];
}
// Check if the popup will go beyond the edge of this.$container
- containerPos = this.$container.offset();
+ containerPos = this.$container[ 0 ] === document.documentElement ?
+ { top: 0, left: 0 } :
+ this.$container.offset();
containerPos[ far ] = containerPos[ near ] + this.$container[ 'inner' + sizeProp ]();
// Take into account how much the popup will move because of the adjustments we're going to make
popupPos[ near ] += ( positionProp === near ? 1 : -1 ) * positionAdjustment;
item = this.findFirstSelectableItem();
}
} else {
- // One of the options got focussed (and the event bubbled up here).
- // They can't be tabbed to, but they can be activated using accesskeys.
- item = this.findTargetItem( event );
+ if ( event.target.tabIndex === -1 ) {
+ // One of the options got focussed (and the event bubbled up here).
+ // They can't be tabbed to, but they can be activated using accesskeys.
+ // OptionWidgets and focusable UI elements inside them have tabindex="-1" set.
+ item = this.findTargetItem( event );
+ } else {
+ // There is something actually user-focusable in one of the labels of the options, and the
+ // user focussed it (e.g. by tabbing to it). Do nothing (especially, don't change the focus).
+ return;
+ }
}
if ( item ) {
* Handle menu toggle events.
*
* @private
- * @param {boolean} isVisible Menu toggle event
+ * @param {boolean} isVisible Open state of the menu
*/
OO.ui.DropdownWidget.prototype.onMenuToggle = function ( isVisible ) {
this.$element.toggleClass( 'oo-ui-dropdownWidget-open', isVisible );
!this.isDisabled() &&
(
e.which === OO.ui.Keys.ENTER ||
+ (
+ e.which === OO.ui.Keys.SPACE &&
+ // Avoid conflicts with type-to-search, see SelectWidget#onKeyPress.
+ // Space only closes the menu is the user is not typing to search.
+ this.menu.keyPressBuffer === ''
+ ) ||
(
!this.menu.isVisible() &&
(
- e.which === OO.ui.Keys.SPACE ||
e.which === OO.ui.Keys.UP ||
e.which === OO.ui.Keys.DOWN
)
*
* @param {Object} config Configuration options
* @return {string|null}
- * @private
+ * @protected
*/
OO.ui.TextInputWidget.prototype.getSaneType = function ( config ) {
var allowedTypes = [
icon: 'search'
}, config );
- // Set type to text so that TextInputWidget doesn't
- // get stuck in an infinite loop.
- config.type = 'text';
-
// Parent constructor
OO.ui.SearchInputWidget.parent.call( this, config );
} );
// Initialization
- this.$element.addClass( 'oo-ui-textInputWidget-type-search' );
this.updateSearchIndicator();
this.connect( this, {
disable: 'onDisable'
* @inheritdoc
* @protected
*/
-OO.ui.SearchInputWidget.prototype.getInputElement = function () {
- return $( '<input>' ).attr( 'type', 'search' );
+OO.ui.SearchInputWidget.prototype.getSaneType = function () {
+ return 'search';
};
/**
this.menu.connect( this, {
choose: 'onMenuChoose',
add: 'onMenuItemsChange',
- remove: 'onMenuItemsChange'
+ remove: 'onMenuItemsChange',
+ toggle: 'onMenuToggle'
} );
// Initialization
this.$element.toggleClass( 'oo-ui-comboBoxInputWidget-empty', this.menu.isEmpty() );
};
+/**
+ * Handle menu toggle events.
+ *
+ * @private
+ * @param {boolean} isVisible Open state of the menu
+ */
+OO.ui.ComboBoxInputWidget.prototype.onMenuToggle = function ( isVisible ) {
+ this.$element.toggleClass( 'oo-ui-comboBoxInputWidget-open', isVisible );
+};
+
/**
* @inheritdoc
*/