মিডিয়াউইকি:Gadget-Adiutor-UBM.js

লক্ষ্য করুন: প্রকাশ করার পর, পরিবর্তনগুলো দেখতে আপনাকে আপনার ব্রাউজারের ক্যাশে পরিষ্কার করার প্রয়োজন হতে পারে।

  • ফায়ারফক্স / সাফারি: পুনরায় লোড-এ ক্লিক করার সময় শিফট টিপে ধরে রাখুন, অথবা হয় Ctrl-F5 বা Ctrl-R টিপুন (ম্যাকে ⌘-R টিপুন)
  • গুগল ক্রোম: Ctrl-Shift-R (ম্যাকে ⌘-Shift-R) টিপুন
  • ইন্টারনেট এক্সপ্লোরার / এজ: Ctrl ধরে রাখা অবস্থায় Refresh-এ ক্লিক করুন, অথবা Ctrl-F5 টিপুন
  • অপেরা: Ctrl-F5 টিপুন।
/* Adiutor: Enhancing Wikipedia Editing Through a Comprehensive Set of Versatile Tools and Modules.
 * Author: Vikipolimer
 * Learn more at: https://meta.wikimedia.org/wiki/Adiutor
 * License: Licensed under Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
<nowiki> */
var api = new mw.Api();
var mwConfig = mw.config.get(["wgAction", "wgPageName", "wgTitle", "wgUserName"]);
var wikiId = mw.config.get('wgWikiID');
var adiutorUserOptions = JSON.parse(mw.user.options.get('userjs-adiutor-' + wikiId));
var duration;
var reason;
var blockReason;
var additionalReason = '';
var preventAccountCreationValue;
var preventEmailSendingValue;
var preventEditOwnTalkPageValue;

function fetchApiData(callback) {
	
	api.get({
		action: "query",
		prop: "revisions",
		titles: "MediaWiki:Gadget-Adiutor-UBM.json",
		rvprop: "content",
		formatversion: 2
	}).done(function(data) {
		var content = data.query.pages[0].revisions[0].content;
		try {
			var jsonData = JSON.parse(content);
			callback(jsonData);
		} catch(error) {
			// Handle JSON parsing error
			mw.notify('Failed to parse JSON data from API.', {
				title: mw.msg('operation-failed'),
				type: 'error'
			});
		}
	}).fail(function() {
		// Handle API request failure
		mw.notify('Failed to fetch data from the API.', {
			title: mw.msg('operation-failed'),
			type: 'error'
		});
		// You may choose to stop code execution here
	});
}
fetchApiData(function(jsonData) {
	if(!jsonData) {
		// Handle a case where jsonData is empty or undefined
		mw.notify('MediaWiki:Gadget-Adiutor-UBM.json data is empty or undefined.', {
			title: mw.msg('operation-failed'),
			type: 'error'
		});
		// You may choose to stop code execution here
		return;
	}
	var blockDurations = jsonData.blockDurations;
	var blockReasons = jsonData.blockReasons;
	var userPagePrefix = jsonData.userPagePrefix;
	var userTalkPagePrefix = jsonData.userTalkPagePrefix;
	var specialContibutions = jsonData.specialContibutions;
	var noticeBoardTitle = jsonData.noticeBoardTitle;
	var apiPostSummary = jsonData.apiPostSummary;
	var userToBlock = window.adiutorUserToBlock;
	var headlineElement = window.headlineElement;
	var sectionId = window.sectionId;
	if(!userToBlock) {
		userToBlock = getFormattedPageName();
	}

	function userBlockDialog(config) {
		userBlockDialog.super.call(this, config);
	}
	OO.inheritClass(userBlockDialog, OO.ui.ProcessDialog);
	userBlockDialog.static.title = mw.msg('user-blocking') + ' ' + '('+userToBlock+')',
		userBlockDialog.static.name = 'userBlockDialog';
	userBlockDialog.static.actions = [{
		action: 'continue',
		modes: 'edit',
		label: new OO.ui.deferMsg('block'),
		flags: ['primary', 'destructive']
	}, {
		action: 'about',
		modes: 'edit',
		label: 'Adiutor',
	}, {
		modes: 'edit',
		label: new OO.ui.deferMsg('cancel'),
		flags: 'safe'
	}, {
		action: 'back',
		modes: 'help',
		label: new OO.ui.deferMsg('back'),
		flags: 'safe'
	}];
	userBlockDialog.prototype.initialize = function() {
		userBlockDialog.super.prototype.initialize.apply(this, arguments);
		this.userBlockPanel = new OO.ui.PanelLayout({
			padded: true,
			expanded: false
		});
		var durationDropdown = new OO.ui.DropdownWidget({
			menu: {
				items: blockDurations.map(function(duration) {
					return new OO.ui.MenuOptionWidget({
						data: duration.data,
						label: duration.label
					});
				})
			},
			label: mw.message('choose-duration').text(),
		});
		durationDropdown.on('change', function(value) {
			console.log('Dropdown changed:', value);
			duration = value;
		});
		// Create an input field for the block reason
		var reasonInput = new OO.ui.MultilineTextInputWidget({
			placeholder: mw.message('please-choose-block-rationale').text()
		});
		var reasonDropdown = new OO.ui.DropdownWidget({
			menu: {
				items: blockReasons.map(function(reason) {
					return new OO.ui.MenuOptionWidget({
						data: reason.data,
						label: reason.label
					});
				})
			},
			label: mw.message('choose-reason').text()
		});
		durationDropdown.getMenu().on('choose', function(menuOption) {
			duration = menuOption.data;
		});
		reasonDropdown.getMenu().on('choose', function(menuOption) {
			blockReason = menuOption.data;
		});
		reasonInput.on('change', function() {
			additionalReason = ' | ' + mw.msg('additional-rationale') + ': ' + reasonInput.value;
		});
		// Create a fieldset to group the widgets
		var fieldset = new OO.ui.FieldsetLayout({});
		// Create checkboxes for additional block options
		var preventAccountCreationCheckbox = new OO.ui.CheckboxInputWidget({
				selected: true
			}),
			preventEmailSendingCheckbox = new OO.ui.CheckboxInputWidget({
				selected: false
			}),
			preventEditOwnTalkPageCheckbox = new OO.ui.CheckboxInputWidget({
				selected: false
			}),
			// Create a fieldset layout with fields for each checkbox.
			additionalOptionsFieldset = new OO.ui.FieldsetLayout({
				label: mw.message('additional-options').text(),
				padded: true // Add padding
			});
		additionalOptionsFieldset.$element.addClass('additional-options-fieldset'); // Add a CSS class
		additionalOptionsFieldset.$element.css({
			"margin-top": "20px",
		});
		additionalOptionsFieldset.addItems([
			new OO.ui.FieldLayout(preventAccountCreationCheckbox, {
				label: mw.message('prevent-account-creation').text(),
				align: 'inline'
			}),
			new OO.ui.FieldLayout(preventEmailSendingCheckbox, {
				label: mw.message('prevent-sending-email').text(),
				align: 'inline'
			}),
			new OO.ui.FieldLayout(preventEditOwnTalkPageCheckbox, {
				label: mw.message('prevent-editing-own-talk-page').text(),
				align: 'inline'
			}),
		]);
		preventAccountCreationCheckbox.on('change', function(selected) {
			preventAccountCreationValue = selected;
		});
		preventEmailSendingCheckbox.on('change', function(selected) {
			preventEmailSendingValue = selected;
		});
		preventEditOwnTalkPageCheckbox.on('change', function(selected) {
			preventEditOwnTalkPageValue = selected;
		});
		// Add additional options fieldset to the main fieldset
		fieldset.addItems([
			new OO.ui.FieldLayout(durationDropdown, {
				label: mw.message('block-duration').text(),
			}),
			new OO.ui.FieldLayout(reasonDropdown, {
				label: mw.message('block-reason').text(),
			}),
			new OO.ui.FieldLayout(reasonInput, {
				label: mw.message('other-reason').text(),
				align: 'inline'
			}),
			additionalOptionsFieldset
		]);
		// Append fieldset to the document body
		this.userBlockPanel.$element.append(fieldset.$element);
		this.userBlockStackLayout = new OO.ui.StackLayout({
			items: [this.userBlockPanel]
		});
		preventAccountCreationValue = preventAccountCreationCheckbox.isSelected();
		preventEmailSendingValue = preventEmailSendingCheckbox.isSelected();
		preventEditOwnTalkPageValue = preventEditOwnTalkPageCheckbox.isSelected();
		this.$body.append(this.userBlockStackLayout.$element);
	};
	userBlockDialog.prototype.getSetupProcess = function(data) {
		return userBlockDialog.super.prototype.getSetupProcess.call(this, data).next(function() {
			this.actions.setMode('edit');
		}, this);
	};
	userBlockDialog.prototype.getActionProcess = function(action) {
		if(action === 'about') {
			window.open('https://meta.wikimedia.org/wiki/Adiutor', '_blank');
		} else if(action === 'continue') {
			var BlockingDialog = this;
			return new OO.ui.Process(function() {
				function CheckDurationAndRationaleMessageDialog(config) {
					CheckDurationAndRationaleMessageDialog.super.call(this, config);
				}
				if(userToBlock.includes(mwConfig.wgUserName)) {
					mw.notify(mw.message('you-can-not-block-yourself').text(), {
						title: mw.msg('operation-completed'),
						type: 'error'
					});
					BlockingDialog.close();
				} else {
					if(!duration || !blockReason) {
						OO.inheritClass(CheckDurationAndRationaleMessageDialog, OO.ui.MessageDialog);
						CheckDurationAndRationaleMessageDialog.static.name = 'myCheckDurationAndRationaleMessageDialog';
						CheckDurationAndRationaleMessageDialog.static.actions = [{
							action: 'okay',
							label: mw.message('okay').text(),
							flags: 'primary'
						}, ];
						CheckDurationAndRationaleMessageDialog.prototype.initialize = function() {
							CheckDurationAndRationaleMessageDialog.super.prototype.initialize.apply(this, arguments);
							this.content = new OO.ui.PanelLayout({
								padded: true
							});
							this.content.$element.append(mw.message('please-select-block-duration-reason').text());
							this.$body.append(this.content.$element);
						};
						CheckDurationAndRationaleMessageDialog.prototype.getBodyHeight = function() {
							return 100;
						};
						CheckDurationAndRationaleMessageDialog.prototype.getActionProcess = function(action) {
							var WarningDialog = this;
							if(action === 'okay') {
								WarningDialog.close();
							}
							return CheckDurationAndRationaleMessageDialog.super.prototype.getActionProcess.call(this, action);
						};
						var windowManager = new OO.ui.WindowManager();
						$(document.body).append(windowManager.$element);
						var WarningDialog = new CheckDurationAndRationaleMessageDialog();
						windowManager.addWindows([WarningDialog]);
						windowManager.openWindow(WarningDialog);
						return;
					} else {
						var allowusertalkValue = !preventEditOwnTalkPageValue;
						// API request parameters
						var params = {
							action: 'block',
							user: userToBlock,
							expiry: duration,
							reason: blockReason + additionalReason,
							nocreate: preventAccountCreationValue,
							allowusertalk: allowusertalkValue,
							noemail: preventEmailSendingValue,
							tags: 'Adiutor'
						};
						// Send API request
						api.postWithToken('csrf', params).done(function(result) {
							mw.notify(mw.msg('user-blocked'), {
								title: mw.msg('operation-completed'),
								type: 'success'
							});
							if(sectionId) {
								api.postWithToken('csrf', {
									action: 'edit',
									title: noticeBoardTitle,
									section: sectionId,
									text: '',
									summary: apiPostSummary,
									tags: 'Adiutor',
									format: 'json'
								}).done(function() {
									if(headlineElement) {
										headlineElement.css('text-decoration', 'line-through');
									}
								});
							}
						}).fail(function(error) {
							mw.notify(error, {
								title: mw.msg('operation-failed'),
								type: 'error'
							});
						});
						console.log(userToBlock);
						BlockingDialog.close();
					}
				}
			});
		}
		return userBlockDialog.super.prototype.getActionProcess.call(this, action);
	};
	userBlockDialog.prototype.getBodyHeight = function() {
		return this.userBlockPanel.$element.outerHeight(true);
	};
	var windowManager = new OO.ui.WindowManager();
	$(document.body).append(windowManager.$element);
	var BlockingDialog = new userBlockDialog({
		size: 'medium'
	});
	windowManager.addWindows([BlockingDialog]);
	windowManager.openWindow(BlockingDialog);

	function getFormattedPageName() {
		var cleanedPageName = mwConfig.wgPageName.replace(/_/g, " ").replace(userPagePrefix, '').replace(specialContibutions, '').replace(userTalkPagePrefix, '');
		return cleanedPageName;
	}
});
/* </nowiki> */