Show redirects as part of description in template search

These are the most minimal (and therefor most stable,
hopefully) hacks I could come up with so far.

Bug: T274903
Change-Id: I28ba414dd34aad756e29400eb656f0942291a923
This commit is contained in:
Thiemo Kreuz 2021-05-19 18:51:48 +02:00 committed by Adam Wight
parent d15535b7b6
commit 621bca1df4
4 changed files with 85 additions and 11 deletions

View file

@ -2174,6 +2174,7 @@
],
"messages": [
"quotation-marks",
"redirectedfrom",
"templatedata-doc-subpage",
"visualeditor-changedesc-mwtransclusion",
"visualeditor-dialog-template-title",

View file

@ -1,7 +1,7 @@
( function () {
function enableCirrusSearchLookup( enabled ) {
const config = mw.config.get( 'wgVisualEditorConfig' );
config.cirrusSearchLookup = enabled;
config.cirrusSearchLookup = enabled !== false;
mw.config.set( 'wgVisualEditorConfig', config );
}
@ -29,7 +29,7 @@
} );
QUnit.test( 'CirrusSearch: all API parameters', ( assert ) => {
enableCirrusSearchLookup( true );
enableCirrusSearchLookup();
const widget = new ve.ui.MWTemplateTitleInputWidget(),
query = 'a',
apiParams = widget.getApiParams( query );
@ -39,6 +39,7 @@
generator: 'search',
gsrlimit: 10,
gsrnamespace: 10,
gsrprop: 'redirecttitle',
gsrsearch: 'a*',
ppprop: 'disambiguation',
prop: [ 'info', 'pageprops' ],
@ -46,8 +47,16 @@
} );
} );
QUnit.test( 'CirrusSearch: showRedirectTargets disabled', ( assert ) => {
enableCirrusSearchLookup();
const widget = new ve.ui.MWTemplateTitleInputWidget( { showRedirectTargets: false } ),
apiParams = widget.getApiParams();
assert.notOk( 'gsrprop' in apiParams );
} );
QUnit.test( 'CirrusSearch: prefixsearch behavior', ( assert ) => {
enableCirrusSearchLookup( true );
enableCirrusSearchLookup();
const widget = new ve.ui.MWTemplateTitleInputWidget();
[
@ -77,4 +86,31 @@
);
} );
} );
QUnit.test( 'CirrusSearch: redirect is forwarded to the TitleOptionWidget', ( assert ) => {
enableCirrusSearchLookup();
const widget = new ve.ui.MWTemplateTitleInputWidget(),
originalData = { redirecttitle: 'Template:From' },
data = widget.getOptionWidgetData( 'Template:To', { originalData } );
assert.strictEqual( data.redirecttitle, 'Template:From' );
} );
QUnit.test( 'CirrusSearch: redirect appears in the description', ( assert ) => {
enableCirrusSearchLookup();
const widget = new ve.ui.MWTemplateTitleInputWidget();
let option = widget.createOptionWidget( { redirecttitle: 'Template:From' } );
assert.strictEqual(
option.$element.find( '.ve-ui-mwTemplateTitleInputWidget-redirectedfrom' ).text(),
'(redirectedfrom: From)'
);
widget.relative = false;
option = widget.createOptionWidget( { redirecttitle: 'Template:From' } );
assert.strictEqual(
option.$element.find( '.ve-ui-mwTemplateTitleInputWidget-redirectedfrom' ).text(),
'(redirectedfrom: Template:From)'
);
} );
}() );

View file

@ -46,6 +46,10 @@
font-weight: normal;
}
.ve-ui-mwTemplateTitleInputWidget-redirectedfrom {
font-style: italic;
}
.ve-ui-mwTemplateDialog .oo-ui-outlineOptionWidget.oo-ui-flaggedElement-empty .oo-ui-iconElement-icon {
opacity: 0.51;
}

View file

@ -48,17 +48,22 @@ ve.ui.MWTemplateTitleInputWidget.prototype.getApiParams = function ( query ) {
// TODO: This should stay as a feature flag for 3rd-parties to fallback to prefixsearch
if ( mw.config.get( 'wgVisualEditorConfig' ).cirrusSearchLookup ) {
params.generator = 'search';
params.gsrsearch = params.gpssearch;
ve.extendObject( params, {
generator: 'search',
gsrsearch: params.gpssearch,
// gsrsort: 'incoming_links_desc',
gsrnamespace: params.gpsnamespace,
gsrlimit: params.gpslimit
} );
// Searching for "foo *" is pointless. Don't normalize it to "foo*" either but leave it
// unchanged. This makes the word "foo" behave the same in "foo " and "foo bar". In both
// cases it's not considered a prefix any more.
if ( !/\s$/.test( params.gsrsearch ) ) {
params.gsrsearch += '*';
}
// params.gsrsort = 'incoming_links_desc';
params.gsrnamespace = params.gpsnamespace;
params.gsrlimit = params.gpslimit;
if ( this.showRedirectTargets ) {
params.gsrprop = 'redirecttitle';
}
delete params.gpssearch;
delete params.gpsnamespace;
delete params.gpslimit;
@ -168,10 +173,38 @@ ve.ui.MWTemplateTitleInputWidget.prototype.getLookupRequest = function () {
.promise( { abort: function () {} } );
};
// @inheritdoc mw.widgets.TitleInputWidget
ve.ui.MWTemplateTitleInputWidget.prototype.getOptionWidgetData = function ( title ) {
// @inheritdoc mw.widgets.TitleWidget
ve.ui.MWTemplateTitleInputWidget.prototype.getOptionWidgetData = function ( title, data ) {
return ve.extendObject(
ve.ui.MWTemplateTitleInputWidget.super.prototype.getOptionWidgetData.apply( this, arguments ),
{ description: this.descriptions[ title ] }
{
description: this.descriptions[ title ],
redirecttitle: data.originalData.redirecttitle
}
);
};
// @inheritdoc mw.widgets.TitleWidget
ve.ui.MWTemplateTitleInputWidget.prototype.createOptionWidget = function ( data ) {
var widget = ve.ui.MWTemplateTitleInputWidget.super.prototype.createOptionWidget.call( this, data );
if ( data.redirecttitle ) {
// Same conditions as in mw.widgets.TitleWidget.getOptionWidgetData()
var title = new mw.Title( data.redirecttitle ),
text = this.namespace !== null && this.relative ?
title.getRelativeText( this.namespace ) :
data.redirecttitle;
var $desc = widget.$element.find( '.mw-widget-titleOptionWidget-description' );
if ( !$desc.length ) {
$desc = $( '<span>' )
.addClass( 'mw-widget-titleOptionWidget-description' )
.appendTo( widget.$element );
}
$desc.prepend( $( '<div>' )
.addClass( 've-ui-mwTemplateTitleInputWidget-redirectedfrom' )
.text( mw.msg( 'redirectedfrom', text ) ) );
}
return widget;
};