mediawiki-extensions-Visual.../modules/ve-mw/ui/widgets/ve.ui.MWTransclusionOutlineParameterSelectWidget.js
Thiemo Kreuz 7aeff4bfd3 Move small code snippets into …OutlineParameterSelectWidget
Most notably:
* Move some code snippets from the outer …TemplateWidget to
  the inner …SelectWidget, without introducing new
  dependencies.
* Move all knowledge about the item class
  …OutlineParameterWidget class into …SelectWidget.
* Some more self-documenting method names for event handlers.
* Avoid the somewhat ambiguous variable name "checkbox" in
  favor of "item". That's how it's named in the upstream OOUI
  …SelectWidget.

This is extracted from the following patch Ibd94c39. The
difference is that the following patch adds a new dependency:
The …SelectWidget gets to know the template model. This patch
here contains all changes that are possible without this new
dependency.

Bug: T288827
Change-Id: I187f313c84424b28005d9276cb1356029f9ebb75
2021-08-26 17:30:03 +02:00

159 lines
4.4 KiB
JavaScript

/**
* This is modelled after {@see OO.ui.OutlineSelectWidget}.
*
* @class
* @extends OO.ui.SelectWidget
*
* @constructor
* @param {Object} [config]
*/
ve.ui.MWTransclusionOutlineParameterSelectWidget = function VeUiMWTransclusionOutlineParameterSelectWidget( config ) {
// Parent constructor
ve.ui.MWTransclusionOutlineParameterSelectWidget.super.call( this, ve.extendObject( config, {
multiselect: true
} ) );
// Mixin constructors
OO.ui.mixin.TabIndexedElement.call( this, config );
// Events
this.$element.on( {
focus: this.bindDocumentKeyDownListener.bind( this ),
blur: this.unbindDocumentKeyDownListener.bind( this )
} );
};
/* Inheritance */
OO.inheritClass( ve.ui.MWTransclusionOutlineParameterSelectWidget, OO.ui.SelectWidget );
OO.mixinClass( ve.ui.MWTransclusionOutlineParameterSelectWidget, OO.ui.mixin.TabIndexedElement );
/* Events */
/**
* @event parameterFocused
* @param {string} paramName
*/
/* Static Methods */
/**
* @param {Object} config
* @param {string} config.data Parameter name
* @param {string} config.label
* @param {boolean} [config.required] Required parameters can't be unchecked
* @param {boolean} [config.selected] If the parameter is currently used (checked)
* @return {ve.ui.MWTransclusionOutlineParameterWidget}
*/
ve.ui.MWTransclusionOutlineParameterSelectWidget.static.createItem = function ( config ) {
return new ve.ui.MWTransclusionOutlineParameterWidget( config );
};
/* Methods */
/**
* @inheritDoc OO.ui.mixin.GroupElement
* @param {ve.ui.MWTransclusionOutlineParameterWidget[]} items
* @param {number} [index]
* @return {ve.ui.MWTransclusionOutlineParameterSelectWidget}
*/
ve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.addItems = function ( items, index ) {
var self = this;
items.forEach( function ( item ) {
item.connect( self, {
change: [ 'onCheckboxChange', item ],
parameterFocused: [ 'emit', 'parameterFocused' ]
} );
} );
return ve.ui.MWTransclusionOutlineParameterSelectWidget.super.prototype.addItems.call( this, items, index );
};
/**
* @param {string} paramName
*/
ve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.markParameterAsUnused = function ( paramName ) {
// There is no OO.ui.SelectWidget.unselectItemByData(), we need to do this manually
var item = this.findItemFromData( paramName );
if ( item ) {
item.setSelected( false );
}
};
/**
* @private
* @param {ve.ui.MWTransclusionOutlineParameterWidget} item
* @param {boolean} value
*/
ve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.onCheckboxChange = function ( item, value ) {
// This extra check shouldn't be necessary, but better be safe than sorry
if ( item.isSelected() !== value ) {
// Note: This should have been named `toggle…` as it toggles the item's selection
this.chooseItem( item );
}
};
/**
* @inheritDoc OO.ui.SelectWidget
* @param {jQuery.Event} e
* @fires parameterFocused
*/
ve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.onMouseDown = function ( e ) {
if ( e.which === OO.ui.MouseButtons.LEFT ) {
var item = this.findTargetItem( e );
if ( item && item.isSelected() ) {
this.emit( 'parameterFocused', item.getData() );
// Don't call the parent, i.e. can't click to unselect the item
return false;
}
}
ve.ui.MWTransclusionOutlineParameterSelectWidget.super.prototype.onMouseDown.call( this, e );
};
/**
* @inheritDoc OO.ui.SelectWidget
* @param {KeyboardEvent} e
* @fires choose
* @fires parameterFocused
*/
ve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.onDocumentKeyDown = function ( e ) {
var item;
switch ( e.keyCode ) {
case OO.ui.Keys.HOME:
item = this.items[ 0 ];
if ( item ) {
this.highlightItem( item );
}
break;
case OO.ui.Keys.END:
item = this.items[ this.items.length - 1 ];
if ( item ) {
this.highlightItem( item );
}
break;
case OO.ui.Keys.SPACE:
item = this.findHighlightedItem();
if ( item ) {
// Note: This should have been named `toggle…` as it toggles the item's selection
this.chooseItem( item );
}
e.preventDefault();
break;
case OO.ui.Keys.ENTER:
item = this.findHighlightedItem();
if ( item && item.isSelected() ) {
this.emit( 'parameterFocused', item.getData() );
e.preventDefault();
// Don't call the parent, i.e. can't use enter to unselect the item
return false;
}
break;
}
ve.ui.MWTransclusionOutlineParameterSelectWidget.super.prototype.onDocumentKeyDown.call( this, e );
};