mediawiki-extensions-Visual.../modules/ve-mw/ui/pages/ve.ui.MWTemplatePage.js
Timo Tijhof fd83cafa4b MWTemplatePage: Account for template.title being null
Example:
* Transclusion with html comment in target
  {{ Unsigned <!-- ignored -->  |Example}}.
* Transclusion with wikitext expression as target
  {{ {{echo|Unsigned}} <!-- ignored -->  |Example}}.

The first case was handled already (Parsoid strips the comment
when it normalises the target title). The second case, however,
is not handled and ends in template.title being null.

This was already documented (MWTemplateModel#getTitle returns
{string|null}), but not used correctly.

The title of the dialog is unaffected as it fallsback to
displaying target.wt instead of target.title.

Bug: 66724
Change-Id: Ib6696ac3538f6cb9e93da2f6f8666f373247eeb4
2014-07-10 13:49:41 +00:00

129 lines
3.5 KiB
JavaScript

/*!
* VisualEditor user interface MWTemplatePage class.
*
* @copyright 2011-2014 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/*global mw */
/**
* MediaWiki transclusion dialog template page.
*
* @class
* @extends OO.ui.PageLayout
*
* @constructor
* @param {ve.dm.MWTemplateModel} parameter Template
* @param {string} name Unique symbolic name of page
* @param {Object} [config] Configuration options
*/
ve.ui.MWTemplatePage = function VeUiMWTemplatePage( template, name, config ) {
var title, titleText;
// Configuration initialization
config = ve.extendObject( {
'scrollable': false
}, config );
// Parent constructor
OO.ui.PageLayout.call( this, name, config );
// Properties
this.template = template;
this.spec = template.getSpec();
this.$more = this.$( '<div>' );
this.$description = this.$( '<div>' );
this.removeButton = new OO.ui.ButtonWidget( {
'$': this.$,
'frameless': true,
'icon': 'remove',
'title': ve.msg( 'visualeditor-dialog-transclusion-remove-template' ),
'flags': ['destructive'],
'classes': [ 've-ui-mwTransclusionDialog-removeButton' ]
} )
.connect( this, { 'click': 'onRemoveButtonClick' } );
this.infoFieldset = new OO.ui.FieldsetLayout( {
'$': this.$,
'label': this.spec.getLabel(),
'icon': 'template'
} );
this.addButton = new OO.ui.ButtonWidget( {
'$': this.$,
'frameless': true,
'icon': 'parameter',
'label': ve.msg( 'visualeditor-dialog-transclusion-add-param' ),
'tabIndex': -1
} )
.connect( this, { 'click': 'onAddButtonClick' } );
// Initialization
this.$description.addClass( 've-ui-mwTemplatePage-description' );
if ( this.spec.getDescription() ) {
this.$description.text( this.spec.getDescription() );
} else {
title = this.template.getTitle();
// The transcluded page may be dynamically generated or unspecified in the DOM
// for other reasons (bug 66724). In that case we can't tell the user what
// the template is called nor link to the template page.
if ( title ) {
title = mw.Title.newFromText( title );
}
if ( title ) {
if ( title.getNamespaceId() === 10 ) {
titleText = title.getMainText();
} else if ( title.getNamespaceId() === 0 ) {
titleText = ':' + title.getPrefixedText();
} else {
titleText = title.getPrefixedText();
}
this.$description
.addClass( 've-ui-mwTemplatePage-description-missing' )
.append( ve.msg(
'visualeditor-dialog-transclusion-no-template-description',
titleText,
ve.getHtmlAttributes( { 'target': '_blank', 'href': title.getUrl() } ),
mw.user
) );
}
}
this.infoFieldset.$element.append( this.$description );
this.$more
.addClass( 've-ui-mwTemplatePage-more' )
.append( this.addButton.$element );
this.$element
.addClass( 've-ui-mwTemplatePage' )
.append( this.infoFieldset.$element, this.removeButton.$element, this.$more );
};
/* Inheritance */
OO.inheritClass( ve.ui.MWTemplatePage, OO.ui.PageLayout );
/* Methods */
/**
* @inheritdoc
*/
ve.ui.MWTemplatePage.prototype.setOutlineItem = function ( outlineItem ) {
// Parent method
OO.ui.PageLayout.prototype.setOutlineItem.call( this, outlineItem );
if ( this.outlineItem ) {
this.outlineItem
.setIcon( 'template' )
.setMovable( true )
.setRemovable( true )
.setLabel( this.spec.getLabel() );
}
};
ve.ui.MWTemplatePage.prototype.onRemoveButtonClick = function () {
this.template.remove();
};
ve.ui.MWTemplatePage.prototype.onAddButtonClick = function () {
this.template.addParameter( new ve.dm.MWParameterModel( this.template ) );
};