mediawiki-extensions-Visual.../modules/ve-mw/ui/pages/ve.ui.MWParameterPlaceholderPage.js
Thiemo Kreuz ec526ea64f Make "templateParameterClick" event similar to "choose"
The original idea was to make the interface as narrow as
possible. However, it turns out it's better to model the
"templateParameterClick" event more closely after the "choose"
event.

This is split off to make reviewing the following patches
easier.

Change-Id: I271f576c6cd756cecfc6cb1fd64810f8da5c3575
2021-09-10 17:19:19 +02:00

128 lines
3.7 KiB
JavaScript

/*!
* VisualEditor user interface MWParameterPlaceholderPage class.
*
* @copyright 2011-2020 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* MediaWiki transclusion dialog parameter placeholder page.
*
* @class
* @extends OO.ui.PageLayout
*
* @constructor
* @param {ve.dm.MWParameterModel} parameter Reference to a placeholder parameter with an empty
* name, as well as to the template the parameter belongs to
* @param {string} name Unique symbolic name of page
* @param {Object} [config] Configuration options
* @cfg {jQuery} [$overlay] Overlay to render dropdowns in
*/
ve.ui.MWParameterPlaceholderPage = function VeUiMWParameterPlaceholderPage( parameter, name, config ) {
var veConfig = mw.config.get( 'wgVisualEditorConfig' );
// Configuration initialization
config = ve.extendObject( {
scrollable: false
}, config );
// Parent constructor
ve.ui.MWParameterPlaceholderPage.super.call( this, name, config );
// Properties
// TODO: the unique `name` seems to be a relic of when BookletLayout held
// the parameters in separate pages rather than in a StackLayout.
this.name = name;
this.parameter = parameter;
this.template = this.parameter.getTemplate();
this.addParameterSearch = new ve.ui.MWParameterSearchWidget( this.template, {
showAll: !!config.expandedParamList
} )
.connect( this, {
choose: 'onParameterChoose',
showAll: 'onParameterShowAll'
} );
this.addParameterFieldset = new OO.ui.FieldsetLayout( {
label: ve.msg( 'visualeditor-dialog-transclusion-add-param' ),
icon: 'parameter',
classes: [ 've-ui-mwTransclusionDialog-addParameterFieldset' ],
$content: this.addParameterSearch.$element
} );
this.addParameterFieldset.$element.attr( 'aria-label', ve.msg( 'visualeditor-dialog-transclusion-add-param' ) );
// Initialization
this.$element
.addClass( 've-ui-mwParameterPlaceholderPage' )
.append( this.addParameterFieldset.$element );
if ( !veConfig.transclusionDialogNewSidebar ) {
var removeButton = new OO.ui.ButtonWidget( {
framed: false,
icon: 'trash',
title: ve.msg( 'visualeditor-dialog-transclusion-remove-param' ),
flags: [ 'destructive' ],
classes: [ 've-ui-mwTransclusionDialog-removeButton' ]
} )
.connect( this, { click: 'onRemoveButtonClick' } );
this.$element.append( removeButton.$element );
}
};
/* Inheritance */
OO.inheritClass( ve.ui.MWParameterPlaceholderPage, OO.ui.PageLayout );
/* Methods */
/**
* Respond to the parameter search widget showAll event
*
* @fires showAll
*/
ve.ui.MWParameterPlaceholderPage.prototype.onParameterShowAll = function () {
this.emit( 'showAll', this.name );
};
/**
* @inheritdoc
*/
ve.ui.MWParameterPlaceholderPage.prototype.setOutlineItem = function () {
// Parent method
ve.ui.MWParameterPlaceholderPage.super.prototype.setOutlineItem.apply( this, arguments );
if ( this.outlineItem ) {
this.outlineItem
.setIcon( 'parameter' )
.setMovable( false )
.setRemovable( true )
.setLevel( 1 )
.setFlags( [ 'placeholder' ] )
.setLabel( ve.msg( 'visualeditor-dialog-transclusion-add-param' ) );
}
};
ve.ui.MWParameterPlaceholderPage.prototype.onParameterChoose = function ( name ) {
this.addParameterSearch.query.setValue( '' );
if ( !name || this.template.hasParameter( name ) ) {
return;
}
// Note that every parameter is known after it is added
var knownBefore = this.template.getSpec().isKnownParameterOrAlias( name );
var param = new ve.dm.MWParameterModel( this.template, name );
this.template.addParameter( param );
ve.track( 'activity.transclusion', {
action: knownBefore ? 'add-known-parameter' : 'add-unknown-parameter'
} );
};
ve.ui.MWParameterPlaceholderPage.prototype.onRemoveButtonClick = function () {
this.parameter.remove();
};