Thành viên:NgocAnMaster/EditRequestTool.js
//<nowiki>
/*Folk of [[:en:User:Terasail/Edit Request Tool.js]] - Vietnamese translation by NgocAnMaster*/
/*jshint esversion: 6*/
var editRequestBoxes = document.getElementsByClassName("plainlinks tmbox tmbox-notice editrequest");
var pageWatchers = "Hiện có ";
var watchStatus;
var dataERT;
var api = new mw.Api();
var pageNameERT = mw.config.values.wgPageName;
var encodePageName = encodeURIComponent(pageNameERT);
var emptyTalkParams = null;
pageNameERT = pageNameERT.replaceAll("_", " ");
function postEdit(wikitext, editSummary, secIndx, changeWatch, watchlist) {
let apiParams = {
action: 'edit',
title: pageNameERT,
text: wikitext,
section: secIndx,
summary: editSummary,
watchlist: changeWatch
};
let reloadURL = "/w/index.php?title=" + encodePageName + "&type=revision&diff=cur&oldid=prev";
if (changeWatch == "watch") {
apiParams.watchlistexpiry = watchlist;
}
api.postWithEditToken(apiParams).done(function () {
if (emptyTalkParams != null) {
api.postWithEditToken(emptyTalkParams).done(function (result) {
window.location = reloadURL;
});
} else {
window.location = reloadURL;
}
});
}
function execute(responseTable, replyOption, inputText, answered, boxType, targets, changeWatch, watchlist) {
OO.ui.confirm("Xác nhận trước khi trả lời yêu cầu sửa đổi này.").done(function (confirmed) {
if (confirmed) {
//Create label box & remove action buttons
let firstRow = responseTable.children[1].children[0];
firstRow.innerHTML = "";
responseTable.children[5].children[0].remove();
let infoBox = new OO.ui.MessageWidget({
icon: 'pageSettings',
type: 'notice',
label: 'Thực hiện yêu cầu — Đang bắt đầu yêu cầu sửa đổi, nhận dữ liệu đề mục để sửa đổi.'
});
infoBox.$element[0].style = "margin:5px 0; max-width:50em";
$(firstRow).append(infoBox.$element);
//Create loading bar
let progressBar = new OO.ui.ProgressBarWidget({
progress: false
});
$(firstRow).append(progressBar.$element);
//Set preview for output
if (replyOption[0] != "") {//Don't preview a non-response
showOutput(inputText, replyOption, responseTable.children[4].children[0], boxType);
}
//Find header
let header = "";
let curElement = responseTable.parentNode;
do {
curElement = curElement.previousElementSibling;
if (curElement.getElementsByClassName("mw-headline").length == 1) {
header = curElement.getElementsByClassName("mw-headline")[0].id;
}
}
while (header == "");
api.get({
action: "parse",
page: pageNameERT,
prop: "sections"
}).done(function (data) {
infoBox.setLabel("Thực hiện yêu cầu — Đang thực hiện thay đổi với yêu cầu sửa đổi");
let editTemplate = "{{Sửa trang " + boxType;
if (answered) {
answered = "xong";
} else {
answered = "chưa";
}
for (let c3 = 0; c3 < targets.length; c3++) {
editTemplate += "|" + targets[c3];
}
editTemplate += "|xong=" + answered;
let sections = data.parse.sections;
let secIndx = sections[0];
for (let j = 0; j < sections.length; j++) {
if (sections[j].anchor == header) {
secIndx = parseInt(sections[j].index);
}
}
api.get({
action: "parse",
page: pageNameERT,
section: secIndx,
prop: "wikitext|revid"
}).done(function (data) {
let wikitext = data.parse.wikitext["*"];
let newRev = data.parse.revid;
wikitext = wikitext.replace(/{{ *([SETFI]PER|Sửa trang([ -]?[A-Z]+[ -]?|[- ]))\s*[^}}]*/i, editTemplate);
let editSummary = "/* " + header.replaceAll("_", " ") + " */ " + replyOption[2] + " ([[Thành viên:NgocAnMaster/EditRequestTool.js|Edit Request Tool]])";
if (replyOption[1] != "Close") {
wikitext = wikitext.trim() + "\n:";
if (replyOption[0] != "") {
wikitext += "{{subst:" + dataERT.protections[boxType][1] + replyOption[0] + "}} ";
}
if (inputText != "") {
wikitext += inputText.replaceAll(/\s*~~~~\s*/g, "") + " ";
}
wikitext += "~~~~";
if (replyOption[1] == "Remove") {
wikitext = "";
/*if (inputText == "EmptyNotice") {
let commentERT = document.getElementById(header).dataset.mwComment;
if (typeof (commentERT) != 'undefined' && commentERT.search(/-(?=[0-9]{14}","type)/) != -1) {
let commenter = commentERT.slice(commentERT.indexOf('"name"') + 10, commentERT.search(/-(?=[0-9]{14}","type)/));
emptyTalkParams = dataERT.emptyNotice;
emptyTalkParams.title = "User talk:" + commenter;
emptyTalkParams.sectiontitle += pageNameERT;
emptyTalkParams.text = talkParams.text.replace("```", pageNameERT);
emptyTalkParams.summary = talkParams.summary.replace("```", pageNameERT);
console.log(emptyTalkParams);
}
}*/
editSummary = editSummary.replace(/[^]+\*\/ /, "");
}
}
infoBox.setType("success");
infoBox.setLabel("Thực hiện yêu cầu — Đang lưu các thay đổi trên trang thảo luận.");
if (newRev == mw.config.values.wgRevisionId) {
postEdit(wikitext, editSummary, secIndx, changeWatch, watchlist);
} else {
OO.ui.confirm("Đã có phiên bản mới trên trang, bạn có muốn tiếp tục?").done(function (revCon) {
if (revCon) {
postEdit(wikitext, editSummary, secIndx, changeWatch, watchlist);
}
});
}
});
});
}
});
}
function addButtons(currentBox, replyButton) {
let boxType = currentBox.parentElement.dataset.origlevel;
boxType = boxType.replace("full", "fully");
let tableElem = currentBox.parentElement;
$('<table style="border:1px solid #A2A9B1; border-radius:2px; padding:10px 16px 0; margin:auto; max-width:55em; width:100%; clear:both;"><tr><td style="color:#808080"><div style="font-style:italic; margin-left:1em;">' + pageWatchers + '</div><div>Tùy chọn nhanh:</div></td></tr><tr style="display: flex; justify-content: center;"><td></td></tr><tr><td style="color:#808080">Phản hồi tùy chỉnh:</td></tr><tr style="text-align:center;"><td></td></tr><tr style="background:#F6F6F6;"><td style="display:none;"><div style="color:#808080">Xem trước:</div><div></div></td></tr><tr style="display: flex; justify-content: right;"><td></td></tr></table>').insertAfter(tableElem);
let responseTable = tableElem.nextElementSibling.children[0];
let firstRow = responseTable.children[1].children[0];
let secondRow = responseTable.children[3].children[0];
let thirdRow = responseTable.children[4].children[0];
let fourthRow = responseTable.children[5].children[0];
let protections = Object.entries(dataERT.protections);
let responses = Object.entries(dataERT.response);
let quickResponses = Object.entries(dataERT.quickResponse);
let nonResponses = dataERT.nonResponse;
//Create type change dropdown
let tcOptions = [];
for (let i = 0; i < protections.length; i++) {
tcOptions.push({data: protections[i][0], label: protections[i][1][0]});
}
let typeChange = new OO.ui.DropdownInputWidget({
value: boxType,
options: tcOptions
});
typeChange.on("change", function () {
submitB.setDisabled(false);
});
typeChange.$element[0].style = "text-align:left; margin:auto";
$(secondRow).append(typeChange.$element);
//Create target page list
let boxLinks = currentBox.getElementsByClassName("mbox-text")[0].getElementsByClassName("external text");
let pageLinks = [];
if (boxLinks.length > 0) {//Open request
for (let c1 = 0; c1 < boxLinks.length; c1++) {
if (boxLinks[c1].parentElement.tagName == "LI" || boxLinks[c1].parentElement.tagName == "B") {
pageLinks[pageLinks.length] = boxLinks[c1].innerHTML;
}
}
} else {//Closed request
boxLinks = currentBox.getElementsByClassName("mbox-text")[0].getElementsByTagName("A");
for (let c2 = 1; c2 < boxLinks.length; c2++) {
pageLinks[pageLinks.length] = boxLinks[c2].title;
}
if (pageLinks.length == 0) {
pageLinks = mw.config.get("wgPageName").replace(/(_talk|Talk:)/,"");
}
}
let targetPages = new OO.ui.TagMultiselectWidget({
placeholder: 'Trang mục tiêu',
allowArbitrary: true,
selected: pageLinks
});
targetPages.on("change", function () {
submitB.setDisabled(false);
});
targetPages.$element[0].style = "text-align:left; margin:5px auto";
$(secondRow).append(targetPages.$element);
//Create dropdown menu
let dropMenu = new OO.ui.DropdownWidget({
label: "Lựa chọn tùy chọn trả lời - Thêm nội dung bổ sung bên dưới",
menu: {items: []}
});
for (let count = 0; count < responses.length; count++) {
let newOption = new OO.ui.MenuOptionWidget({
label: responses[count][0],
icon: responses[count][1][1]
});
dropMenu.menu.addItems([newOption]);
}
responses = dataERT.response;
dropMenu.$element[0].style = "text-align:left; margin:0px";
$(secondRow).append(dropMenu.$element);
dropMenu.on("labelChange", function () {
submitB.setDisabled(false);
showOutput(inputText, responses[dropMenu.getLabel()], thirdRow, typeChange.value);
});
//Create input box
let inputText = new OO.ui.MultilineTextInputWidget({autosize: true, rows: 4, label: "Nội dung bổ sung"});
inputText.$element[0].style = "margin:5px auto";
$(secondRow).append(inputText.$element);
inputText.on("change", function (newText) {
showOutput(inputText, responses[dropMenu.getLabel()], thirdRow, typeChange.value);
});
//Create top horizontal layout
let hzLayoutT = new OO.ui.HorizontalLayout();
//Create firstrow fieldset
let fieldsetT = new OO.ui.FieldsetLayout();
fieldsetT.addItems([new OO.ui.FieldLayout(new OO.ui.Widget({content: [hzLayoutT]}), {align: 'top'})]);
$(firstRow).append(fieldsetT.$element);
//Remove button
let remove = new OO.ui.ButtonWidget({
icon: "trash",
flags: ["primary", "destructive"],
invisibleLabel: true,
title: "Loại bỏ đề mục!"
});
remove.on("click", function () {
secondRow.style = "display:none";
thirdRow.style = "display:none";
fourthRow.style = "display:none";
responseTable.children[2].children[0].style = "display:none";
submitB.$element.remove();
hzLayoutT.clearItems();
//Create deletion options
let remSec = new OO.ui.ButtonWidget({//RemoveSection
icon: "trash",
flags: ["primary", "destructive"],
label: "Xóa đề mục",
title: "Xóa toàn bộ nội dung đề mục!"
});
remSec.on("click", function () {
execute(responseTable, nonResponses.Remove, "", null, typeChange.defaultValue, targetPages.getValue(), "nochange", "");//temp
/*if (toggleESN.selected) {
execute(responseTable, nonResponses.Remove, "EmptyNotice", null, typeChange.defaultValue, targetPages.getValue(), "nochange", "");
} else {
execute(responseTable, nonResponses.Remove, "", null, typeChange.defaultValue, targetPages.getValue(), "nochange", "");
}*/
});
hzLayoutT.addItems([remSec]);
/*let toggleESN = new OO.ui.CheckboxInputWidget({selected: false});
hzLayoutT.addItems([toggleESN, new OO.ui.LabelWidget({label: "Give the user an empty section notice"})]);*/
hzLayoutT.addItems([cancelB]);
});
hzLayoutT.addItems([remove]);
//Open & Close button
if (currentBox.parentElement.attributes[2].localName != "data-origlevel") {
let closeB = new OO.ui.ButtonWidget({
icon: "unFlag",
invisibleLabel: true,
title: "Đánh dấu là đã trả lời"
});
closeB.on("click", function () {
execute(responseTable, nonResponses.Close, "", true, typeChange.defaultValue, targetPages.getValue(), "nochange", "");
});
hzLayoutT.addItems([closeB]);
} else {
let openB = new OO.ui.ButtonWidget({
icon: "flag",
invisibleLabel: true,
title: "Đánh dấu là chưa trả lời"
});
openB.on("click", function () {
execute(responseTable, nonResponses.Open, "", false, typeChange.defaultValue, targetPages.getValue(), "nochange", "");
});
hzLayoutT.addItems([openB]);
}
//Create quick response buttons
for (let i = 0; i < quickResponses.length; i++) {
let newButton = new OO.ui.ButtonWidget({
label: quickResponses[i][1][0],
flags: quickResponses[i][1][1],
title: quickResponses[i][1][2]
});
newButton.on("click", function () {
execute(responseTable, responses[quickResponses[i][0]], "", toggleAns.selected, typeChange.defaultValue, targetPages.getValue(), "nochange", "");
});
hzLayoutT.addItems([newButton]);
}
//Toggle answer button
let toggleAns = new OO.ui.CheckboxInputWidget({selected: true});
hzLayoutT.addItems([toggleAns, new OO.ui.LabelWidget({label: "Đã trả lời"})]);
//Create lastrow horizontal layout
let hzLayoutB = new OO.ui.HorizontalLayout();
//Create lastrow fieldset
let fieldsetB = new OO.ui.FieldsetLayout();
fieldsetB.addItems([new OO.ui.FieldLayout(new OO.ui.Widget({content: [hzLayoutB]}), {align: 'top'})]);
$(fourthRow).append(fieldsetB.$element);
//Cancel response button
let cancelB = new OO.ui.ButtonWidget({
icon: "cancel",
flags: ["destructive"],
label: "Hủy",
framed: false,
title: "Hủy trả lời & đóng menu"
});
cancelB.on("click", function () {
replyButton.setDisabled(false);
responseTable.parentElement.remove();
});
hzLayoutB.addItems([cancelB]);
let isWatched = (typeof (watchStatus[0]) != "undefined");
//Watch list//Toggle answer button
let toggleWL = new OO.ui.CheckboxInputWidget({selected: isWatched});
let toggleWLLable = new OO.ui.LabelWidget({label: "Theo dõi trang này"});
toggleWL.on("change", function (newStatus) {
watchDropdown.setDisabled(!newStatus);
});
toggleWLLable.$element[0].style = "white-space: nowrap;";
hzLayoutB.addItems([toggleWL, toggleWLLable]);
let watchValue = "never";
let watchOptions = [{data: "never", label: "Vô hạn"}, {data: "1 day", label: "1 ngày"}, {
data: "3 days",
label: "3 ngày"
}, {data: "1 week", label: "1 tuần"}, {data: "1 month", label: "1 tháng"}];
let wlExpiry = watchStatus[1];
if (typeof (wlExpiry) != "undefined") {
let daysDif = Math.ceil((new Date(wlExpiry).getTime() - Date.now()) / 1000 / 60 / 60 / 24);
watchOptions.unshift({data: "nochange", label: daysDif + " days"});
watchValue = wlExpiry;
}
//Create WLDropdown horizontal layout
let hzLayoutWLD = new OO.ui.HorizontalLayout();
hzLayoutB.addItems([hzLayoutWLD]);
//Watchlist dropdown
let watchDropdown = new OO.ui.DropdownInputWidget({
value: watchValue,
options: watchOptions,
disabled: !isWatched
});
hzLayoutWLD.addItems([watchDropdown]);
//Submit response button
let submitB = new OO.ui.ButtonWidget({
icon: "checkAll",
flags: ["primary", "progressive"],
label: "Đăng",
title: "Đăng phản hồi",
disabled: true
});
submitB.on("click", function () {
let newResponse = responses[dropMenu.getLabel()];
let newText = inputText.value;
let isAns = toggleAns.selected;
let newType = typeChange.value;
let newTargets = targetPages.getValue();
let targets = targetPages.items;
let targetChange = false;
let wlChange = toggleWL.selected;
let wlVals = watchDropdown.value;
if (wlChange) {
wlChange = "watch";
if (wlVals == "nochange") {
wlChange = "nochange";
}
} else {
wlChange = "unwatch";
}
if (typeof (newResponse) != "undefined") {
execute(responseTable, newResponse, newText, isAns, newType, newTargets, wlChange, wlVals);
} else if (typeChange.value != typeChange.defaultValue) {
execute(responseTable, nonResponses.ChangeLevel, "", isAns, newType, newTargets, wlChange, wlVals);
}
if (targets.length == pageLinks.length) {
for (let item = 0; item < targets.length; item++) {
if (targets[item].data != pageLinks[item]) {
targetChange = true;
}
}
} else {
targetChange = true;
}
if (targetChange) {
execute(responseTable, nonResponses.ChangeTarget, "", isAns, newType, newTargets, wlChange, wlVals);
}
});
hzLayoutB.addItems([submitB]);
}
function showOutput(inputText, replyOption, tableRow, template) {
var restTransform = "https://vi.wikipedia.org/api/rest_v1/transform/wikitext/to/html/" + encodePageName;
let preview = "";
let newText = inputText.value;
if (typeof (inputText) == 'string') {
newText = inputText;
}
template = dataERT.protections[template][1];
if (typeof (replyOption) != "undefined") {
preview += "{{" + template + replyOption[0] + "}} ";
}
if (newText != "" && typeof (newText) != "undefined") {
preview += newText + " ";
}
if (preview != "") {
let nickname = " " + mw.user.options.values.nickname;
if (nickname == " ") {//Create default signature if no nickname
nickname = mw.user.getName();
nickname = " [[Thành viên:" + nickname + "|" + nickname + "]] ([[Thảo luận Thành viên:" + nickname + "|thảo luận]])";
}
let dateObj = new Date();
let dateNow = dateObj.toLocaleDateString('vi-VN', {
timeZone: 'UTC',
year: 'numeric',
month: 'long',
day: 'numeric'
});
let timeNow = dateObj.toLocaleTimeString('vi-VN', {timeZone: 'UTC', hour: '2-digit', minute: '2-digit'});
preview += nickname + " " + timeNow + ", " + dateNow + " (UTC)";
preview = preview.replaceAll(/{{subst:/gi, "{{");
$.post(restTransform, 'wikitext=' + encodeURIComponent(preview) + '&body_only=true',
function (html) {
if (inputText.value != "" || typeof (replyOption) != "undefined") {//Stops preview appearing with empty input box
tableRow.style = "padding:8px 1em 2px;";
tableRow.children[1].innerHTML = html;
}
}
);
} else {
tableRow.style = "display:none;";
}
}
if (editRequestBoxes.length != 0) {
let pageID = mw.config.values.wgArticleId;
api.get({
action: "query",
prop: "info",
pageids: pageID,
inprop: "watchers|visitingwatchers|watched",
format: "json"
}).done(function (data) {
data = data.query.pages[pageID];
let watchers = data.watchers;
let visiting = data.visitingwatchers;
watchStatus = [data.watched, data.watchlistexpiry];
if (typeof (watchers) == "undefined") {
pageWatchers += "ít hơn 30";
} else {
pageWatchers += watchers;
}
pageWatchers += " người theo dõi trang này (";
if (typeof (visiting) == "undefined") {
pageWatchers += "0";
} else {
pageWatchers += visiting;
}
pageWatchers += " đã xem sửa đổi gần đây).";
});
var jsonERTURL = "https://vi.wikipedia.org/w/index.php?title=User:NgocAnMaster/EditRequestTool.json&action=raw&ctype=text/json";
$.getJSON(jsonERTURL, function (newData) {
dataERT = newData;
mw.loader.load(["oojs-ui-core", "oojs-ui-widgets", "oojs-ui-windows"]);
mw.loader.load(["oojs-ui.styles.icons-interactions", "oojs-ui.styles.icons-moderation", "oojs-ui.styles.icons-user", "oojs-ui.styles.icons-content", "oojs-ui.styles.icons-editing-core", "oojs-ui.styles.icons-editing-advanced"]);
});
for (let i = 0; i < editRequestBoxes.length; i++) {
let currentBox = editRequestBoxes[i].children[0]; //The tbody tag for the box
if (typeof (currentBox.parentElement.dataset.origlevel) != "undefined") {
let isSmall = false;
if (editRequestBoxes[i].id == "") {
isSmall = true;
}
let replyButton = new OO.ui.ButtonWidget({
icon: "edit",
flags: ["progressive"],
label: "Trả lời",
invisibleLabel: isSmall,
title: "Trả lời yêu cầu sửa đổi này."
});
replyButton.on("click", function () {
addButtons(currentBox, replyButton);
replyButton.setDisabled(true);
});
replyButton.$element[0].style = "margin:2px 0";
if (isSmall) {
$(currentBox.children[0].children[0]).append(replyButton.$element);
} else {
$(currentBox).append('<tr><td colspan=2><div style="display: flex; justify-content: center;"></div></td></tr>');
$(currentBox.children[1].children[0].children[0]).append(replyButton.$element);
}
}
}
}
//</nowiki>[[Category:Wikipedia scripts]]
Wiki - Keonhacai copa chuyên cung cấp kiến thức thể thao, keonhacai tỷ lệ kèo, bóng đá, khoa học, kiến thức hằng ngày được chúng tôi cập nhật mỗi ngày mà bạn có thể tìm kiếm tại đây có nguồn bài viết: https://vi.wikipedia.org/wiki/Th%C3%A0nh_vi%C3%AAn:NgocAnMaster/EditRequestTool.js