MediaWiki:Gadget-friendlywelcome.js
Jump to navigation
Jump to search
Note: After saving, 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: Go to Menu → Settings (Opera → Preferences on a Mac) and then to Privacy & security → Clear browsing data → Cached images and files.
//<nowiki>
(function($){
/*
****************************************
*** friendlywelcome.js: Welcome module
****************************************
* Mode of invocation: Tab ("Wel"), or from links on diff pages
* Active on: Existing user talk pages, diff pages
* Config directives in: FriendlyConfig
*/
Twinkle.welcome = function friendlywelcome() {
if( Morebits.queryString.exists( 'friendlywelcome' ) ) {
if( Morebits.queryString.get( 'friendlywelcome' ) === 'auto' ) {
Twinkle.welcome.auto();
} else {
Twinkle.welcome.semiauto();
}
} else {
Twinkle.welcome.normal();
}
};
Twinkle.welcome.auto = function() {
if( Morebits.queryString.get( 'action' ) !== 'edit' ) {
// userpage not empty, aborting auto-welcome
return;
}
Twinkle.welcome.welcomeUser();
};
Twinkle.welcome.semiauto = function() {
Twinkle.welcome.callback( mw.config.get( 'wgTitle' ).split( '/' )[0].replace( /\"/, "\\\"") );
};
Twinkle.welcome.normal = function() {
if( Morebits.queryString.exists( 'diff' ) ) {
// check whether the contributors' talk pages exist yet
var $oList = $("#mw-diff-otitle2").find("span.mw-usertoollinks a.new:contains(talk)").first();
var $nList = $("#mw-diff-ntitle2").find("span.mw-usertoollinks a.new:contains(talk)").first();
if( $oList.length > 0 || $nList.length > 0 ) {
var spanTag = function( color, content ) {
var span = document.createElement( 'span' );
span.style.color = color;
span.appendChild( document.createTextNode( content ) );
return span;
};
var welcomeNode = document.createElement('strong');
var welcomeLink = document.createElement('a');
welcomeLink.appendChild( spanTag( 'Black', '[' ) );
welcomeLink.appendChild( spanTag( 'Goldenrod', 'welcome' ) );
welcomeLink.appendChild( spanTag( 'Black', ']' ) );
welcomeNode.appendChild(welcomeLink);
if( $oList.length > 0 ) {
var oHref = $oList.attr("href");
var oWelcomeNode = welcomeNode.cloneNode( true );
oWelcomeNode.firstChild.setAttribute( 'href', oHref + '&' + Morebits.queryString.create( { 'friendlywelcome': Twinkle.getFriendlyPref('quickWelcomeMode')==='auto'?'auto':'norm' } ) + '&' + Morebits.queryString.create( { 'vanarticle': mw.config.get( 'wgPageName' ).replace(/_/g, ' ') } ) );
$oList[0].parentNode.parentNode.appendChild( document.createTextNode( ' ' ) );
$oList[0].parentNode.parentNode.appendChild( oWelcomeNode );
}
if( $nList.length > 0 ) {
var nHref = $nList.attr("href");
var nWelcomeNode = welcomeNode.cloneNode( true );
nWelcomeNode.firstChild.setAttribute( 'href', nHref + '&' + Morebits.queryString.create( { 'friendlywelcome': Twinkle.getFriendlyPref('quickWelcomeMode')==='auto'?'auto':'norm' } ) + '&' + Morebits.queryString.create( { 'vanarticle': mw.config.get( 'wgPageName' ).replace(/_/g, ' ') } ) );
$nList[0].parentNode.parentNode.appendChild( document.createTextNode( ' ' ) );
$nList[0].parentNode.parentNode.appendChild( nWelcomeNode );
}
}
}
if( mw.config.get( 'wgNamespaceNumber' ) === 3 ) {
var username = mw.config.get( 'wgTitle' ).split( '/' )[0].replace( /\"/, "\\\""); // only first part before any slashes
Twinkle.addPortletLink( function(){ Twinkle.welcome.callback(username); }, "Wel", "friendly-welcome", "Welcome user" );
}
};
Twinkle.welcome.welcomeUser = function welcomeUser() {
Morebits.status.init( document.getElementById('mw-content-text') );
$( '#catlinks' ).remove();
var params = {
value: Twinkle.getFriendlyPref('quickWelcomeTemplate'),
article: Morebits.queryString.exists( 'vanarticle' ) ? Morebits.queryString.get( 'vanarticle' ) : '',
mode: 'auto'
};
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
Morebits.wiki.actionCompleted.notice = "Welcoming complete, reloading talk page in a few seconds";
var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "User talk page modification");
wikipedia_page.setFollowRedirect(true);
wikipedia_page.setCallbackParameters(params);
wikipedia_page.load(Twinkle.welcome.callbacks.main);
};
Twinkle.welcome.callback = function friendlywelcomeCallback( uid ) {
if( uid === mw.config.get('wgUserName') && !confirm( 'Are you really sure you want to welcome yourself?...' ) ){
return;
}
var Window = new Morebits.simpleWindow( 600, 420 );
Window.setTitle( "Welcome user" );
Window.setScriptName( "Twinkle" );
Window.addFooterLink( "Welcoming Committee", "WP:WC" );
Window.addFooterLink( "Twinkle help", "WP:TW/DOC#welcome" );
var form = new Morebits.quickForm( Twinkle.welcome.callback.evaluate );
form.append({
type: 'select',
name: 'type',
label: 'Type of welcome: ',
event: Twinkle.welcome.populateWelcomeList,
list: [
{ type: 'option', value: 'standard', label: 'Standard welcomes', selected: !Morebits.isIPAddress(mw.config.get('wgTitle')) },
]
});
form.append( { type: 'div', id: 'welcomeWorkArea' } );
form.append( {
type: 'input',
name: 'article',
label: '* Linked article (if supported by template):',
value:( Morebits.queryString.exists( 'vanarticle' ) ? Morebits.queryString.get( 'vanarticle' ) : '' ),
tooltip: 'An article might be linked from within the welcome if the template supports it. Leave empty for no article to be linked. Templates that support a linked article are marked with an asterisk.'
} );
var previewlink = document.createElement( 'a' );
$(previewlink).click(function(){
Twinkle.welcome.callbacks.preview(result); // |result| is defined below
});
previewlink.style.cursor = "pointer";
previewlink.textContent = 'Preview';
form.append( { type: 'div', name: 'welcomepreview', label: [ previewlink ] } );
form.append( { type: 'submit' } );
var result = form.render();
Window.setContent( result );
Window.display();
// initialize the welcome list
var evt = document.createEvent( "Event" );
evt.initEvent( 'change', true, true );
result.type.dispatchEvent( evt );
};
Twinkle.welcome.populateWelcomeList = function(e) {
var type = e.target.value;
var $workarea = $(e.target.form).find("div#welcomeWorkArea");
var div = new Morebits.quickForm.element({
type: "div",
id: "welcomeWorkArea"
});
if ((type === "standard" || type === "anonymous") && Twinkle.getFriendlyPref("customWelcomeList").length) {
div.append({ type: 'header', label: 'Custom welcome templates' });
div.append({
type: 'radio',
name: 'template',
list: Twinkle.getFriendlyPref("customWelcomeList"),
event: Twinkle.welcome.selectTemplate
});
}
var appendTemplates = function(list) {
div.append({
type: 'radio',
name: 'template',
list: list.map(function(obj) {
var properties = Twinkle.welcome.templates[obj];
var result = (properties ? {
value: obj,
label: "{{" + obj + "}}: " + properties.description + (properties.linkedArticle ? "\u00A0*" : ""), // U+00A0 NO-BREAK SPACE
tooltip: properties.tooltip // may be undefined
} : {
value: obj,
label: "{{" + obj + "}}"
});
return result;
}),
event: Twinkle.welcome.selectTemplate
});
};
switch (type) {
case "standard":
div.append({ type: 'header', label: 'General welcome templates' });
appendTemplates([
"welcome",
"welcome2",
"welcome-menu"
]);
break;
default:
div.append({ type: 'div', label: 'Twinkle.welcome.populateWelcomeList: something went wrong' });
break;
}
var rendered = div.render();
rendered.className = "quickform-scrollbox";
$workarea.replaceWith(rendered);
var firstRadio = e.target.form.template[0];
firstRadio.checked = true;
Twinkle.welcome.selectTemplate({ target: firstRadio });
};
Twinkle.welcome.selectTemplate = function(e) {
var properties = Twinkle.welcome.templates[e.target.values];
e.target.form.article.disabled = (properties ? !properties.linkedArticle : false);
};
// A list of welcome templates and their properties and syntax
// The four fields that are available are "description", "linkedArticle", "syntax", and "tooltip".
// The three magic words that can be used in the "syntax" field are:
// - $USERNAME$ - replaced by the welcomer's username, depending on user's preferences
// - $ARTICLE$ - replaced by an article name, if "linkedArticle" is true
// - $HEADER$ - adds a level 2 header (most templates already include this)
Twinkle.welcome.templates = {
"welcome": {
description: "standard welcome",
linkedArticle: true,
syntax: "{{subst:welcome|art=$ARTICLE$}}"
},
"welcome2": {
description: "non-graphical welcome",
linkedArticle: true,
syntax: "{{subst:Welcome2|art=$ARTICLE$}}"
},
"welcome-menu": {
description: "menubar-style welcome",
linkedArticle: true,
syntax: "{{subst:Welcome-menu}}"
}
};
Twinkle.welcome.getTemplateWikitext = function(template, article) {
var properties = Twinkle.welcome.templates[template];
if (properties) {
return properties.syntax.
replace("$USERNAME$", Twinkle.getFriendlyPref("insertUsername") ? mw.config.get("wgUserName") : "").
replace("$ARTICLE$", article ? article : "").
replace(/\$HEADER\$\s*/, "== Welcome ==\n\n").
replace("$EXTRA$", ""); // EXTRA is not implemented yet
} else {
return "{{subst:" + template + (article ? ("|art=" + article) : "") + "}}" +
(Twinkle.getFriendlyPref("customWelcomeSignature") ? " ~~~~" : "");
}
};
Twinkle.welcome.callbacks = {
preview: function(form) {
var previewDialog = new Morebits.simpleWindow(750, 400);
previewDialog.setTitle("Welcome template preview");
previewDialog.setScriptName("Welcome user");
previewDialog.setModality(true);
var previewdiv = document.createElement("div");
previewdiv.style.marginLeft = previewdiv.style.marginRight = "0.5em";
previewdiv.style.fontSize = "small";
previewDialog.setContent(previewdiv);
var previewer = new Morebits.wiki.preview(previewdiv);
previewer.beginRender(Twinkle.welcome.getTemplateWikitext(form.getChecked("template"), form.article.value));
var submit = document.createElement("input");
submit.setAttribute("type", "submit");
submit.setAttribute("value", "Close");
previewDialog.addContent(submit);
previewDialog.display();
$(submit).click(function(e) {
previewDialog.close();
});
},
main: function( pageobj ) {
var params = pageobj.getCallbackParameters();
var text = pageobj.getPageText();
// abort if mode is auto and form is not empty
if( pageobj.exists() && params.mode === 'auto' ) {
Morebits.status.info( 'Warning', 'User talk page not empty; aborting automatic welcome' );
Morebits.wiki.actionCompleted.event();
return;
}
var welcomeText = Twinkle.welcome.getTemplateWikitext(params.value, params.article);
if( Twinkle.getFriendlyPref('topWelcomes') ) {
text = welcomeText + '\n\n' + text;
} else {
text += "\n" + welcomeText;
}
var summaryText = "Welcome to The Test Wiki!";
pageobj.setPageText(text);
pageobj.setEditSummary(summaryText + Twinkle.getPref('summaryAd'));
pageobj.setWatchlist(Twinkle.getFriendlyPref('watchWelcomes'));
pageobj.setCreateOption('recreate');
pageobj.save();
}
};
Twinkle.welcome.callback.evaluate = function friendlywelcomeCallbackEvaluate(e) {
var form = e.target;
var params = {
value: form.getChecked("template"),
article: form.article.value,
mode: 'manual'
};
Morebits.simpleWindow.setButtonsEnabled( false );
Morebits.status.init( form );
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
Morebits.wiki.actionCompleted.notice = "Welcoming complete, reloading talk page in a few seconds";
var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "User talk page modification");
wikipedia_page.setFollowRedirect(true);
wikipedia_page.setCallbackParameters(params);
wikipedia_page.load(Twinkle.welcome.callbacks.main);
};
})(jQuery);
//</nowiki>