মিডিয়াউইকি:Gadget-Adiutor-TAG.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 wikiId = mw.config.get('wgWikiID');
var adiutorUserOptions = JSON.parse(mw.user.options.get('userjs-adiutor-' + wikiId));
var tagOptions = [];
var selectedTags = [];
var templateInfo = {};
var preparedTemplates = [];
var preparedTagsString;

function fetchApiData(callback) {

	api.get({
		action: "query",
		prop: "revisions",
		titles: "MediaWiki:Gadget-Adiutor-TAG.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 tagList = jsonData.tagList;
	var useMultipleIssuesTemplate = jsonData.useMultipleIssuesTemplate;
	var multipleIssuesTemplate = jsonData.multipleIssuesTemplate;
	var uncategorizedTemplate = jsonData.uncategorizedTemplate;
	var apiPostSummary = jsonData.apiPostSummary;

	function PageTaggingDialog(config) {
		PageTaggingDialog.super.call(this, config);
	}
	OO.inheritClass(PageTaggingDialog, OO.ui.ProcessDialog);
	PageTaggingDialog.static.name = 'PageTaggingDialog';
	PageTaggingDialog.static.title = new OO.ui.deferMsg('tag-module-title');
	PageTaggingDialog.static.actions = [{
		action: 'save',
		label: new OO.ui.deferMsg('add-tag'),
		flags: ['primary', 'progressive']
	}, {
		label: new OO.ui.deferMsg('cancel'),
		flags: 'safe'
	}];
	PageTaggingDialog.prototype.initialize = function() {
		PageTaggingDialog.super.prototype.initialize.apply(this, arguments);
		var headerTitle = new OO.ui.MessageWidget({
			type: 'notice',
			inline: true,
			label: new OO.ui.deferMsg('tag-header-description')
		});
		// Create a search input field
		var searchInput = new OO.ui.TextInputWidget({
			placeholder: mw.msg('search-tag')
		});
		searchInput.$element.css({
			'margin-top': '10px',
			'margin-bottom': '15px',
		});
		this.content = new OO.ui.PanelLayout({
			padded: true,
			expanded: false,
		});
		// Now you can safely add the searchInput to the content container
		this.content.$element.append(headerTitle.$element, searchInput.$element);
		// Iterate through the tagList
		tagList.forEach(function(tagGroup) {
			// Create a div element for the label
			var labelElement = new OO.ui.LabelWidget({
				label: tagGroup.label,
			});
			labelElement.$element.css({
				'margin-top': '10px',
				'margin-bottom': '15px',
				'font-weight': '900',
			});
			// Append the labelElement to the content container
			this.content.$element.append(labelElement.$element);
			// Create an array to hold tag options
			var tagOptions = [];
			// Iterate through the tags in the current tagGroup
			tagGroup.tags.forEach(function(tag) {
				// Create a CheckboxMultioptionWidget for the tag
				var tagOption = new OO.ui.CheckboxMultioptionWidget({
					data: tag.tag,
					name: tag.name,
					label: tag.description,
					align: 'inline'
				});
				tagOption.on('change', function(selected) {
					updateSelectedTags(selected, tag);
				});
				// Check if the tag has additional items
				if(tag.items) {
					// Create a fieldset to contain the sub-items
					var subItemsLayout = new OO.ui.HorizontalLayout();
					subItemsLayout.$element.css('display', 'none');
					// Iterate through the sub-items
					tag.items.forEach(function(subItem) {
						// Create sub-item widgets based on the sub-item properties
						if(subItem.type === 'input') {
							var subItemInput = new OO.ui.TextInputWidget({
								label: subItem.label,
								name: subItem.name,
								required: subItem.required || false,
							});
							subItemsLayout.addItems([subItemInput]);
						}
						if(subItem.type === 'checkbox') {
							var subItemCheckbox = new OO.ui.CheckboxMultioptionWidget({
								data: subItem.value,
								name: subItem.name,
								label: subItem.label,
							});
							subItemCheckbox.on('change', function(selected) {
								updateSelectedTags(selected, tag);
							});
							subItemsLayout.addItems([subItemCheckbox]);
						}
						// Check if there are items under the subItem
						if(subItem.items) {
							// Iterate through the subItem items
							subItem.items.forEach(function(subItemItem) {
								// Create widgets for subItem items
								if(subItemItem.type === 'input') {
									var subItemItemInput = new OO.ui.TextInputWidget({
										label: subItemItem.label,
										name: subItemItem.name,
										required: subItemItem.required || false,
										align: 'inline',
									});
									subItemsLayout.addItems([subItemItemInput]);
								}
								if(subItemItem.type === 'checkbox') {
									var subItemItemCheckbox = new OO.ui.CheckboxMultioptionWidget({
										data: subItemItem.value,
										name: subItemItem.name,
										label: subItemItem.label,
										align: 'inline',
									});
									subItemItemCheckbox.on('change', function(selected) {
										updateSelectedTags(selected, tag);
									});
									subItemItemCheckbox.$element.css('margin-left', '30px');
									subItemsLayout.addItems([subItemItemCheckbox]);
								}
								// Add other sub-item item types as needed
							});
						}
					});
					// Add an event handler to show/hide sub-items when the parent checkbox is selected/unselected
					tagOption.on('change', function(selected) {
						if(selected) {
							subItemsLayout.$element.show();
						} else {
							subItemsLayout.$element.hide();
						}
					});
					// Append the sub-items fieldset to the tagOption
					tagOption.$element.append(subItemsLayout.$element);
					subItemsLayout.$element.css('margin-top', '10px');
				}
				// Add the tagOption to the tagOptions array
				tagOptions.push(tagOption);
				// Append the tagOption to the content container
				this.content.$element.append(tagOption.$element);
				tagOption.$element.css('display', 'block');
			}, this);
		}, this);
		// After populating the tagOptions array, add the following code within the tagList.forEach loop:
		searchInput.on('input', function() {
			var searchText = searchInput.getValue().toLowerCase();
			// Iterate through all tagOptions and check if the search text is present in label or data
			tagOptions.forEach(function(tagOption) {
				var label = tagOption.label.toLowerCase();
				var data = tagOption.data ? tagOption.data.toLowerCase() : ''; // Ensure data exists and convert to lowercase
				if(label.includes(searchText) || data.includes(searchText)) {
					tagOption.$element.show();
				} else {
					tagOption.$element.hide();
				}
			});
		});
		this.$body.append(this.content.$element);
	};
	PageTaggingDialog.prototype.getActionProcess = function(action) {
		var dialog = this;
		if(action) {
			return new OO.ui.Process(function() {
				selectedTags.forEach(function(tag) {
					if(tag.items && tag.items.length > 0) {
						tag.items.forEach(function(subItem) {
							var template = "{{" + tag.tag;
							if(subItem.parameter) {
								// If information for this template has not been provided before, get it from the user
								if(!templateInfo[tag.tag]) {
									templateInfo[tag.tag] = {};
								}
								if(!templateInfo[tag.tag][subItem.parameter]) {
									var inputValue = getInputValue(subItem.name); // Get information from the user
									templateInfo[tag.tag][subItem.parameter] = inputValue;
								}
								// Create the template using the previously entered information
								template += "|" + subItem.parameter + "=" + templateInfo[tag.tag][subItem.parameter];
							}
							template += "}}";
							preparedTemplates.push(template);
						});
					} else {
						// If there are no tag.items, just add {{Template}}
						preparedTemplates.push("{{" + tag.tag + "}}");
					}
				});
				console.log(preparedTemplates);
				if(useMultipleIssuesTemplate && preparedTemplates.length > 1) {
					// Join the formatted tags with newline characters and wrap in {{Multiple issues|...}}
					preparedTagsString = "{{" + multipleIssuesTemplate + "|\n" + preparedTemplates.join("\n") + "\n}}";
				} else {
					// If there's only one tag or useMultipleIssuesTemplate is false, just use it as-is
					preparedTagsString = preparedTemplates.join("\n");
				}
				if(selectedTags.length > 0) {
					tagPage();
					dialog.close({
						action: action
					});
				} else {
					mw.notify(mw.msg('select-a-tag'), {
						title: mw.msg('operation-failed'),
						type: 'error'
					});
				}
			});
		}
		return PageTaggingDialog.super.prototype.getActionProcess.call(this, action);
	};
	var windowManager = new OO.ui.WindowManager();
	$(document.body).append(windowManager.$element);
	var dialog = new PageTaggingDialog({
		size: 'large',
	});
	windowManager.addWindows([dialog]);
	windowManager.openWindow(dialog);

	function getInputValue(inputName) {
		// Find the input element that matches inputName
		var inputElement = document.querySelector('input[name="' + inputName + '"]');
		if(inputElement) {
			// If the input element is found, get its value
			return inputElement.value;
		} else {
			// If the input element is not found, return a default value or handle the error
			return ""; // You can return a default value or perform other actions
		}
	}

	function updateSelectedTags(selected, tag) {
		if(selected) {
			selectedTags.push(tag);
		} else {
			selectedTags = selectedTags.filter(function(item) {
				return item !== tag;
			});
		}
		console.log(selectedTags);
	}

	function tagPage() {
		var editParams = {
			action: 'edit',
			title: mw.config.get("wgPageName"),
			summary: apiPostSummary,
			tags: 'Adiutor',
			format: 'json'
		};
		var removedContent = "";
		var modifiedTags = preparedTagsString.replace('{{' + uncategorizedTemplate + '}}', function(match) {
			removedContent = match;
			return "";
		});
		if(removedContent) {
			editParams.prependtext = modifiedTags.split(',').join('\n') + '\n';
			editParams.appendtext = '\n' + removedContent;
		} else {
			editParams.prependtext = modifiedTags.split(',').join('\n') + '\n';
		}
		api.postWithToken('csrf', editParams).done(function() {
			adiutorUserOptions.stats.pageTags++;
			api.postWithEditToken({
				action: 'globalpreferences',
				format: 'json',
				optionname: 'userjs-adiutor-' + mw.config.get('wgWikiID'),
				optionvalue: JSON.stringify(adiutorUserOptions),
				formatversion: 2,
			}, function() {});
			location.reload();
		});
	}
});
/* </nowiki> */