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 );
Cookies help us deliver our services. By using our services, you agree to our use of cookies.