User:DannyS712/ScriptBuilder.js

From Meta, a Wikimedia project coordination wiki

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.
// <nowiki>
// Quick script to quickly create a new script
// @author DannyS712
$(() => {
const ScriptBuilder = {};
window.ScriptBuilder = ScriptBuilder;

ScriptBuilder.init = function () {
	window.document.title = 'ScriptBuilder';
	$( '#firstHeading' ).text( 'ScriptBuilder' );
	mw.loader.using(
		[ 'mediawiki.util', 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows' ],
		ScriptBuilder.run
	);
};

ScriptBuilder.run = function () {
	// TODO add dependencies
	var inputs = {
		scriptShortName: 'Script short name, used for subpage title and variable naming; must not contain spaces',
		scriptTitle: 'Title to show in tab and heading',
		sidebarText: 'Text for the portlet link to the page',
		introText: 'Introductory text for the top of the script form',
		descriptionText: 'For a comment at the top, starting with "Quick script to"',
		submitText: 'Text for the submit button'
	};
	var widgets = {};
	var fieldSetItems = [];
	Object.keys( inputs ).forEach( function ( inputName ) {
		var inputLabelText = inputs[ inputName ];
		widgets[ inputName ] = new OO.ui.TextInputWidget( {} );
		var inputLayout = new OO.ui.FieldLayout(
			widgets[ inputName ],
			{ label: inputLabelText }
		);
		fieldSetItems.push( inputLayout );
	} );

	var submit = new OO.ui.ButtonInputWidget( { 
		label: 'Generate',
		flags: [ 'primary', 'progressive' ]
	} );
	fieldSetItems.push( new OO.ui.FieldLayout( submit ) );
	
	submit.on( 'click', function () {
		console.log( widgets );
		var submittedValues = {};
		Object.keys( inputs ).forEach( function ( inputName ) {
			submittedValues[ inputName ] = widgets[ inputName ].value;
		} );
		console.log( submittedValues );
		ScriptBuilder.onSubmit( submittedValues );
	} );
	$( window ).on( 'keypress', function ( e ) {
		// press enter to start
		if ( e.which == 13 ) {
			submit.simulateLabelClick();
		}
	} );
	
	var fieldSet = new OO.ui.FieldsetLayout( { 
		label: 'Generate a new script'
	} );
	fieldSet.addItems( fieldSetItems );

	var $results = $( '<div>' )
		.attr( 'id', 'ScriptBuilder-results' );
	$( '#mw-content-text' ).empty().append(
		fieldSet.$element,
		$( '<hr>' ),
		$results
	);
};

ScriptBuilder.onSubmit = function ( inputs ) {
	var $res = $( '#ScriptBuilder-results' );
	$res.empty().append(
		$( '<p>' ).attr( 'id', 'ScriptBuilder-link-wrapper' ),
		$( '<pre>' ).attr( 'id', 'ScriptBuilder-generated' )
	);
	console.log( inputs );
	var result = ScriptBuilder.template;
	
	// Use regex with /g for global replacements
	result = result.replace( /%%SHORTNAME%%/g, inputs.scriptShortName );
	result = result.replace( /%%TITLE%%/g, inputs.scriptTitle );
	result = result.replace( /%%SIDEBARTEXT%%/g, inputs.sidebarText );
	result = result.replace( /%%INTROTEXT%%/g, inputs.introText );
	result = result.replace( /%%DESCRIPTION%%/g, inputs.descriptionText );
	result = result.replace( /%%SUBMITTEXT%%/g, inputs.submitText );
	
	// Can't include the closing nowiki in the template, so we don't include
	// the opening either
	result = "// <nowiki>\n" + result + "\n// </" + "nowiki>";
	$( '#ScriptBuilder-generated' ).text( result );
	
	// Link to create
	// Can't use preloadparams[] in js? Bug... T270542
	var linkUrl = mw.util.getUrl(
		'User:' + mw.config.get( 'wgUserName' ) + '/' + inputs.scriptShortName + '.js',
		{
			action: 'edit',
			summary: 'Starting new script with preload'
		}
	);
	$( '#ScriptBuilder-link-wrapper' ).append(
		$( '<a>' )
			.attr( 'href', linkUrl )
			.attr( 'target', '_blank' )
			.text( 'Start new script' ),
		' (need to copy the actual script)',
		$( '<br>' )
	);
};

ScriptBuilder.template = `// Quick script to %%DESCRIPTION%%
// @author DannyS712
$(() => {
const %%SHORTNAME%% = {};
window.%%SHORTNAME%% = %%SHORTNAME%%;

%%SHORTNAME%%.init = function () {
	window.document.title = '%%TITLE%%';
	$( '#firstHeading' ).text( '%%TITLE%%' );
	mw.loader.using(
		[ 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows' ],
		%%SHORTNAME%%.run
	);
};

// REMOVE THIS IF NOT USING THE API
%%SHORTNAME%%.onErrHandler = function () {
	// Shared error handler
	alert( 'Something went wrong' );
	console.log( arguments );
};

%%SHORTNAME%%.run = function () {
	// PUT YOUR WIDGETS HERE
	
	var submit = new OO.ui.ButtonInputWidget( { 
		label: '%%SUBMITTEXT%%',
		flags: [ 'primary', 'progressive' ]
	} );
	submit.on( 'click', function () {
		// CONVERT YOUR WIDGETS TO INPUT
		var submittedValues = {};
		console.log( submittedValues );
		%%SHORTNAME%%.onSubmit( submittedValues );
	} );
	$( window ).on( 'keypress', function ( e ) {
		// press enter to start
		if ( e.which == 13 ) {
			submit.simulateLabelClick();
		}
	} );
	
	var fieldSet = new OO.ui.FieldsetLayout( { 
		label: '%%INTROTEXT%%'
	} );
	
	fieldSet.addItems( [
		// YOUR LAYOUTS
		new OO.ui.FieldLayout( submit )
	] );

	var $results = $( '<div>' )
		.attr( 'id', '%%SHORTNAME%%-results' );
	$( '#mw-content-text' ).empty().append(
		fieldSet.$element,
		$( '<hr>' ),
		$results
	);
};

%%SHORTNAME%%.onSubmit = function ( inputs ) {
	var $res = $( '#%%SHORTNAME%%-results' );
	$res.empty();
	console.log( inputs );
};

});

$( document ).ready( () => {
	mw.loader.using(
		[ 'mediawiki.util' ],
		function () {
			mw.util.addPortletLink(
				'p-tb',
				'/wiki/Special:BlankPage/%%SHORTNAME%%',
				'%%SIDEBARTEXT%%'
			);
		}
	);
	if ( mw.config.get( 'wgNamespaceNumber' ) === -1 ) {
		const page = mw.config.get( 'wgCanonicalSpecialPageName' );
		if ( page === 'Blankpage' ) {
			const page2 = mw.config.get( 'wgTitle' ).split( '/' );
			if ( page2[1] && page2[1] === '%%SHORTNAME%%' ) {
				window.%%SHORTNAME%%.init();
			}
		}
	}
});
`;

});

$( document ).ready( () => {
	mw.loader.using(
		[ 'mediawiki.util' ],
		function () {
			mw.util.addPortletLink(
				'p-tb',
				'/wiki/Special:BlankPage/ScriptBuilder',
				'ScriptBuilder'
			);
		}
	);
	if ( mw.config.get( 'wgNamespaceNumber' ) === -1 ) {
		const page = mw.config.get( 'wgCanonicalSpecialPageName' );
		if ( page === 'Blankpage' ) {
			const page2 = mw.config.get( 'wgTitle' ).split( '/' );
			if ( page2[1] && page2[1] === 'ScriptBuilder' ) {
				window.ScriptBuilder.init();
			}
		}
	}
});
// </nowiki>