User:DannyS712/ScriptBuilder.js
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>