MediaWiki:Common.js
Tampilan
Catatan: Setelah menerbitkan, Anda mungkin perlu melewati tembolok peramban web Anda untuk melihat perubahan.
- Firefox/Safari: Tekan dan tahan Shift sembari mengeklik Reload, atau tekan Ctrl-F5 atau Ctrl-R (⌘-R di Mac)
- Google Chrome: Tekan Ctrl-Shift-R (⌘-Shift-R di Mac)
- Edge: Tahan Ctrl sembari mengeklik Refresh, atau tekan Ctrl-F5
/* ==========================================================
🛡️ MIPPEDIA AUTO-PROTECTION SYSTEM (ADAPTIVE & AUTO-NOTIF)
Fitur: Request Protect, Auto-Lock, & Pesan Otomatis ke User
========================================================== */
$(document).ready(function() {
var user = mw.config.get('wgUserName');
var pageName = mw.config.get('wgPageName');
var ns = mw.config.get('wgNamespaceNumber');
var isAdmin = mw.config.get('wgUserGroups').includes('sysop');
var $content = $('#mw-content-text');
// --- 1. AUTO-FILL TEKS PERLINDUNGAN ---
if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_protect_text')) {
var savedText = sessionStorage.getItem('mippedia_protect_text');
$('#wpTextbox1').val(savedText + "\n\nAlasan Perlindungan: \n(Tulis alasan anda kenapa berkas ini perlu dikunci!) \n\n<div class='mippedia-status'>'''Status: {{Sedang proses}}'''</div>\n\nPemohon: " + user);
sessionStorage.removeItem('mippedia_protect_text');
}
// --- 2. TOMBOL DINAMIS (DI HALAMAN BERKAS) ---
if (ns === 6 && user) { // Khusus user login
var api = new mw.Api();
api.get({ action: 'query', prop: 'info', titles: pageName, inprop: 'protection' }).done(function(data) {
var page = data.query.pages[Object.keys(data.query.pages)[0]];
var protections = page.protection;
var isFull = false;
var isSemi = false;
protections.forEach(function(p) {
if (p.type === 'edit') {
if (p.level === 'sysop') isFull = true;
if (p.level === 'autoconfirmed') isSemi = true;
}
});
// Jika Full, tombol hilang. Jika Semi, tombol minta Penuh.
if (isFull) return;
var btnLabel = isSemi ? 'Minta Perlindungan Penuh' : 'Minta Perlindungan';
var reqType = isSemi ? 'Perlindungan Penuh' : 'Perlindungan';
var $protBtn = $('<button>').html('<span></span> ' + btnLabel).css({
'background': '#d33', 'color': '#fff', 'border': 'none', 'padding': '5px 15px',
'border-radius': '20px', 'font-size': '11px', 'font-weight': '800', 'cursor': 'pointer', 'margin': '10px 5px'
});
$protBtn.click(function() {
var talkPage = "Pembicaraan_Berkas:" + mw.config.get('wgTitle');
sessionStorage.setItem('mippedia_protect_text', "Halo Pengurus Mippedia Commons,\n\nSaya memohon " + reqType + " untuk berkas [[:" + pageName + "]] guna menghindari penyalahgunaan.");
window.location.href = mw.util.getUrl(talkPage, { action: 'edit', section: 'new', preloadtitle: 'Permintaan Perlindungan Berkas' });
});
setTimeout(function() { $('#firstHeading').after($protBtn); }, 650);
});
}
// --- 3. PANEL ADMIN PERLINDUNGAN (DI HALAMAN PEMBICARAAN) ---
if (ns === 7) {
var api = new mw.Api();
var filePage = pageName.replace('Pembicaraan_Berkas:', 'Berkas:');
var isPending = $content.text().includes("Status: {{Sedang proses}}");
api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'user', rvlimit: 1, rvdir: 'newer' }).done(function(data) {
var pages = data.query.pages;
var requester = "";
for (var id in pages) { requester = pages[id].revisions[0].user; }
if (isAdmin && isPending && $content.text().includes("Permintaan Perlindungan")) {
var $panel = $('<div style="background:#fff0f0; border:2px solid #d33; padding:15px; border-radius:10px; margin:15px 0;">' +
'<div style="font-weight:bold; color:#d33; margin-bottom:10px;">🛡️ ADMIN PROTECTION CONTROL</div>' +
'<p style="font-size:11px;">Pilih tingkat perlindungan untuk berkas ini:</p></div>');
var $btnSemi = $('<button>').text('SEMI-PROT').attr('title', 'Hanya user terdaftar').css({'background':'#faad14','color':'#fff','border':'none','padding':'8px 12px','margin-right':'8px','cursor':'pointer','font-weight':'bold'});
var $btnFull = $('<button>').text('FULL-PROT').attr('title', 'Hanya pengurus').css({'background':'#d33','color':'#fff','border':'none','padding':'8px 12px','margin-right':'8px','cursor':'pointer','font-weight':'bold'});
var $btnReject = $('<button>').text('TOLAK').css({'background':'#555','color':'#fff','border':'none','padding':'8px 12px','cursor':'pointer'});
// FUNGSI EKSEKUSI PROTEKSI (Tetap menjaga sistem kirim pesan otomatis ke user)
function executeProtect(level, levelName) {
var editRight = (level === 'sysop') ? 'sysop' : 'autoconfirmed';
api.postWithToken('csrf', {
action: 'protect',
title: filePage,
protections: 'edit=' + editRight + '|move=' + editRight,
expiry: 'infinite',
reason: 'Permintaan disetujui: ' + levelName
}).done(function() {
api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'content' }).done(function(res) {
var content = res.query.pages[Object.keys(res.query.pages)[0]].revisions[0]['*'];
var newText = content.replace("Status: {{Sedang proses}}", "Status: {{Dilindungi}}(" + levelName + ")'''");
api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Status: Protection Granted' }).done(function() {
// FITUR OTOMATIS KIRIM PESAN (TIDAK DIBUANG)
var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permohonan perlindungan untuk [[:" + filePage + "]] telah '''disetujui''' dengan tingkat '''" + levelName + "'''. -- [[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) {{HARIREVISI}} {{BULANREVISI}} {{TAHUNREVISI}} (UTC)";
api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:" + requester, section: 'new', text: msg }).done(function() {
location.reload();
});
});
});
});
}
$btnSemi.click(function() { executeProtect('autoconfirmed', 'Semi Perlindungan'); });
$btnFull.click(function() { executeProtect('sysop', 'Perlindungan Penuh'); });
$btnReject.click(function() {
var alasan = prompt("Alasan penolakan:");
if (!alasan) return;
api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'content' }).done(function(res) {
var content = res.query.pages[Object.keys(res.query.pages)[0]].revisions[0]['*'];
var newText = content.replace("Status: {{Sedang proses}}", "Status: {{Ditolak}}n\n''Alasan: " + alasan + "''");
api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Status: Protection Rejected' }).done(function() {
// FITUR OTOMATIS KIRIM PESAN PENOLAKAN
var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permohonan perlindungan untuk [[:" + filePage + "]] '''telah ditolak''' karena: ''" + alasan + "''. -- [[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) {{HARIREVISI}} {{BULANREVISI}} {{TAHUNREVISI}} (UTC)";
api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:" + requester, section: 'new', text: msg }).done(function() {
location.reload();
});
});
});
});
$panel.append($btnSemi, $btnFull, $btnReject);
$('#mw-content-text').prepend($panel);
}
});
}
});