MediaWiki:Gadget-trailblazer-modal.js: Difference between revisions

From RuneRealm Wiki
Jump to navigation Jump to search
Content added Content deleted
(Created page with "→‎* * Interface modal for Trailblazer regions * See also: Gadget-trailblazer-core which initialises this one * * @version 1.1 * @author Elessar2 *: →‎global jQuery, mediaWiki, mw, rswiki, rs, OO, moment, ga: 'use strict'; ;(function($, mw, rs){ var areaChecks, $content, api; // trailblazer regions var tbareas = [ { name:'Misthalin', img:'/images/Misthalin_Area_Badge.png?11111', link:'/w/Trailblazer_Reloaded_League/Areas/Misthalin', id:'misthalin' }, { name:'K...")
(No difference)

Revision as of 00:10, 17 October 2024

/**
* Interface modal for Trailblazer regions
* See also: Gadget-trailblazer-core which initialises this one
*
* @version 1.1
* @author Elessar2
* 
*/

/*global jQuery, mediaWiki, mw, rswiki, rs, OO, moment, ga */
'use strict';

;(function($, mw, rs){
var areaChecks,
	$content,
	api;

// trailblazer regions
var tbareas = [
	{ name:'Misthalin', img:'/images/Misthalin_Area_Badge.png?11111', link:'/w/Trailblazer_Reloaded_League/Areas/Misthalin', id:'misthalin' },
	{ name:'Karamja', img:'/images/Karamja_Area_Badge.png?11111', link:'/w/Trailblazer_Reloaded_League/Areas/Karamja', id:'karamja' },
	{ name:'Asgarnia', img:'/images/Asgarnia_Area_Badge.png?11111', link:'/w/Trailblazer_Reloaded_League/Areas/Asgarnia', id:'asgarnia' },
	{ name:'Desert', img:'/images/Desert_Area_Badge.png?11111', link:'/w/Trailblazer_Reloaded_League/Areas/Kharidian_Desert', id:'desert' },
	{ name:'Fremennik', img:'/images/Fremennik_Area_Badge.png?11111', link:'/w/Trailblazer_Reloaded_League/Areas/Fremennik_Province', id:'fremennik' },
	{ name:'Kandarin', img:'/images/Kandarin_Area_Badge.png?11111', link:'/w/Trailblazer_Reloaded_League/Areas/Kandarin', id:'kandarin' },
	{ name:'Morytania', img:'/images/Morytania_Area_Badge.png?11111', link:'/w/Trailblazer_Reloaded_League/Areas/Morytania', id:'morytania' },
	{ name:'Tirannwn', img:'/images/Tirannwn_Area_Badge.png?11111', link:'/w/Trailblazer_Reloaded_League/Areas/Tirannwn', id:'tirannwn' },
	{ name:'Wilderness', img:'/images/Wilderness_Area_Badge.png?11111', link:'/w/Trailblazer_Reloaded_League/Areas/Wilderness', id:'wilderness' },
	{ name:'Kourend', img:'/images/Kourend_Area_Badge.png?11111', link:'/w/Trailblazer_Reloaded_League/Areas/Kourend', id:'kourend' }
];

// countdown date
var ctdwn = '2024-01-10T11:30:00+00:00';

// Last time (for constant updating)
rswtbz.updatetimer = 0;

/**
 * Close the interface
 * Is a click() event handler
 * @return {undefined}
 */
rswtbz.closeInt = function () {
	// Stop constant update
	clearInterval(rswtbz.updatetimer);
	// Close interface
	window.OOUIWindowManager.closeWindow( 'trailblazerPopup' );
};

/**
 * Initialises the interface (popup and forms)
 * @return {Promise}
 */
rswtbz.initInt = function () {
	return new Promise( function (resolve,reject) {
		mw.log('Initialising Trailblazer modal...');
		api = new mw.Api();

		// setup moment library
		moment.locale('en-events', {
		    relativeTime : {
		    	parentLocale: "en",
		        future: "%s",
		        past:   "%s ago",
		        s:  "secs",
		        m:  "1m",
		        mm: "%dm",
		        h:  "1h",
		        hh: "%dh",
		        d:  "1d",
		        dd: "%dd",
		        M:  "1 month",
		        MM: "%dmths",
		        y:  "1 year",
		        yy: "%dyr"
		    }
		});

		rs.createOOUIWindow('trailblazerPopup', 'Trailblazer Reloaded League', {size: 'large', classes: ['rsw-events-popup']}, rswtbz.initModal).then( function () {
			// Mark interface as initialised
			rswtbz.formMade = true;
			rswtbz.formConst = false;

			resolve();
		});
	} );
};

/**
 * Saves areas unlocked to localStorage
 * @param  {string} id   Name (id) of area to save
 * @param  {boolean} value Area unlocked?
 * @return {boolean} If save was successfull
 */
rswtbz.saveArea = function (id, value) {
	mw.log('Saving area status: ' + id);
	if (value) {
		if (!rswtbz.settings.areas.includes(id)) {
			rswtbz.settings.areas.push(id);
		}
	} else {
		var ind = rswtbz.settings.areas.indexOf(id);
		if (ind > -1) {
			rswtbz.settings.areas.splice(ind, 1);
		}
	}
	mw.log('Unlocked areas:');
	mw.log(rswtbz.settings.areas);

	// Update displays
	rswtbz.updateAreas();

	if (!rs.hasLocalStorage()) {
		console.warn('Browser does not support localStorage');
		return false;
	}

	var string = JSON.stringify(rswtbz.settings);
	try {
		localStorage.setItem(rswtbz.localKey, string);
	} catch (err) {
		console.warn('Error saving presets to localStorage');
		return false;
	}
	return true;
};

/**
 * Generates the events popup
 * @return {undefined}
 */
rswtbz.initModal = function (modal) {
	var closeButton = new OO.ui.ButtonWidget({
		icon: 'close',
		id:'rsw-events-close',
		label: 'Close',
		framed: false
	});
	closeButton.on('click', rswtbz.closeInt);

	areaChecks = {};

	areaChecks.areasel = new OO.ui.CheckboxMultiselectWidget({ classes: ['tb-area-sels'] });
	tbareas.forEach( function(area) {
		var label = '<img title="'+area.name+'" alt="'+area.name+'_Area_Badge.png" src="'+area.img+'" srcset="'+area.img+' 1.5x" data-file-width="20" data-file-height="30" width="20" height="30" draggable="false"> '+area.name
		var externalLink = '<a href="'+area.link+'" class="tbz-external-link" title="'+area.name+' Trailblazer Reloaded League area information" target="_blank">'+area.name+'</a>'
		areaChecks[area.id] = new OO.ui.CheckboxMultioptionWidget({
			label: new OO.ui.HtmlSnippet(label + externalLink),
			data: area.id,
			selected: rswtbz.settings.areas.includes(area.id)
		})

		areaChecks[area.id].on('change', rswtbz.saveArea, [area.id]);

		areaChecks.areasel.addItems([ areaChecks[area.id] ]);
	});

	$content = $('<div>');
	$content
		.addClass('events-popup')
		.append(
			$('<div>')
				.addClass('header')
				.append(
					closeButton.$element,
					$('<h2>')
						.addClass('tb-title')
						.append(
							$('<a>')
								.attr({
									href:'/w/Trailblazer_Reloaded_League',
									title:'Trailblazer Reloaded League',
									target: '_blank'
								})
								.text('Trailblazer Reloaded League')
						)
				),
			$('<div>')
				.addClass('body')
				.append(
					$('<div>')
						.addClass('col col-l')
						.append(
							$('<div>')
								.addClass('areas section')
								.append(
									$('<h3>').append(
										$('<a>')
											.attr({
												href:'/w/Trailblazer_Reloaded_League/Areas',
												title:'Trailblazer Reloaded League Areas',
												target: '_blank'
											})
											.text('Regions unlocked')
									),
									areaChecks.areasel.$element
								)
								
						),
					$('<div>')
						.addClass('col col-r')
						.append(
							$('<div>')
								.addClass('guides section')
								.append(
									$('<h3>').append(
										$('<a>')
											.attr({
												href:'/w/Trailblazer_Reloaded_League/Guide',
												title:'Trailblazer Reloaded League Guide',
												target: '_blank'
											})
											.text('League guides')
									),
									$('<div>')
										.addClass('guide-links')
										.append(
											$('<a>')
												.append(
													$('<img>')
													.attr({
														src:'/images/Quests.png?11111',
														height: '30px'
													})
												)
												.attr({ href:'/w/Trailblazer_Reloaded_League/Guide/Quests', title:'Trailblazer Reloaded League quests guide', target:'_blank' })
												.append('Quests'),
											$('<a>')
												.append(
													$('<img>')
													.attr({
														src:'/images/Trailblazer_Reloaded_League_icon.png?11111',
														height: '30px'
													})
												)
												.attr({ href:'/w/Trailblazer_Reloaded_League/Tasks', title:'Trailblazer Reloaded League tasks', target:'_blank' })
												.append('Tasks'),
											$('<a>')
												.append(
													$('<img>')
													.attr({
														src:'/images/Trailblazer_Reloaded_League_-_%3F_Relic.png?11111',
														height: '30px'
													})
												)
												.attr({ href:'/w/Trailblazer_Reloaded_League/Relics', title:'Trailblazer Reloaded League relics', target:'_blank' })
												.append('Relics')
										)
								),
							$('<div>')
								.addClass('skills section')
								.append(
									$('<h3>').append(
										$('<a>')
											.attr({
												href:'/w/Trailblazer_Reloaded_League/Guide/Skills',
												title:'Trailblazer Reloaded League Skills',
												target: '_blank'
											})
											.text('Skill guides')
									),
									$('<div>')
										.addClass('skill-links')
										.append(
											$('<table>')
											.addClass('wikitable')
											.append(
												$('<tr>')
												.append(
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Stats_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Skills',
															title:'Trailblazer Reloaded League skills',
															target:'_blank'
														})
													),
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Agility_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Agility',
															title:'Trailblazer Reloaded League agility',
															target:'_blank'
														})
													),
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Mining_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Mining',
															title:'Trailblazer Reloaded League Mining',
															target:'_blank'
														})
													)
												),
												$('<tr>')
												.append(
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Melee.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Melee',
															title:'Trailblazer Reloaded League Melee',
															target:'_blank'
														})
													),
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Herblore_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Herblore',
															title:'Trailblazer Reloaded League Herblore',
															target:'_blank'
														})
													),
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Smithing_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Smithing',
															title:'Trailblazer Reloaded League Smithing',
															target:'_blank'
														})
													)
												),
												$('<tr>')
												.append(
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Ranged_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Ranged',
															title:'Trailblazer Reloaded League Ranged',
															target:'_blank'
														})
													),
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Thieving_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Thieving',
															title:'Trailblazer Reloaded League Thieving',
															target:'_blank'
														})
													),
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Fishing_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Fishing',
															title:'Trailblazer Reloaded League Fishing',
															target:'_blank'
														})
													)
												),
												$('<tr>')
												.append(
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Prayer_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Prayer',
															title:'Trailblazer Reloaded League Prayer',
															target:'_blank'
														})
													),
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Crafting_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Crafting',
															title:'Trailblazer Reloaded League Crafting',
															target:'_blank'
														})
													),
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Cooking_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Cooking',
															title:'Trailblazer Reloaded League Cooking',
															target:'_blank'
														})
													)
												),
												$('<tr>')
												.append(
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Magic_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Magic',
															title:'Trailblazer Reloaded League Magic',
															target:'_blank'
														})
													),
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Fletching_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Fletching',
															title:'Trailblazer Reloaded League Fletching',
															target:'_blank'
														})
													),
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Firemaking_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Firemaking',
															title:'Trailblazer Reloaded League Firemaking',
															target:'_blank'
														})
													)
												),
												$('<tr>')
												.append(
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Runecraft_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Runecraft',
															title:'Trailblazer Reloaded League Runecraft',
															target:'_blank'
														})
													),
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Slayer_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Slayer',
															title:'Trailblazer Reloaded League Slayer',
															target:'_blank'
														})
													),
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Woodcutting_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Woodcutting',
															title:'Trailblazer Reloaded League Woodcutting',
															target:'_blank'
														})
													)
												),
												$('<tr>')
												.append(
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Construction_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Construction',
															title:'Trailblazer Reloaded League Construction',
															target:'_blank'
														})
													),
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Hunter_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Hunter',
															title:'Trailblazer Reloaded League Hunter',
															target:'_blank'
														})
													),
													$('<td>').append($('<a>').append($('<img>').attr({
														src:'/images/Farming_icon.png?11111'
														}))
														.attr({
															href:'/w/Trailblazer_Reloaded_League/Guide/Farming',
															title:'Trailblazer Reloaded League Farming',
															target:'_blank'
														})
													)
												)
											)
										)
								)
						)
				),
			$('<div>')
				.addClass('footer')
				.append(
					$('<div>').addClass('footer-padding'),
					$('<div>')
						.addClass('tb-countdown')
						.append(
							$('<label>').text('End countdown'),
							$('<time>').text('')
						),
					$('<div>').addClass('footer-padding'),
					$('<div>')
						.addClass('tb-update')
						.append(
							$('<label>').text('Latest newspost'),
							$('<a>')
								.attr({ href:'#', title:'Loading...' })
								.text('Loading...')
						),
					$('<div>').addClass('footer-padding'),
					$('<div>')
						.addClass('tb-info')
						.append(
							$('<label>').text('Rankings'),
							$('<a>')
								.attr({ href:'https://secure.runescape.com/m=hiscore_oldschool_seasonal/overall', title:'OSRS League Hiscores', target:'_blank', rel:'nofollow noreferrer noopener' })
								.text('OSRS HiScores')
						),
					$('<div>').addClass('footer-padding')
				)
		);
	
	// Create modal
	modal.content = new OO.ui.PanelLayout( { padded: false, expanded: false } );
	modal.content.$element.append( $content );
	modal.$body.append( modal.content.$element );

	$('.oo-ui-windowManager .rsw-events-popup').click(rswtbz.closeInt).children().click(function (e) {
		e.stopPropagation();
	});
};

/**
 * Updates all values (used on opening)
 * @return {undefined}
 */
rswtbz.updateAll = function () {
	rswtbz.updateTimes();
	rswtbz.updateNews();
};

/**
 * Continuously updates the time values in Events dropdown
 * @return {undefined}
 */
rswtbz.updateTimes = function () {
	// Current UTC time
	var now = moment.utc();

	// Update UTC clock
	$content.find('.cur-utc-time')
		.attr({ 'title':now.format('HH:mm D/M/Y'), 'datetime':now.format() })
		.text(now.format('HH:mm') + ' (UTC)');

	// Update coountdown time
	var cntdwn_date = moment(ctdwn);
	$content.find('.tb-countdown time')
		.attr({ 'title':cntdwn_date.format('HH:mm D/M/Y'), 'datetime':cntdwn_date.format() })
		.text( cntdwn_date.from(now) );
};

/**
 * Updates the values that are per day in the Events popup:
 * Current update
 * @return {undefined}
 */
rswtbz.updateNews = function () {
	// Current UTC time
	var now = moment.utc();

	// Update the current update
	var uptitle = "Christmas 2023";
	var uplink = "/w/Update:Christmas_2023";
	var uphover = 'Update:' + uptitle;

	$content.find('.tb-update a').replaceWith( $('<a>')
		.attr({ href:uplink, title:uphover })
		.text( uptitle )
	);
};


}(jQuery, mediaWiki, rswiki));