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 677: Baris 677:
             var reqType = isSemi ? 'Perlindungan Penuh' : 'Perlindungan';
             var reqType = isSemi ? 'Perlindungan Penuh' : 'Perlindungan';


             var $protBtn = $('<button>').html('<span>🔒</span> ' + btnLabel).css({
             var $protBtn = $('<button>').html('<span></span> ' + btnLabel).css({
                 'background': '#d33', 'color': '#fff', 'border': 'none', 'padding': '5px 15px',  
                 'background': '#d33', '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'
Baris 749: Baris 749:
                             // FITUR OTOMATIS KIRIM PESAN PENOLAKAN
                             // FITUR OTOMATIS KIRIM PESAN PENOLAKAN
                             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.37 (UTC)";
                             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.37 (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);
            }
        });
    }
});
/* ==========================================================
  🛡️ MIPPEDIA ARTICLE PROTECTION SYSTEM
  Khusus Namespace Utama (Artikel) - Versi Stabil & Otomatis
  ========================================================== */
$(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 (SISI PENGGUNA) ---
    if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_art_protect')) {
        var savedText = sessionStorage.getItem('mippedia_art_protect');
        $('#wpTextbox1').val(savedText + "\n\n**Alasan Perlindungan:** \n(Tulis alasan kenapa artikel ini perlu dikunci, boys!) \n\n<div class='mippedia-status'>'''Status: 🕒 Sedang diajukan'''</div>\n\n--" + user);
        sessionStorage.removeItem('mippedia_art_protect');
    }
    // --- 2. TOMBOL DINAMIS (KHUSUS NAMESPACE UTAMA / ARTIKEL) ---
    if (ns === 0 && user) { // ns 0 adalah Namespace Utama (Artikel)
        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;
                }
            });
            // Logika Tombol Adaptif
            if (isFull) return; // Full Protect = Tombol Hilang
            var btnLabel = isSemi ? '🔒 Minta Perlindungan Penuh' : '🔒 Minta Perlindungan Artikel';
            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() {
                // Artikel pake Pembicaraan: (Namespace 1)
                var talkPage = "Pembicaraan:" + mw.config.get('wgTitle');
                sessionStorage.setItem('mippedia_art_protect', "Halo Pengurus Mippedia,\n\nSaya memohon " + reqType + " untuk artikel [[" + pageName + "]] guna menghindari vandalisme.");
                window.location.href = mw.util.getUrl(talkPage, { action: 'edit', section: 'new', preloadtitle: 'Permintaan Perlindungan Artikel' });
            });
            setTimeout(function() { $('#firstHeading').after($protBtn); }, 650);
        });
    }
    // --- 3. PANEL ADMIN (HALAMAN PEMBICARAAN ARTIKEL / NS 1) ---
    if (ns === 1) { // ns 1 adalah Pembicaraan Artikel
        var api = new mw.Api();
        var articlePage = pageName.replace('Pembicaraan:', '');
        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; }
            if (isAdmin && isPending && $content.text().includes("Permintaan Perlindungan Artikel")) {
                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 ARTICLE PROTECTION</div>' +
                    '<p style="font-size:11px;">Eksekusi perlindungan untuk artikel ini:</p></div>');
               
                var $btnSemi = $('<button>').text('SEMI-PROT').css({'background':'#faad14','color':'#fff','border':'none','padding':'8px 12px','margin-right':'8px','cursor':'pointer','font-weight':'bold'});
                var $btnFull = $('<button>').text('FULL-PROT').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'});
                function executeProtect(level, levelName) {
                    var editRight = (level === 'sysop') ? 'sysop' : 'autoconfirmed';
                    // STEP 1: LOCK SISTEM
                    api.postWithToken('csrf', {
                        action: 'protect',
                        title: articlePage,
                        protections: 'edit=' + editRight + '|move=' + editRight,
                        expiry: 'infinite',
                        reason: 'Permintaan disetujui: ' + levelName
                    }).done(function() {
                        // STEP 2: UPDATE STATUS TEKS
                        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: Article Protected' }).done(function() {
                                // STEP 3: PESAN OTOMATIS KE USER (PENTING!)
                                var msg = "\n== Notifikasi Perlindungan Artikel ==\nHalo [[" + requester + "]], permohonan perlindungan untuk artikel [[" + articlePage + "]] telah '''DISETUJUI''' (" + levelName + "). --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.47 (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: Rejected' }).done(function() {
                            var msg = "\n== Notifikasi Perlindungan ==\nHalo [[" + requester + "]], permohonan perlindungan artikel [[" + articlePage + "]] '''DITOLAK''' karena: ''" + alasan + "''. --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 17.47 (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();