Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
/**
* This script interacts with [[Template:Create]]
* [[Category:Template script pages]]
*/
var TemplateCreate = {
init: function () {
// Add datalist to DOM
$( '.template-create' ).each( function ( index ) {
var $template = $( this );
var $datalist = $( '<datalist id="template-create-suggestions-' + index + '" class="template-create-suggestions"></datalist>' );
$template.append( $datalist );
$template.find( '.mw-ui-input' ).attr( 'list', 'template-create-suggestions-' + index );
} );
// Bind events
$( '.template-create form' ).submit( TemplateCreate.exists );
$( '.template-create .mw-ui-input' ).keyup( TemplateCreate.suggest );
// Focus on the first input that has autofocus
$( '.template-create[data-autofocus]' ).first().find( '.mw-ui-input' ).focus();
},
/**
* Check if the selected title exists
*/
exists: function () {
var $form = $( this );
if ( $form.data( 'valid' ) ) {
var autocreate = $form.closest( '.template-create' ).data( 'autocreate' );
if ( autocreate ) {
return TemplateCreate.create( $form );
} else {
return true;
}
}
var title = $form.find( 'input[name="title"]' ).val().trim();
var prefix = $form.find( 'input[name="prefix"]' ).val().trim();
new mw.Api().get( {
action: 'query',
titles: prefix + title,
prop: 'info',
format: 'json',
formatversion: 2
} ).done( function ( data ) {
var page = data.query.pages[0]; // Unwrap the data
var Title = new mw.Title( page.title );
if ( 'missing' in page ) {
$form.data( 'valid', true ).submit();
} else {
var $template = $form.closest( '.template-create' );
$template.find( '.error' ).remove();
var href = Title.getUrl();
var text = Title.getPrefixedText();
var link = $( '<a>' ).attr( { href: href, target: '_blank' } ).text( page.title ).prop( 'outerHTML' );
var error = link + ' already exists. Please choose another title or edit the page that already exists.';
var $error = $( '<p class="error">' + error + '</p>' );
$template.append( $error );
}
} );
return false;
},
/**
* Create a page in the background and redirect to it
*/
create: function ( $form ) {
var title = $form.find( 'input[name="title"]' ).val().trim();
var prefix = $form.find( 'input[name="prefix"]' ).val().trim();
var preload = $form.find( 'input[name="preload"]' ).val().trim();
if ( preload ) {
new mw.Api().get( {
page: preload,
action: 'parse',
prop: 'wikitext',
formatversion: 2,
} ).done( function ( data ) {
var preloadText = data.parse.wikitext;
new mw.Api().create( prefix + title, {}, preloadText ).done( function () {
var href = mw.util.getUrl( prefix + title );
window.location.href = href;
} );
} );
} else {
new mw.Api().create( prefix + title, {}, '' ).done( function () {
var href = mw.util.getUrl( prefix + title );
window.location.href = href;
} );
}
return false;
},
/**
* Suggest existing titles
*/
suggest: function ( event ) {
var $input = $( this );
var $template = $input.closest( '.template-create' );
var $suggestions = $template.find( '.template-create-suggestions' );
// Little trick to detect clicks on suggestions
// See https://stackoverflow.com/a/65073572/809356
if ( !event.key ) {
$suggestions.empty();
return;
}
var query = $input.val().trim();
if ( !query ) {
return;
}
new mw.Api().get( {
action: 'opensearch',
search: query
} ).done( function ( data ) {
$suggestions.empty();
var titles = data.slice( 1, 2 )[0];
if ( titles.length === 1 ) {
return;
}
titles.forEach( function ( title ) {
var $option = $( '<option>' + title + '</option>' );
$suggestions.append( $option );
} );
} );
}
};
$( TemplateCreate.init );