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 SMART PROTECTION SYSTEM (ALL-IN-ONE) | ||
========================================================== */ | ========================================================== */ | ||
$(document).ready(function() { | $(document).ready(function() { | ||
| Baris 648: | Baris 647: | ||
var $content = $('#mw-content-text'); | var $content = $('#mw-content-text'); | ||
// --- 1. AUTO-FILL | // --- 1. AUTO-FILL DENGAN DURASI & JENIS (PENGGUNA) --- | ||
if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem(' | if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_prot_type')) { | ||
var | var type = sessionStorage.getItem('mippedia_prot_type'); | ||
var duration = prompt("Berapa lama perlindungan diinginkan? (contoh: 1 week, 1 month, atau infinite)", "infinite"); | |||
sessionStorage.removeItem(' | |||
var template = "Halo Pengurus Mippedia,\n\nSaya memohon permohonan perlindungan berikut:\n" + | |||
"* **Jenis:** " + type + "\n" + | |||
"* **Durasi:** " + (duration || "infinite") + "\n" + | |||
"* **Alasan:** (Tulis alasan lo di sini, boys!)\n\n" + | |||
"<div class='mippedia-status'>'''Status: 🕒 Sedang diajukan'''</div>\n\n--" + user; | |||
$('#wpTextbox1').val(template); | |||
sessionStorage.removeItem('mippedia_prot_type'); | |||
} | } | ||
// --- 2. TOMBOL | // --- 2. TOMBOL DINAMIS & CEK STATUS (HALAMAN BERKAS) --- | ||
if (ns === 6) { | if (ns === 6) { | ||
var api = new mw.Api(); | |||
if ( | api.get({ action: 'query', prop: 'info', titles: pageName, inprop: 'protection' }).done(function(data) { | ||
var $protBtn = $('<button>').html( | var page = data.query.pages[Object.keys(data.query.pages)[0]]; | ||
'background': | 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 Protect, tombol hilang total sesuai request lo | |||
if (isFull) return; | |||
var btnText = isSemi ? "🔒 Minta Peningkatan Perlindungan" : "🔒 Minta Perlindungan"; | |||
var btnColor = isSemi ? "#ff4d4f" : "#d33"; // Warna beda kalo upgrade | |||
var $protBtn = $('<button>').html(btnText).css({ | |||
'background': btnColor, 'color': '#fff', 'border': 'none', 'padding': '5px 15px', | |||
'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; } | ||
var talkPage = "Pembicaraan_Berkas:" + mw.config.get('wgTitle'); | var talkPage = "Pembicaraan_Berkas:" + mw.config.get('wgTitle'); | ||
// Jika sudah semi, otomatis arahkan ke Full. Jika belum, kasih pilihan. | |||
var finalType = isSemi ? "Perlindungan Penuh" : prompt("Ketik jenis perlindungan: (Semi / Full)", "Semi"); | |||
if (finalType === "Full") finalType = "Perlindungan Penuh"; | |||
if (finalType === "Semi") finalType = "Semi Perlindungan"; | |||
sessionStorage.setItem('mippedia_prot_type', finalType); | |||
window.location.href = mw.util.getUrl(talkPage, { action: 'edit', section: 'new', preloadtitle: 'Permintaan Perlindungan Berkas' }); | window.location.href = mw.util.getUrl(talkPage, { action: 'edit', section: 'new', preloadtitle: 'Permintaan Perlindungan Berkas' }); | ||
}); | }); | ||
setTimeout(function() { $('#firstHeading').after($protBtn); }, 650); | setTimeout(function() { $('#firstHeading').after($protBtn); }, 650); | ||
} | }); | ||
} | } | ||
// --- 3. PANEL ADMIN | // --- 3. PANEL ADMIN & NOTIFIKASI OTOMATIS (HALAMAN PEMBICARAAN) --- | ||
if (ns === 7) { | if (ns === 7) { | ||
var api = new mw.Api(); | var api = new mw.Api(); | ||
| Baris 684: | Baris 718: | ||
for (var id in pages) { requester = pages[id].revisions[0].user; } | for (var id in pages) { requester = pages[id].revisions[0].user; } | ||
if (isAdmin && isPending | if (isAdmin && isPending) { | ||
var reqText = $content.text(); | |||
// Deteksi level dan durasi dari teks yang dibuat sistem tadi | |||
var targetLevel = reqText.includes("Perlindungan Penuh") ? "sysop" : "autoconfirmed"; | |||
var levelLabel = (targetLevel === "sysop") ? "Perlindungan Penuh" : "Semi Perlindungan"; | |||
var targetDur = reqText.match(/Durasi:\s*(.*)/) ? reqText.match(/Durasi:\s*(.*)/)[1] : "infinite"; | |||
var $panel = $('<div style="background:#fff0f0; border:2px solid #d33; padding:15px; border-radius:10px; margin:15px 0;">' + | 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 | '<div style="font-weight:bold; color:#d33; margin-bottom:10px;">🛡️ ADMIN ACTION: PROTECTION</div>' + | ||
'<p style="font-size:11px;"> | '<p style="font-size:11px;">Permintaan: <b>' + levelLabel + '</b> | Durasi: <b>' + targetDur + '</b></p></div>'); | ||
var $ | var $btnApprove = $('<button>').text('✅ SETUJUI & KUNCI').css({'background':'#d33','color':'#fff','border':'none','padding':'8px 15px','cursor':'pointer','font-weight':'bold'}); | ||
var $ | var $btnReject = $('<button>').text('❌ TOLAK').css({'background':'#555','color':'#fff','border':'none','padding':'8px 15px','margin-left':'8px','cursor':'pointer'}); | ||
// | $btnApprove.click(function() { | ||
$btnApprove.prop('disabled', true).text('Processing...'); | |||
// A. EKSEKUSI LOCK SISTEM | |||
api.postWithToken('csrf', { | api.postWithToken('csrf', { | ||
action: 'protect', | action: 'protect', | ||
title: filePage, | title: filePage, | ||
protections: 'edit=' + | protections: 'edit=' + targetLevel + '|move=' + targetLevel, | ||
expiry: | expiry: targetDur, | ||
reason: 'Permintaan disetujui: ' + | reason: 'Permintaan disetujui: ' + levelLabel | ||
}).done(function() { | }).done(function() { | ||
// | // B. UPDATE TEKS STATUS DI DISKUSI | ||
api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'content' }).done(function(res) { | 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 content = res.query.pages[Object.keys(res.query.pages)[0]].revisions[0]['*']; | ||
var | var updatedContent = content.replace("Status: 🕒 Sedang diajukan", "Status: ✅ '''Disetujui (" + levelLabel + ")'''"); | ||
api.postWithToken('edit', { action: 'edit', title: pageName, text: | api.postWithToken('edit', { action: 'edit', title: pageName, text: updatedContent, summary: 'Status Updated: Protected' }).done(function() { | ||
// | // C. KIRIM PESAN OTOMATIS KE PENGGUNA (Gak boleh ilang!) | ||
var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permohonan perlindungan untuk [[:" + filePage + "]] telah '''DISETUJUI''' dengan tingkat '''" + | var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permohonan perlindungan lo untuk [[:" + filePage + "]] telah '''DISETUJUI''' dengan tingkat '''" + levelLabel + "''' selama '''" + targetDur + "'''. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.09 (UTC)"; | ||
api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:" + requester, section: 'new', text: msg }).done(function() { | api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:" + requester, section: 'new', text: msg }).done(function() { | ||
location.reload(); | location.reload(); | ||
| Baris 720: | Baris 757: | ||
}); | }); | ||
}); | }); | ||
} | }); | ||
$btnReject.click(function() { | $btnReject.click(function() { | ||
var alasan = prompt("Alasan penolakan:"); | var alasan = prompt("Alasan penolakan:"); | ||
if (!alasan) return; | if (!alasan) return; | ||
$btnReject.prop('disabled', true).text('Processing...'); | |||
api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'content' }).done(function(res) { | 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 content = res.query.pages[Object.keys(res.query.pages)[0]].revisions[0]['*']; | ||
var | var updatedContent = content.replace("Status: 🕒 Sedang diajukan", "Status: ❌ '''Ditolak'''\n\n''Alasan: " + alasan + "''"); | ||
api.postWithToken('edit', { action: 'edit', title: pageName, text: | |||
var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permohonan perlindungan untuk [[:" + filePage + "]] '''DITOLAK''' karena: ''" + alasan + "''. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 | api.postWithToken('edit', { action: 'edit', title: pageName, text: updatedContent, summary: 'Status Updated: Rejected' }).done(function() { | ||
// Pesan penolakan otomatis | |||
var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permohonan perlindungan lo untuk [[:" + filePage + "]] '''DITOLAK''' karena: ''" + alasan + "''. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.09 (UTC)"; | |||
api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:" + requester, section: 'new', text: msg }).done(function() { | api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:" + requester, section: 'new', text: msg }).done(function() { | ||
location.reload(); | location.reload(); | ||
| Baris 739: | Baris 778: | ||
}); | }); | ||
$panel.append($ | $panel.append($btnApprove, $btnReject); | ||
$('#mw-content-text').prepend($panel); | $('#mw-content-text').prepend($panel); | ||
} | } | ||