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 AUTO-PROTECTION SYSTEM
   🛡️ MIPPEDIA SMART PROTECTION SYSTEM (ALL-IN-ONE)
  Fitur: Request Protect, Auto-Lock, & Notif
   ========================================================== */
   ========================================================== */
$(document).ready(function() {
$(document).ready(function() {
Baris 648: Baris 647:
     var $content = $('#mw-content-text');
     var $content = $('#mw-content-text');


     // --- 1. AUTO-FILL TEKS PERLINDUNGAN ---
     // --- 1. AUTO-FILL DENGAN DURASI & JENIS (PENGGUNA) ---
     if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_protect_text')) {
     if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_prot_type')) {
         var savedText = sessionStorage.getItem('mippedia_protect_text');
         var type = sessionStorage.getItem('mippedia_prot_type');
         $('#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);
         var duration = prompt("Berapa lama perlindungan diinginkan? (contoh: 1 week, 1 month, atau infinite)", "infinite");
         sessionStorage.removeItem('mippedia_protect_text');
       
        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 MINTA PERLINDUNGAN (DI HALAMAN BERKAS) ---
     // --- 2. TOMBOL DINAMIS & CEK STATUS (HALAMAN BERKAS) ---
     if (ns === 6) {
     if (ns === 6) {
         // Cek apakah halaman sudah dilindungi (lewat indikator teks atau status API)
         var api = new mw.Api();
         if (!$content.text().includes("Dilindungi")) {
         api.get({ action: 'query', prop: 'info', titles: pageName, inprop: 'protection' }).done(function(data) {
             var $protBtn = $('<button>').html('<span>🔒</span> Minta Perlindungan').css({
            var page = data.query.pages[Object.keys(data.query.pages)[0]];
                 'background': '#d33', 'color': '#fff', 'border': 'none', 'padding': '5px 15px',  
            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');
                 sessionStorage.setItem('mippedia_protect_text', "Halo Pengurus Mippedia,\n\nSaya memohon perlindungan (protection) untuk berkas [[:" + pageName + "]] guna menghindari penyalahgunaan.");
                  
                // 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 PERLINDUNGAN (DI HALAMAN PEMBICARAAN) ---
     // --- 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 && $content.text().includes("Permintaan Perlindungan")) {
             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 CONTROL</div>' +
                     '<div style="font-weight:bold; color:#d33; margin-bottom:10px;">🛡️ ADMIN ACTION: PROTECTION</div>' +
                     '<p style="font-size:11px;">Pilih tingkat perlindungan untuk berkas ini:</p></div>');
                     '<p style="font-size:11px;">Permintaan: <b>' + levelLabel + '</b> | Durasi: <b>' + targetDur + '</b></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 $btnApprove = $('<button>').text('✅ SETUJUI & KUNCI').css({'background':'#d33','color':'#fff','border':'none','padding':'8px 15px','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 15px','margin-left':'8px','cursor':'pointer'});
                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
                $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=' + editRight + '|move=' + editRight,
                         protections: 'edit=' + targetLevel + '|move=' + targetLevel,
                         expiry: expiry,
                         expiry: targetDur,
                         reason: 'Permintaan disetujui: ' + levelName
                         reason: 'Permintaan disetujui: ' + levelLabel
                     }).done(function() {
                     }).done(function() {
                         // STEP 2: UPDATE TEKS STATUS
                         // 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 newText = content.replace("Status: 🕒 Sedang diajukan", "Status: ✅ '''Dilindungi (" + levelName + ")'''");
                             var updatedContent = content.replace("Status: 🕒 Sedang diajukan", "Status: ✅ '''Disetujui (" + levelLabel + ")'''");
                              
                              
                             api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Status: Protection Granted' }).done(function() {
                             api.postWithToken('edit', { action: 'edit', title: pageName, text: updatedContent, summary: 'Status Updated: Protected' }).done(function() {
                                 // STEP 3: NOTIF USER
                                 // C. KIRIM PESAN OTOMATIS KE PENGGUNA (Gak boleh ilang!)
                                 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 16.53 (UTC)";
                                 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:
                         });
                         });
                     });
                     });
                 }
                 });


                $btnSemi.click(function() { executeProtect('autoconfirmed', 'Semi Perlindungan'); });
                $btnFull.click(function() { executeProtect('sysop', 'Perlindungan Penuh'); });
                 $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 newText = content.replace("Status: 🕒 Sedang diajukan", "Status: ❌ '''Ditolak'''\n\n''Alasan: " + alasan + "''");
                         var updatedContent = 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 16.53 (UTC)";
                         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($btnSemi, $btnFull, $btnReject);
                 $panel.append($btnApprove, $btnReject);
                 $('#mw-content-text').prepend($panel);
                 $('#mw-content-text').prepend($panel);
             }
             }