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 867: Baris 867:
                 api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Rejected' }).then(function() {
                 api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Rejected' }).then(function() {
                     var msg = "\n== Notifikasi ==\nSori [["+requester+"]], permintaan lo ditolak: " + alasan + " --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 19.40 (UTC)";
                     var msg = "\n== Notifikasi ==\nSori [["+requester+"]], permintaan lo ditolak: " + alasan + " --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 19.40 (UTC)";
                    return api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:"+requester, section: 'new', text: msg });
                }).done(function() {
                    location.reload();
                });
            });
            $panel.append($btnOk, $btnNo);
            $('#mw-content-text').prepend($panel);
        });
    }
});
/* ==========================================================
  🛡️ MIPPEDIA USER PAGE PROTECTION SYSTEM
  Khusus Namespace Pengguna - Versi Stabil, Rapi & 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 ---
    if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_user_protect')) {
        var savedText = sessionStorage.getItem('mippedia_user_protect');
        $('#wpTextbox1').val(savedText + "\n\n**Alasan Perlindungan:** \n(Tulis alasan kenapa halaman pengguna ini perlu dikunci, boys!) \n\n<div class='mippedia-status'>'''Status: 🕒 Sedang diajukan'''</div>\n\n--" + user);
        sessionStorage.removeItem('mippedia_user_protect');
    }
    // --- 2. TOMBOL DINAMIS (KHUSUS NAMESPACE PENGGUNA / NS 2) ---
    if (ns === 2 && user) {
        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 = protections.some(p => p.type === 'edit' && p.level === 'sysop');
            var isSemi = protections.some(p => p.type === 'edit' && p.level === 'autoconfirmed');
            if (isFull) return;
            var btnLabel = isSemi ? 'Proteksi Penuh' : 'Proteksi Profil';
            var reqType = isSemi ? 'Perlindungan Penuh' : 'Perlindungan';
            var $protLink = $('<li>').attr({
                'id': 'ca-protect-user-request',
                'class': 'mw-list-item'
            }).append(
                $('<a>').attr({'href': '#', 'title': 'Minta perlindungan halaman pengguna'}).css({
                    'display': 'flex',
                    'align-items': 'center',
                    'padding': '6px 12px'
                }).append(
                    $('<span>').html('🔒 ' + btnLabel).css({
                        'color': '#202122',
                        'font-weight': 'bold',
                        'margin-left': '2px'
                    })
                )
            );
            $protLink.click(function(e) {
                e.preventDefault();
                // Halaman Pengguna pake Pembicaraan Pengguna: (Namespace 3)
                var talkPage = "Pembicaraan_Pengguna:" + mw.config.get('wgTitle');
                sessionStorage.setItem('mippedia_user_protect', "Halo Pengurus,\n\nSaya memohon " + reqType + " untuk halaman pengguna [[" + pageName + "]] guna menghindari vandalisme profil.");
                window.location.href = mw.util.getUrl(talkPage, { action: 'edit', section: 'new', preloadtitle: 'Permintaan Perlindungan Halaman Pengguna' });
            });
            $('#p-cactions ul, #p-views ul').append($protLink);
        });
    }
    // --- 3. PANEL ADMIN (HALAMAN PEMBICARAAN PENGGUNA / NS 3) ---
    if (ns === 3 && isAdmin && $content.text().includes("Sedang diajukan")) {
        var api = new mw.Api();
        // Target perlindungan adalah halaman pengguna utamanya
        var targetUserPage = "Pengguna:" + mw.config.get('wgTitle');
       
        api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'user|content', rvlimit: 1 }).done(function(res) {
            var pg = res.query.pages[Object.keys(res.query.pages)[0]];
            var requester = pg.revisions[0].user;
            var oldContent = pg.revisions[0]['*'];
            if (!$content.text().includes("Permintaan Perlindungan Halaman Pengguna")) return;
            var $panel = $('<div style="background:#fff0f0; border:2px solid #d33; padding:15px; border-radius:10px; margin-bottom:15px;">' +
                '<b>🛡️ ADMIN USER-PAGE CONTROL</b><br><small>Request by: '+requester+'</small></div>');
           
            var $btnOk = $('<button>').text('✅ SETUJUI').css({'background':'#d33','color':'#fff','padding':'5px 12px','border':'none','cursor':'pointer','font-weight':'bold'});
            var $btnNo = $('<button>').text('❌ TOLAK').css({'background':'#555','color':'#fff','padding':'5px 12px','border':'none','cursor':'pointer','margin-left':'10px'});
            $btnOk.click(function() {
                var level = oldContent.includes("Penuh") ? "sysop" : "autoconfirmed";
                $(this).prop('disabled', true).text('Step 1/3...');
                // STEP 1: PROTEKSI
                api.postWithToken('csrf', {
                    action: 'protect', title: targetUserPage, protections: 'edit='+level+'|move='+level, expiry: 'infinite', reason: 'User Page Protection: Approved'
                }).then(function() {
                    // STEP 2: UPDATE STATUS
                    $btnOk.text('Step 2/3...');
                    var newText = oldContent.replace("Status: 🕒 Sedang diajukan", "Status: ✅ '''Dilindungi ("+level+")'''");
                    return api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Protection Status Updated' });
                }).then(function() {
                    // STEP 3: NOTIFIKASI OTOMATIS (KE USER)
                    $btnOk.text('Step 3/3...');
                    var msg = "\n== Notifikasi Perlindungan Profil ==\nHalo [["+requester+"]], permohonan perlindungan untuk halaman pengguna lo [["+targetUserPage+"]] udah disetujui dan aktif, boys! --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 19.48 (UTC)";
                    return api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:"+requester, section: 'new', text: msg });
                }).done(function() {
                    location.reload();
                });
            });
            $btnNo.click(function() {
                var alasan = prompt("Alasan penolakan:");
                if (!alasan) return;
                $(this).prop('disabled', true).text('Rejecting...');
                var newText = oldContent.replace("Status: 🕒 Sedang diajukan", "Status: ❌ '''Ditolak'''\n\nAlasan: " + alasan);
                api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Protection Rejected' }).then(function() {
                    var msg = "\n== Notifikasi ==\nHalo [["+requester+"]], permintaan perlindungan profil lo belum bisa disetujui karena: " + alasan + " --[[Pengguna:Admin|Admin]] ([[Pembicaraan Pengguna:Admin|bicara]]) 10 April 2026 19.48 (UTC)";
                     return api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:"+requester, section: 'new', text: msg });
                     return api.postWithToken('edit', { action: 'edit', title: "Pembicaraan_Pengguna:"+requester, section: 'new', text: msg });
                 }).done(function() {
                 }).done(function() {