MediaWiki:Common.js: Perbedaan antara revisi
Tidak ada ringkasan suntingan Tanda: Suntingan perangkat seluler Suntingan peramban seluler |
Tidak ada ringkasan suntingan Tanda: Suntingan perangkat seluler Suntingan peramban seluler |
||
| Baris 638: | Baris 638: | ||
/* ========================================================== | /* ========================================================== | ||
🛡️ MIPPEDIA | 🛡️ MIPPEDIA AUTO-PROTECTION SYSTEM | ||
Fitur: Request Protect, Auto-Lock, & Notif | |||
========================================================== */ | ========================================================== */ | ||
$(document).ready(function() { | $(document).ready(function() { | ||
| Baris 646: | Baris 646: | ||
var ns = mw.config.get('wgNamespaceNumber'); | var ns = mw.config.get('wgNamespaceNumber'); | ||
var isAdmin = mw.config.get('wgUserGroups').includes('sysop'); | var isAdmin = mw.config.get('wgUserGroups').includes('sysop'); | ||
var | var $content = $('#mw-content-text'); | ||
// --- 1. | // --- 1. AUTO-FILL TEKS PERLINDUNGAN --- | ||
if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem(' | if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_protect_text')) { | ||
var | var savedText = sessionStorage.getItem('mippedia_protect_text'); | ||
$('#wpTextbox1').val(savedText + "\n\n**Alasan Perlindungan:** \n(Tulis alasan kenapa berkas ini perlu dikunci, boys!) \n\n<div class='mippedia-status'>'''Status: 🕒 Sedang diajukan'''</div>\n\n--" + user); | |||
sessionStorage.removeItem('mippedia_protect_text'); | |||
sessionStorage.removeItem(' | |||
} | } | ||
// --- 2. | // --- 2. TOMBOL MINTA PERLINDUNGAN (DI HALAMAN BERKAS) --- | ||
if (ns === 6) { | if (ns === 6) { | ||
// Cek apakah halaman sudah dilindungi (lewat indikator teks atau status API) | |||
if (!$content.text().includes("Dilindungi")) { | |||
var $protBtn = $('<button>').html('<span>🔒</span> Minta Perlindungan').css({ | |||
'background': '#d33', 'color': '#fff', 'border': 'none', 'padding': '5px 15px', | |||
var $protBtn = $('<button>').html( | |||
'background': | |||
'border-radius': '20px', 'font-size': '11px', 'font-weight': '800', 'cursor': 'pointer', 'margin': '10px 5px' | 'border-radius': '20px', 'font-size': '11px', 'font-weight': '800', 'cursor': 'pointer', 'margin': '10px 5px' | ||
}); | }); | ||
$protBtn.click(function() { | $protBtn.click(function() { | ||
if (!user) { window.location.href = mw.util.getUrl('Istimewa:Masuk_log', { returnto: pageName }); return; } | if (!user) { window.location.href = mw.util.getUrl('Istimewa:Masuk_log', { returnto: pageName }); return; } | ||
sessionStorage.setItem(' | var talkPage = "Pembicaraan_Berkas:" + mw.config.get('wgTitle'); | ||
window.location.href = mw.util.getUrl( | sessionStorage.setItem('mippedia_protect_text', "Halo Pengurus Mippedia,\n\nSaya memohon perlindungan (protection) 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); | |||
$('#firstHeading').after($protBtn); | } | ||
} | |||
} | } | ||
// --- 3. | // --- 3. PANEL ADMIN PERLINDUNGAN (DI HALAMAN PEMBICARAAN) --- | ||
if (ns === 7 | if (ns === 7) { | ||
var api = new mw.Api(); | |||
var filePage = pageName.replace('Pembicaraan_Berkas:', 'Berkas:'); | var filePage = pageName.replace('Pembicaraan_Berkas:', 'Berkas:'); | ||
var isPending = $content.text().includes("Status: 🕒 Sedang diajukan"); | |||
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; } | |||
var | |||
$ | 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 | 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 | 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 | |||
function executeProtect(level, levelName) { | |||
var expiry = 'infinite'; | |||
var editRight = (level === 'sysop') ? 'sysop' : 'autoconfirmed'; | |||
// STEP 1: PROTEKSI TEKNIS SISTEM | |||
api.postWithToken('csrf', { | |||
action: 'protect', | |||
title: filePage, | |||
protections: 'edit=' + editRight + '|move=' + editRight, | |||
expiry: expiry, | |||
reason: 'Permintaan disetujui: ' + levelName | |||
}).done(function() { | |||
// STEP 2: UPDATE TEKS STATUS | |||
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 diajukan", "Status: ✅ '''Dilindungi (" + levelName + ")'''"); | |||
api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Status: Protection Granted' }).done(function() { | |||
// STEP 3: NOTIF USER | |||
var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permohonan perlindungan untuk [[:" + filePage + "]] telah '''DISETUJUI''' dengan tingkat '''" + levelName + "'''. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.33 (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 diajukan", "Status: ❌ '''Ditolak'''\n\n''Alasan: " + alasan + "''"); | |||
api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Status: Protection Rejected' }).done(function() { | |||
var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permohonan perlindungan untuk [[:" + filePage + "]] '''DITOLAK''' karena: ''" + alasan + "''. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.33 (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); | |||
} | |||
}); | }); | ||
} | } | ||
}); | }); | ||