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 1.001: Baris 1.001:


/* ==========================================================
/* ==========================================================
   🔵 MIPPEDIA ULTIMATE VERIFICATION SYSTEM (V3 - HIGH SECURITY)
   🔵 MIPPEDIA ULTIMATE VERIFICATION SYSTEM (V4 - TOTAL LOCKDOWN)
   Fitur: Identitas Rahasia, Tombol Tolak, & Auto-Purge Data
   Fitur: Anti-Penyalahgunaan Manual, Auto-Delete Penyelundup, & Pop-up Larangan
   ========================================================== */
   ========================================================== */
$(document).ready(function() {
$(document).ready(function() {
Baris 1.019: Baris 1.019:
                 '<div style="margin-bottom:15px;">' + renderedImage + '</div>' +
                 '<div style="margin-bottom:15px;">' + renderedImage + '</div>' +
                 '<h2 style="margin:0 0 10px 0;color:#1a1a1a;font-family:sans-serif;font-size:20px;font-weight:bold;">Akun Terverifikasi</h2>' +
                 '<h2 style="margin:0 0 10px 0;color:#1a1a1a;font-family:sans-serif;font-size:20px;font-weight:bold;">Akun Terverifikasi</h2>' +
                 '<p style="color:#555;line-height:1.5;font-size:13px;margin-bottom:20px;font-family:sans-serif;">Mippedia telah mengonfirmasi bahwa identitas pemilik akun ini adalah asli. Lencana ini menandakan kredibilitas tinggi di dalam komunitas kami.</p>' +
                 '<p style="color:#555;line-height:1.5;font-size:13px;margin-bottom:20px;font-family:sans-serif;">Mippedia telah mengonfirmasi bahwa identitas pemilik akun ini adalah asli.</p>' +
                 '<button id="close-v-modal" style="background:#0095f6;color:#fff;border:none;padding:12px 0;width:100%;border-radius:10px;cursor:pointer;font-weight:bold;font-size:14px;">Mengerti</button>' +
                 '<button id="close-v-modal" style="background:#0095f6;color:#fff;border:none;padding:12px 0;width:100%;border-radius:10px;cursor:pointer;font-weight:bold;font-size:14px;">Mengerti</button>' +
                 '</div></div>';
                 '</div></div>';
Baris 1.063: Baris 1.063:
     });
     });


     // --- 3. AUTO-FILL TEKS PERMINTAAN (DENGAN FORM IDENTITAS RAHASIA) ---
     // --- 3. AUTO-FILL TEKS PERMINTAAN ---
     if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_verify_req')) {
     if (mw.config.get('wgAction') === 'edit' && sessionStorage.getItem('mippedia_verify_req')) {
         var identityTemplate =  
         var identityTemplate = "\n\n<div class='sysop-show' style='background:#fff5f5; border:1px solid #ff0000; padding:10px;'>\n=== Data Identitas Pemohon ===\n* '''Foto KTP/ID:''' [[Berkas:Isi_Nama_File_Di_Sini.jpg|thumb|150px]]\n* '''Foto Selfie dengan KTP:''' [[Berkas:Isi_Nama_File_Di_Sini.jpg|thumb|150px]]\n* '''Nama Lengkap:''' \n* '''Tautan Media Sosial:''' \n</div>";
            "\n\n\n" +
            "<div class='sysop-show' style='background:#fff5f5; border:1px solid #ff0000; padding:10px;'>\n" +
            "=== Data Identitas Pemohon ===\n" +
            "* '''Foto KTP/ID:''' [[Berkas:Isi_Nama_File_Di_Sini.jpg|thumb|150px]]\n" +
            "* '''Foto Selfie dengan KTP:''' [[Berkas:Isi_Nama_File_Di_Sini.jpg|thumb|150px]]\n" +
            "* '''Nama Lengkap:''' \n" +
            "* '''Tautan Media Sosial:''' \n" +
            "</div>\n" +
            "";
 
         var savedText = sessionStorage.getItem('mippedia_verify_req');
         var savedText = sessionStorage.getItem('mippedia_verify_req');
         $('#wpTextbox1').val(savedText + "\n\n**Persyaratan Verifikasi:** \n(Tulis alasan mengapa akun lo layak dapet centang biru, boys!) " + identityTemplate + "\n\n<div class='mippedia-status'>'''Status: 🕒 Sedang diverifikasi'''</div>\n\n--" + user);
         $('#wpTextbox1').val(savedText + "\n\n**Persyaratan Verifikasi:** \n(Tulis alasan lo, boys!) " + identityTemplate + "\n\n<div class='mippedia-status'>'''Status: 🕒 Sedang diverifikasi'''</div>\n\n--" + user);
         sessionStorage.removeItem('mippedia_verify_req');
         sessionStorage.removeItem('mippedia_verify_req');
     }
     }


     // --- 4. SEMBUNYIKAN DATA PRIVASI DARI NON-ADMIN ---
     // --- 4. PROTEKSI TOTAL (ANTI-MANUAL & ANTI-VANDAL) ---
     if (!isAdmin) {
     if (ns === 2 && (['edit', 'submit'].includes(mw.config.get('wgAction')))) {
        $('.sysop-show').hide();
        $('#editform').on('submit', function(e) {
            var $box = $('#wpTextbox1');
            var newContent = $box.val();
            var catName = "Category:Pengguna_Terverifikasi";
            var catPattern = /\[\[Category:Pengguna_Terverifikasi\]\]/gi;
           
            // Ambil konten asli sebelum diedit
            api.get({ action: 'query', prop: 'revisions', titles: pageName, rvprop: 'content' }).done(function(res) {
                var pages = res.query.pages;
                var oldContent = "";
                for (var id in pages) { oldContent = pages[id].revisions ? pages[id].revisions[0]['*'] : ""; }
 
                var isAdding = catPattern.test(newContent) && !catPattern.test(oldContent);
                var isRemoving = !catPattern.test(newContent) && catPattern.test(oldContent);
 
                // JIKA MENAMBAHKAN SECARA MANUAL (DILARANG KERAS UNTUK SIAPAPUN)
                if (isAdding && !sessionStorage.getItem('is_system_verify')) {
                    e.preventDefault();
                    var alertHtml = '<div id="mippedia-block-modal" style="position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(255,0,0,0.85);z-index:100000;display:flex;align-items:center;justify-content:center;color:#fff;font-family:sans-serif;">' +
                        '<div style="text-align:center; padding:20px; max-width:400px;">' +
                        '<h1 style="font-size:50px;">⚠️</h1>' +
                        '<h2>PELANGGARAN KERAS!</h2>' +
                        '<p>Dilarang menambahkan status <b>Pengguna Terverifikasi</b> secara manual. Status ini hanya bisa diberikan melalui jalur resmi Mippedia.</p>' +
                        '<button id="back-to-edit" style="background:#fff;color:#ff0000;border:none;padding:10px 20px;border-radius:5px;font-weight:bold;cursor:pointer;">KEMBALI</button>' +
                        '</div></div>';
                    $('body').append(alertHtml);
                    $('#back-to-edit').click(function() {
                        $('#mippedia-block-modal').remove();
                        $box.val(newContent.replace(catPattern, '')); // Otomatis hapus kodenya
                    });
                    return false;
                }
 
                // JIKA MENGHAPUS (Hanya Admin yang boleh)
                if (isRemoving && !isAdmin) {
                    e.preventDefault();
                    alert("⚠️ AKSES DITOLAK: Anda tidak memiliki wewenang untuk mencabut status verifikasi.");
                    $box.val(newContent + "\n[[Category:Pengguna_Terverifikasi]]"); // Paksa balikkan kodenya
                    return false;
                }
            });
        });
     }
     }


Baris 1.090: Baris 1.121:
         if (!$('#ca-verify-request').length) {
         if (!$('#ca-verify-request').length) {
             var $verifyLink = $('<li>').attr({'id': 'ca-verify-request', 'class': 'mw-list-item'}).append(
             var $verifyLink = $('<li>').attr({'id': 'ca-verify-request', 'class': 'mw-list-item'}).append(
                 $('<a>').attr({'href': '#', 'title': 'Minta Verifikasi'}).css({
                 $('<a>').attr({'href': '#', 'title': 'Minta Verifikasi'}).css({'display': 'flex', 'align-items': 'center', 'padding': '6px 12px'}).append(
                    'display': 'flex', 'align-items': 'center', 'padding': '6px 12px'
                }).append(
                     $('<span>').html('🔵 Verifikasi').css({'color': '#0095f6', 'font-weight': 'bold', 'margin-left': '2px'})
                     $('<span>').html('🔵 Verifikasi').css({'color': '#0095f6', 'font-weight': 'bold', 'margin-left': '2px'})
                 )
                 )
Baris 1.098: Baris 1.127:
             $verifyLink.click(function(e) {
             $verifyLink.click(function(e) {
                 e.preventDefault();
                 e.preventDefault();
                 sessionStorage.setItem('mippedia_verify_req', "Halo Pengurus Mippedia,\n\nSaya mengajukan permohonan verifikasi identitas akun untuk profil [[" + pageName + "]] sesuai dengan kebijakan komunitas.");
                 sessionStorage.setItem('mippedia_verify_req', "Halo Pengurus Mippedia,\n\nSaya mengajukan permohonan verifikasi identitas untuk profil [[" + pageName + "]].");
                 window.location.href = mw.util.getUrl("Pembicaraan_Pengguna:" + user, { action: 'edit', section: 'new', preloadtitle: 'Permintaan Verifikasi Profil Pengguna' });
                 window.location.href = mw.util.getUrl("Pembicaraan_Pengguna:" + user, { action: 'edit', section: 'new', preloadtitle: 'Permintaan Verifikasi Profil Pengguna' });
             });
             });
Baris 1.105: Baris 1.134:
     }
     }


     // --- 6. PANEL ADMIN VERIFIKASI (APPROVE & REJECT) ---
     // --- 6. PANEL ADMIN (APPROVE & REJECT) ---
     if (ns === 3 && isAdmin && $('#mw-content-text').text().includes("Sedang diverifikasi")) {
     if (ns === 3 && isAdmin && $('#mw-content-text').text().includes("Sedang diverifikasi")) {
         var targetUserPage = "Pengguna:" + mw.config.get('wgTitle');
         var targetUserPage = "Pengguna:" + mw.config.get('wgTitle');
Baris 1.116: Baris 1.145:


             var $panel = $('<div style="background:#f0f7ff; border:2px solid #0095f6; padding:15px; border-radius:12px; margin-bottom:15px; display:flex; flex-direction:column; gap:10px;">' +
             var $panel = $('<div style="background:#f0f7ff; border:2px solid #0095f6; padding:15px; border-radius:12px; margin-bottom:15px; display:flex; flex-direction:column; gap:10px;">' +
                 '<div><b style="color:#0095f6;">🔵 ADMIN VERIFICATION PANEL</b><br><small>Memproses permohonan: <b>'+requester+'</b></small></div></div>');
                 '<div><b style="color:#0095f6;">🔵 ADMIN PANEL</b><br><small>User: '+requester+'</small></div></div>');
              
              
             var $btnGroup = $('<div style="display:flex; gap:10px;"></div>');
             var $btnGroup = $('<div style="display:flex; gap:10px;"></div>');
Baris 1.122: Baris 1.151:
             var $btnReject = $('<button>').text('❌ TOLAK').css({'background':'#ff4d4d','color':'#fff','padding':'8px 15px','border':'none','border-radius':'6px','cursor':'pointer','font-weight':'bold'});
             var $btnReject = $('<button>').text('❌ TOLAK').css({'background':'#ff4d4d','color':'#fff','padding':'8px 15px','border':'none','border-radius':'6px','cursor':'pointer','font-weight':'bold'});


            // LOGIKA SETUJUI
             $btnApprove.click(function() {
             $btnApprove.click(function() {
                 $(this).prop('disabled', true).text('Approving...');
                 $(this).prop('disabled', true).text('Approving...');
                 sessionStorage.setItem('is_system_verify', 'true');
                 sessionStorage.setItem('is_system_verify', 'true');
                 api.postWithToken('edit', { action: 'edit', title: targetUserPage, appendtext: '\n[[Category:Pengguna_Terverifikasi]]', summary: 'Akun Terverifikasi'
                 api.postWithToken('edit', { action: 'edit', title: targetUserPage, appendtext: '\n[[Category:Pengguna_Terverifikasi]]', summary: 'Approved'
                 }).then(function() {
                 }).then(function() {
                    // HAPUS DATA PRIVASI OTOMATIS SAAT DISETUJUI
                     var cleanText = oldContent.replace(/<div class='sysop-show'[\s\S]*?<\/div>/g, "''(Data identitas telah dihapus otomatis)''");
                     var cleanText = oldContent.replace(/<div class='sysop-show'[\s\S]*?<\/div>/g, "''(Data identitas telah dihapus otomatis demi keamanan tingkat tinggi)''");
                     var newText = cleanText.replace("Status: 🕒 Sedang diverifikasi", "Status: ✅ '''Akun Terverifikasi''' 🔵");
                     var newText = cleanText.replace("Status: 🕒 Sedang diverifikasi", "Status: ✅ '''Akun Terverifikasi''' 🔵");
                     return api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Approved & Purged Identity Data' });
                     return api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Approved' });
                 }).then(function() {
                 }).then(function() {
                     var msg = "\n== Selamat! Profil Anda Terverifikasi ==\nHalo [["+requester+"]],\n\nKabar gembira! Tim Pengurus Mippedia telah meninjau data identitas Anda dan memutuskan untuk **MENYETUJUI** permohonan verifikasi Anda. Akun Anda kini memiliki lencana centang biru 🔵 sebagai tanda kredibilitas asli.\n\nData identitas yang Anda kirimkan telah kami hapus secara otomatis dari sistem kami demi menjaga keamanan privasi Anda. Terima kasih telah berkontribusi di Mippedia! --[[Pengguna:Admin|Admin]]";
                     var msg = "\n== Profil Terverifikasi ==\nHalo [["+requester+"]], akun Anda resmi terverifikasi. Data identitas Anda telah dihapus demi keamanan. --[[Pengguna:Admin|Admin]]";
                     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() {  
Baris 1.141: Baris 1.168:
             });
             });


            // LOGIKA TOLAK
             $btnReject.click(function() {
             $btnReject.click(function() {
                 $(this).prop('disabled', true).text('Rejecting...');
                 $(this).prop('disabled', true).text('Rejecting...');
                // HAPUS DATA PRIVASI OTOMATIS SAAT DITOLAK
                 var cleanText = oldContent.replace(/<div class='sysop-show'[\s\S]*?<\/div>/g, "''(Data identitas telah dihapus otomatis)''");
                 var cleanText = oldContent.replace(/<div class='sysop-show'[\s\S]*?<\/div>/g, "''(Data identitas telah dihapus otomatis demi keamanan tingkat tinggi)''");
                 var newText = cleanText.replace("Status: 🕒 Sedang diverifikasi", "Status: ❌ '''Permintaan Ditolak'''");
                 var newText = cleanText.replace("Status: 🕒 Sedang diverifikasi", "Status: ❌ '''Permintaan Ditolak'''");
               
                 api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Rejected'
                 api.postWithToken('edit', { action: 'edit', title: pageName, text: newText, summary: 'Rejected & Purged Identity Data'
                 }).then(function() {
                 }).then(function() {
                     var msg = "\n== Informasi: Permintaan Verifikasi Belum Disetujui ==\nHalo [["+requester+"]],\n\nMohon maaf, setelah melakukan peninjauan terhadap data yang Anda kirimkan, Tim Pengurus Mippedia memutuskan untuk **BELUM DAPAT MENYETUJUI** permohonan verifikasi Anda saat ini. Hal ini bisa disebabkan oleh data yang kurang jelas atau tidak memenuhi kriteria verifikasi kami.\n\nJangan khawatir, data identitas sensitif yang Anda kirimkan sudah kami hapus secara otomatis demi keamanan Anda. Anda dapat mengajukan permohonan kembali di masa mendatang dengan data yang lebih lengkap. --[[Pengguna:Admin|Admin]]";
                     var msg = "\n== Informasi Verifikasi ==\nHalo [["+requester+"]], permohonan Anda belum disetujui saat ini. Data sensitif Anda sudah kami hapus. --[[Pengguna:Admin|Admin]]";
                     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() { location.reload(); });
                    location.reload();  
                });
             });
             });