Start with last item when shift+tabbing into parameter list

Note this implementation introduces some technical debt: It adds a
little bit of knowledge about what "part widgets" and the toolbar are
to the parameter SelectWidget. I think this is acceptable.
A "cleaner" implementation is probably so complicated that we don't
want it in the code, for such a minor benefit. However, alternative
patches are very much welcome.

Bug: T313703
Change-Id: I957698d58a7622cbe54bcc2ba454388ba9f09537
This commit is contained in:
Thiemo Kreuz 2022-07-25 16:19:06 +02:00 committed by Thiemo Kreuz (WMDE)
parent 54d0268847
commit eb71810b6d

View file

@ -169,10 +169,25 @@ ve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.onCheckboxChange = fu
* @inheritDoc OO.ui.SelectWidget
*/
ve.ui.MWTransclusionOutlineParameterSelectWidget.prototype.onFocus = function ( event ) {
if ( event.target === this.$element[ 0 ] && !this.findHighlightedItem() ) {
// When tabbing into the selection list, highlight the first parameter.
this.highlightItem( this.items[ 0 ] );
if ( event.target !== this.$element[ 0 ] || this.findHighlightedItem() ) {
return;
}
var index = 0;
if ( event.relatedTarget ) {
var toolbarClass = 've-ui-mwTransclusionOutlineControlsWidget',
// The only elements below a parameter list can be another part or the toolbar
selector = '.ve-ui-mwTransclusionOutlinePartWidget, .' + toolbarClass,
$fromPart = $( event.relatedTarget ).closest( selector ),
$toPart = $( event.target ).closest( selector );
// When shift+tabbing into the list, highlight the last parameter
// eslint-disable-next-line no-jquery/no-class-state
if ( $fromPart.hasClass( toolbarClass ) || $fromPart.index() > $toPart.index() ) {
index = this.getItemCount() - 1;
}
}
this.highlightItem( this.items[ index ] );
// Don't call the parent. It makes assumptions what should be done here.
};