Difference between revisions of "MediaWiki:Gadget-2020Cohort.js"

From University Innovation Fellows
Jump to navigation Jump to search
(Updating the profile page creation for 2025)
 
(16 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 +
// <nowiki>
 
$( document ).ready( function (){
 
$( document ).ready( function (){
  
Line 4: Line 5:
 
// Remove the default content
 
// Remove the default content
 
$('#mw-content-text > p').remove();
 
$('#mw-content-text > p').remove();
     $('#firstHeading').text('Create Fellow Page - 2020');
+
     if( mw.config.get("skin") === "minerva" ){
 +
    $('#section_0').text('Create Public Profile - 2025');
 +
    } else {
 +
                $('#firstHeading').text('Create Public Profile - 2025');
 +
        }
  
// Check user login 
+
// Check user login  2
 
     if( mw.config.get("wgUserId") === null){
 
     if( mw.config.get("wgUserId") === null){
 
     $('#mw-content-text').append("You have to login first.");
 
     $('#mw-content-text').append("You have to login first.");
Line 18: Line 23:
 
     // Creating API Object
 
     // Creating API Object
 
     requestAPI = new mw.Api();
 
     requestAPI = new mw.Api();
   
+
 
 +
// API param to get Category:2025 cohort members
 
     catMemberParam = {
 
     catMemberParam = {
 
"action": "query",
 
"action": "query",
 
"format": "json",
 
"format": "json",
 
"list": "categorymembers",
 
"list": "categorymembers",
"cmtitle": "Category:2020 cohort",
+
"cmtitle": "Category:2025 cohort",
 
"cmprop": "title",
 
"cmprop": "title",
 
"cmtype": "subcat",
 
"cmtype": "subcat",
Line 30: Line 36:
  
 
requestAPI.get( catMemberParam, { async: false }  ).done( function(resData){
 
requestAPI.get( catMemberParam, { async: false }  ).done( function(resData){
schoolOptions = [];
+
schoolAndCohortOptions = [];
 
members = resData.query.categorymembers;
 
members = resData.query.categorymembers;
  
 
// Creating MenuItems array from Category Members
 
// Creating MenuItems array from Category Members
 
members.forEach( function(mem){
 
members.forEach( function(mem){
schoolOptions.push(
+
schoolAndCohortOptions.push(
 
new OO.ui.MenuOptionWidget( {
 
new OO.ui.MenuOptionWidget( {
 
data: mem.title.replace("Category:", ""),
 
data: mem.title.replace("Category:", ""),
Line 63: Line 69:
 
        } ),
 
        } ),
 
        schoolAndcohort = new OO.ui.DropdownWidget( {  
 
        schoolAndcohort = new OO.ui.DropdownWidget( {  
            label: 'Select school',
+
            label: 'Select school and Cohort',
 
            menu: {
 
            menu: {
items: schoolOptions
+
items: schoolAndCohortOptions
 
}
 
}
 
        } ),
 
        } ),
Line 88: Line 94:
 
label1 = $('<p>').text('Name:').css('font-weight','bold' ),
 
label1 = $('<p>').text('Name:').css('font-weight','bold' ),
 
label2 = $('<p>').text('School (Cohort):').css('font-weight','bold' ),
 
label2 = $('<p>').text('School (Cohort):').css('font-weight','bold' ),
label3 = $('<p>').text('Image page link:').css('font-weight','bold' ),
+
uploadLink = $("<a>").attr("href", "https://universityinnovation.org/wiki/Special:Upload").attr( "target", "_blank" ).text("Upload"),
 +
label3 = $('<p>').html('Image page link: (' + uploadLink.prop('outerHTML') + ' if did not upload yet!)' ).css('font-weight','bold' ),
 
label4 = $('<p>').text('Majoring in:').css('font-weight','bold' ),
 
label4 = $('<p>').text('Majoring in:').css('font-weight','bold' ),
 
label5 = $('<p>').text('Country:').css('font-weight','bold' ),
 
label5 = $('<p>').text('Country:').css('font-weight','bold' ),
Line 105: Line 112:
 
label1, name.$element,
 
label1, name.$element,
 
label2, schoolAndcohort.$element,
 
label2, schoolAndcohort.$element,
label3, $("<a>").attr("href", "https://universityinnovation.org/wiki/Special:Upload"), image.$element,
+
label3, image.$element,
 
label4, major.$element,
 
label4, major.$element,
 
label5, country.$element,  
 
label5, country.$element,  
Line 120: Line 127:
  
 
// Event handler for Select cohort
 
// Event handler for Select cohort
 +
schoolResp = '';
 
schoolAndcohortResp = '';
 
schoolAndcohortResp = '';
 
schoolAndcohort.getMenu().on('select', function(data){
 
schoolAndcohort.getMenu().on('select', function(data){
 
schoolAndcohortResp = data.getData();
 
schoolAndcohortResp = data.getData();
 +
patternReg = /(.*)\(\d{4}/gim;
 +
schoolResp = patternReg.exec( schoolAndcohortResp )[1].trim();
 
});
 
});
 
 
Line 128: Line 138:
 
createBtn.on( 'click', function() {
 
createBtn.on( 'click', function() {
 
nameResp = name.getValue().trim(),
 
nameResp = name.getValue().trim(),
 +
imageResp = image.getValue().trim(),
 
majorResp = major.getValue().trim();
 
majorResp = major.getValue().trim();
 
countryResp = country.getValue().trim(),
 
countryResp = country.getValue().trim(),
Line 135: Line 146:
 
 
 
// Check whether the all fields are enough to run the function
 
// Check whether the all fields are enough to run the function
if( nameResp !== "" && schoolAndcohortResp !== ""  
+
if( nameResp !== "" && schoolAndcohortResp !== "" && schoolResp !== ""
 
&& majorResp !== "" && countryResp !== "" ) {
 
&& majorResp !== "" && countryResp !== "" ) {
  
 
wikiContent = '{| class="wikitable" style="border: 5px ridge grey; float:right;" \n|-\n|';
 
wikiContent = '{| class="wikitable" style="border: 5px ridge grey; float:right;" \n|-\n|';
wikiContent += "[[File:Oalogo.jpg|300px]]\n|-\n|\n";
+
try {
 +
wikiContent += "[[File:"+ /File:(.+\.\w{3})/i.exec(imageResp)[1] +"|300px]]\n";
 +
}
 +
catch(err) {
 +
wikiContent += "[[File:OOjs UI icon userAvatar.svg|300px]]\n";
 +
}
 +
wikiContent += "|-\n|\n";
 
wikiContent += ";Name: " + nameResp + "\n";
 
wikiContent += ";Name: " + nameResp + "\n";
 
wikiContent += ";School (Cohort): " + schoolAndcohortResp + "\n";
 
wikiContent += ";School (Cohort): " + schoolAndcohortResp + "\n";
Line 146: Line 163:
 
wikiContent += ";Email: [[Special:EmailUser/" + mw.config.get("wgUserName") + "]]\n";
 
wikiContent += ";Email: [[Special:EmailUser/" + mw.config.get("wgUserName") + "]]\n";
 
wikiContent += "|}\n";
 
wikiContent += "|}\n";
wikiContent += "==Bio==\n" + bioResp + "\n";
+
wikiContent += "\n==Bio==\n" + bioResp + "\n";
wikiContent += "==Achievements==\n" + achievementsResp + "\n";
+
wikiContent += "\n==Achievements==\n" + achievementsResp + "\n";
wikiContent += "==Social media profiles==\n" + socialResp + "\n";
+
wikiContent += "\n==Social media profiles==\n" + socialResp + "\n";
wikiContent += "[[Category:" + schoolAndcohortResp + "]]\n";
+
wikiContent += "\n[[Category:" + schoolAndcohortResp + "]]\n";
 
wikiContent += "[[Category:Student Contributors]]\n";
 
wikiContent += "[[Category:Student Contributors]]\n";
 +
wikiContent += "\n{{CatTree|" + schoolResp + "}}\n";
 
 
 
pageTitle = "Fellow:" + nameResp;
 
pageTitle = "Fellow:" + nameResp;
Line 167: Line 185:
 
formatversion: 2,
 
formatversion: 2,
 
action: 'query',
 
action: 'query',
titles: pageTitle + " (" + /\d{4}/.exec( schoolAndcohortResp ) + ")",
+
titles: pageTitle + " (" + /\d{4}/.exec( schoolAndcohortResp.replace("Category:", "") ) + ")",
 
redirects: true
 
redirects: true
 
}, { async: false } ).then( function ( response ) {
 
}, { async: false } ).then( function ( response ) {
 
var page = response.query.pages[ 0 ];
 
var page = response.query.pages[ 0 ];
 
if ( page.missing || page.invalid ) {
 
if ( page.missing || page.invalid ) {
doEdit( pageTitle + " (" + /\d{4}/.exec( schoolAndcohortResp ) + ")", wikiContent );
+
doEdit( pageTitle + " (" + /\d{4}/.exec( schoolAndcohortResp.replace("Category:", "") ) + ")", wikiContent );
 
} else {
 
} else {
pageTitle = pageTitle + " (" + /(^.+)\(/.exec(a)[1].trim() + ", " + /\d{4}/.exec( schoolAndcohortResp ) + ")";
+
pageTitle = pageTitle + " (" + /(^.+)\(/.exec(schoolAndcohortResp.replace("Category:", ""))[1].trim() + ", " + /\d{4}/.exec( schoolAndcohortResp.replace("Category:", "") ) + ")";
 
doEdit( pageTitle, wikiContent );
 
doEdit( pageTitle, wikiContent );
 
}
 
}
Line 197: Line 215:
 
title: title,
 
title: title,
 
text: wikiContent,
 
text: wikiContent,
summary: "Created Fellow Page - 2020",
+
summary: "Created Fellow Page - 2025",
 
format: 'json'
 
format: 'json'
 
};
 
};
Line 203: Line 221:
 
requestAPI.postWithToken( 'csrf', editParams, { async: false } ).done( function ( res ) {
 
requestAPI.postWithToken( 'csrf', editParams, { async: false } ).done( function ( res ) {
 
if( res.edit.result === "Success"){
 
if( res.edit.result === "Success"){
mw.notify( title + " page has created :)");
+
var editUserpage = {
window.location.replace( mw.config.get( 'wgServer' ) + "/wiki/" + title );
+
action: 'edit',
 +
title: 'User:' + mw.config.get("wgUserName"),
 +
text: '#REDIRECT [[' + title + ']]',
 +
summary: "Redirect to Fellow Page",
 +
format: 'json'
 +
};
 +
requestAPI.postWithToken( 'csrf', editUserpage, { async: false } ).done( function ( res ) {
 +
mw.notify( title + " page has created :) and userpage redirected.");
 +
window.location.replace( mw.config.get( 'wgServer' ) + "/wiki/" + title );
 +
}).fail( function(){
 +
mw.notify( title + " page has created :) but userpage redirecction failed.");
 +
window.location.replace( mw.config.get( 'wgServer' ) + "/wiki/" + title );
 +
});
 
} else{
 
} else{
 
mw.notify( "Something went worng :(" );
 
mw.notify( "Something went worng :(" );
Line 212: Line 242:
 
}
 
}
 
 
if ( mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage' && mw.config.get('wgTitle').split('/', 2)[1] === 'CreateFellow2020' ) {
+
if ( mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage' && mw.config.get('wgTitle').split('/', 2)[1] === 'CreatePublicProfile' ) {
 
mw.loader.using( ['oojs-ui-core', 'oojs-ui-widgets', 'mediawiki.api', 'mediawiki.notify'], init );
 
mw.loader.using( ['oojs-ui-core', 'oojs-ui-widgets', 'mediawiki.api', 'mediawiki.notify'], init );
 
}
 
}
 
});
 
});
 +
 +
// </nowiki>

Latest revision as of 04:46, 19 August 2025

// <nowiki>
$( document ).ready( function (){

	function init() {
		// Remove the default content
		$('#mw-content-text > p').remove();
    	if( mw.config.get("skin") === "minerva" ){
    		$('#section_0').text('Create Public Profile - 2025');
    	} else {
                 $('#firstHeading').text('Create Public Profile - 2025');
        }

		// Check user login  	2
    	if( mw.config.get("wgUserId") === null){
    		$('#mw-content-text').append("You have to login first.");
    		return;
    	}
    	
    	// Wait Message
    	var waitMsg = $('<p>').text('Wait, Page is loading.....').css('font-weight','bold' );
    	$('#mw-content-text').append( waitMsg );
    	
    	// Creating API Object
    	requestAPI = new mw.Api();

		// API param to get Category:2025 cohort members 
    	catMemberParam = {
			"action": "query",
			"format": "json",
			"list": "categorymembers",
			"cmtitle": "Category:2025 cohort",
			"cmprop": "title",
			"cmtype": "subcat",
			"cmlimit": "500"
		};

		requestAPI.get( catMemberParam, { async: false }  ).done( function(resData){
			schoolAndCohortOptions = [];
			members = resData.query.categorymembers;

			// Creating MenuItems array from Category Members
			members.forEach( function(mem){
				schoolAndCohortOptions.push(
						new OO.ui.MenuOptionWidget( {
						data: mem.title.replace("Category:", ""),
						label: mem.title.replace("Category:", "")
					} )
				);
			});

			// Create widgets
			var bio = new OO.ui.MultilineTextInputWidget( {
	            	placeholder: 'Bio',
	            	autosize: true, 
	            	rows: 10
	        	} ),
	        	achievements = new OO.ui.MultilineTextInputWidget( {
	            	placeholder: 'Achievements',
	            	autosize: true, 
	            	rows: 10
	        	} ),
	        	social = new OO.ui.MultilineTextInputWidget( {
	            	placeholder: 'Social media profiles',
	            	autosize: true, 
	            	rows: 10
	        	} ),
		        name = new OO.ui.TextInputWidget( { 
		            placeholder: 'Name'
		        } ),
		        schoolAndcohort = new OO.ui.DropdownWidget( { 
		            label: 'Select school and Cohort',
		            menu: {
						items: schoolAndCohortOptions 
					}
		        } ),
		        image = new OO.ui.TextInputWidget( { 
		            placeholder: 'https://universityinnovation.org/wiki/File:ABCD'
		        } ),
		        major = new OO.ui.TextInputWidget( { 
		            placeholder: 'Majoring in'
		        } ),
		        country = new OO.ui.TextInputWidget( { 
		            placeholder: 'Country'
		        } ),
				createBtn = new OO.ui.ButtonWidget( { 
				    label: 'Create Page', 
				    flags: [ 'progressive', 'primary' ]
				} ),
				cancelBtn = new OO.ui.ButtonWidget( {
				    label: 'Cancel',
				    flags: [ 'primary', 'destructive' ],
				    href:  mw.config.get( 'wgServer' )
				} ),
				label1 = $('<p>').text('Name:').css('font-weight','bold' ),
				label2 = $('<p>').text('School (Cohort):').css('font-weight','bold' ),
				uploadLink = $("<a>").attr("href", "https://universityinnovation.org/wiki/Special:Upload").attr( "target", "_blank" ).text("Upload"),
				label3 = $('<p>').html('Image page link: (' + uploadLink.prop('outerHTML') + ' if did not upload yet!)' ).css('font-weight','bold' ),
				label4 = $('<p>').text('Majoring in:').css('font-weight','bold' ),
				label5 = $('<p>').text('Country:').css('font-weight','bold' ),
				label6 = $('<p>').text('Bio:').css('font-weight','bold' ),
				label7 = $('<p>').text('Achievements:').css('font-weight','bold' ),
				label8 = $('<p>').text('Social media profiles:').css('font-weight','bold' ),
				divMainBox = $('<div />').css( {
					'box-shadow': '0 .5rem 1rem rgba(0, 0, 0, .15)',
					'border': '1px solid',
					'padding': '1rem',
					'margin-bottom': '3rem',
					'border-radius': '.5rem'
				});

			divMainBox.append(
				label1, name.$element,
				label2, schoolAndcohort.$element,
				label3, image.$element,
				label4, major.$element,
				label5, country.$element, 
				label6, bio.$element,
				label7, achievements.$element,
				label8, social.$element,
				'<br/>',
				createBtn.$element,
				cancelBtn.$element
			);

			waitMsg.remove();
			$( '#mw-content-text' ).append( divMainBox );

			// Event handler for Select cohort
			schoolResp = '';
			schoolAndcohortResp = '';
			schoolAndcohort.getMenu().on('select', function(data){
				schoolAndcohortResp = data.getData();
				patternReg = /(.*)\(\d{4}/gim;
				schoolResp = patternReg.exec( schoolAndcohortResp )[1].trim();
			});
			
			// Create button click event handler
			createBtn.on( 'click', function() {
				nameResp = name.getValue().trim(),
				imageResp = image.getValue().trim(),
				majorResp = major.getValue().trim();
				countryResp = country.getValue().trim(),
				bioResp = bio.getValue().trim();
				achievementsResp = achievements.getValue().trim(),
				socialResp = social.getValue().trim();
	
				// Check whether the all fields are enough to run the function
				if( nameResp !== "" && schoolAndcohortResp !== "" && schoolResp !== ""
					&& majorResp !== "" && countryResp !== "" ) {

					wikiContent = '{| class="wikitable" style="border: 5px ridge grey; float:right;" \n|-\n|';
					try {
						wikiContent += "[[File:"+ /File:(.+\.\w{3})/i.exec(imageResp)[1] +"|300px]]\n";
					}
					catch(err) {
						wikiContent += "[[File:OOjs UI icon userAvatar.svg|300px]]\n";
					}
					wikiContent += "|-\n|\n";
					wikiContent += ";Name: " + nameResp + "\n";
					wikiContent += ";School (Cohort): " + schoolAndcohortResp + "\n";
					wikiContent += ";Majoring in: " + majorResp + "\n";
					wikiContent += ";Country: " + countryResp + "\n";
					wikiContent += ";Email: [[Special:EmailUser/" + mw.config.get("wgUserName") + "]]\n";
					wikiContent += "|}\n";
					wikiContent += "\n==Bio==\n" + bioResp + "\n";
					wikiContent += "\n==Achievements==\n" + achievementsResp + "\n";
					wikiContent += "\n==Social media profiles==\n" + socialResp + "\n";
					wikiContent += "\n[[Category:" + schoolAndcohortResp + "]]\n";
					wikiContent += "[[Category:Student Contributors]]\n";
					wikiContent += "\n{{CatTree|" + schoolResp + "}}\n";
	
					pageTitle = "Fellow:" + nameResp;
					
					requestAPI.get( {
						formatversion: 2,
						action: 'query',
						titles: pageTitle,
						redirects: true
					}, { async: false } ).then( function ( response ) {
						var page = response.query.pages[ 0 ];
						if ( page.missing || page.invalid ) {
							doEdit( pageTitle, wikiContent );
						} else {
							requestAPI.get( {
								formatversion: 2,
								action: 'query',
								titles: pageTitle + " (" + /\d{4}/.exec( schoolAndcohortResp.replace("Category:", "") ) + ")",
								redirects: true
							}, { async: false } ).then( function ( response ) {
								var page = response.query.pages[ 0 ];
								if ( page.missing || page.invalid ) {
									doEdit( pageTitle + " (" + /\d{4}/.exec( schoolAndcohortResp.replace("Category:", "") ) + ")", wikiContent );
								} else {
									pageTitle = pageTitle + " (" + /(^.+)\(/.exec(schoolAndcohortResp.replace("Category:", ""))[1].trim() + ", " + /\d{4}/.exec( schoolAndcohortResp.replace("Category:", "") ) + ")";
									doEdit( pageTitle, wikiContent );
								}
							});
						}
					} );
				} else {
					mw.notify( "Some fields have no text :( Please fill them." );
					return;
				}
	
	    	});
		}).fail( function(){
			$( '#mw-content-text' ).append( "Something went wront. Please report it to Jay Prakash (User:Jayprakash)." );
		});

    	function doEdit(title, wikiContent){

    		// Edit the page
			var editParams = {
				action: 'edit',
				title: title,
				text: wikiContent,
				summary: "Created Fellow Page - 2025",
				format: 'json'
			};
	
			requestAPI.postWithToken( 'csrf', editParams, { async: false } ).done( function ( res ) {
				if( res.edit.result === "Success"){
					var editUserpage = {
						action: 'edit',
						title: 'User:' + mw.config.get("wgUserName"),
						text: '#REDIRECT [[' + title + ']]',
						summary: "Redirect to Fellow Page",
						format: 'json'
					};
					requestAPI.postWithToken( 'csrf', editUserpage, { async: false } ).done( function ( res ) {
						mw.notify( title + " page has created :) and userpage redirected.");
						window.location.replace( mw.config.get( 'wgServer' ) + "/wiki/" + title );
					}).fail( function(){
						mw.notify( title + " page has created :) but userpage redirecction failed.");
						window.location.replace( mw.config.get( 'wgServer' ) + "/wiki/" + title );
					});
				} else{
					mw.notify( "Something went worng :(" );
				}
			} );
    	}
	}
	
	if ( mw.config.get('wgCanonicalSpecialPageName') === 'Blankpage' && mw.config.get('wgTitle').split('/', 2)[1] === 'CreatePublicProfile' ) {
		mw.loader.using( ['oojs-ui-core', 'oojs-ui-widgets', 'mediawiki.api', 'mediawiki.notify'], init );
	}
});

// </nowiki>