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


/* ==========================================================
/* ==========================================================
   🚀 MIPPEDIA DATA - UNIFIED SYSTEM (Sitelinks + Descriptions)
   🌐 MIPPEDIA SHORTDESC - DATA CENTER
   Status: INTEGRATED & ANTI-BENTROK
  Status: INDEPENDENT SYSTEM (Separated from Sitelinks)
   Storage: MediaWiki:ShortDesc-Data.json
   ========================================================== */
   ========================================================== */
(function($, mw) {
(function($, mw) {
    "use strict";
     $(document).ready(function() {
     $(document).ready(function() {
         if (mw.config.get('wgNamespaceNumber') !== 0 || mw.config.get('wgIsMainPage') || mw.config.get('wgAction') !== 'view') return;
         if (mw.config.get('wgNamespaceNumber') !== 0 || mw.config.get('wgIsMainPage')) return;


         var pageTitle = mw.config.get('wgPageName');
         var pageTitle = mw.config.get('wgPageName');
         var dataPage = 'MediaWiki:Sitelinks-Data.json';
         var storagePage = 'MediaWiki:ShortDesc-Data.json'; // File penyimpanan berbeda
         var isAdmin = mw.config.get('wgUserGroups').some(g => ['sysop', 'interface-admin'].includes(g));
         var isAdmin = mw.config.get('wgUserGroups').some(g => ['sysop', 'interface-admin'].includes(g));


         var projects = {
        // UI Box untuk Input Deskripsi
             'id': { name: 'ID', url: 'https://id.mippedia.org/api.php', base: 'https://id.mippedia.org/wiki/', color: '#6a5acd' },
         var html = `
            'en': { name: 'EN', url: 'https://en.mippedia.org/api.php', base: 'https://en.mippedia.org/wiki/', color: '#4169e1' },
             <div id="desc-manager" style="border: 2px solid #20b2aa; padding: 15px; background: #fff; margin-bottom: 20px; border-radius: 10px; font-family: sans-serif;">
            'concise': { name: 'Concise', url: 'https://concise.mippedia.org/api.php', base: 'https://concise.mippedia.org/wiki/', color: '#20b2aa' }
                <div style="font-weight: bold; color: #20b2aa; margin-bottom: 10px; display: flex; justify-content: space-between; align-items: center;">
        };
                    <span>📝 Mippedia Short Description</span>
                    <button id="desc-toggle" style="cursor:pointer; padding:2px 8px; font-size:11px;">Buka Editor</button>
                </div>
                <div id="desc-current" style="font-size: 13px; color: #666; font-style: italic;">Memuat data deskripsi...</div>
               
                <div id="desc-editor" style="display:none; margin-top: 10px; border-top: 1px solid #eee; padding-top: 10px;">
                    <div style="margin-bottom:8px;">
                        <label style="display:block; font-size:11px; font-weight:bold;">ID (Indonesia):</label>
                        <input type="text" id="desc-in-id" style="width:100%; padding:6px; border:1px solid #ccc; border-radius:4px;">
                    </div>
                    <div style="margin-bottom:8px;">
                        <label style="display:block; font-size:11px; font-weight:bold;">EN (English):</label>
                        <input type="text" id="desc-in-en" style="width:100%; padding:6px; border:1px solid #ccc; border-radius:4px;">
                    </div>
                    <div style="margin-bottom:12px;">
                        <label style="display:block; font-size:11px; font-weight:bold;">CONCISE (Ringkas):</label>
                        <input type="text" id="desc-in-concise" style="width:100%; padding:6px; border:1px solid #ccc; border-radius:4px;">
                    </div>
                    <button id="desc-save" style="width:100%; background:#20b2aa; color:white; border:none; padding:8px; border-radius:5px; font-weight:bold; cursor:pointer;">Simpan Deskripsi</button>
                </div>
            </div>`;


         // --- UI GENERATOR ---
         $('.mw-parser-output').prepend(html);
        var headerHtml = '<div id="mip-header" style="background:#f8f9fa; border:1px solid #ddd; border-left:6px solid #6a5acd; padding:18px; margin-bottom:25px; border-radius:6px;">' +
            '<div style="display:flex; align-items:center; gap:10px; margin-bottom:8px;">' +
            '<span style="background:#6a5acd; color:white; padding:3px 10px; border-radius:4px; font-size:11px; font-weight:bold; text-transform:uppercase;">Basis Data Terstruktur</span></div>' +
            '<p style="margin:0; font-size:13px; color:#444; line-height:1.6;">Sinkronisasi otomatis deskripsi dan link antar-ekosistem Mippedia.</p></div>';


         var editorHtml = '<div id="mip-connector" style="background:#fff; border:1px solid #e2e8f0; border-radius:16px; padding:22px; margin-top:30px; box-shadow:0 10px 25px rgba(0,0,0,0.04);">' +
         // 1. Load data dari JSON
            '<div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:15px;">' +
        new mw.Api().get({ action: 'query', prop: 'revisions', titles: storagePage, rvprop: 'content', formatversion: 2 }).done(function(res) {
            '<strong style="font-size:15px; color:#1a202c;">Data & Link Ekosistem</strong>' +
             var content = res.query.pages[0].revisions ? res.query.pages[0].revisions[0].content : "{}";
            '<span id="mip-open-editor" style="cursor:pointer; font-size:18px; color:#6a5acd;">✎</span></div>' +
            var fullData = JSON.parse(content);
            '<div id="mip-display" style="display:flex; gap:8px; flex-wrap:wrap;"><small>Memuat data...</small></div>' +
             var myData = fullData[pageTitle] || {};
             '<div id="mip-editor" style="display:none; margin-top:20px; border-top:1px solid #eee; padding-top:15px;">' +
                Object.keys(projects).map(p => `
                    <div style="margin-bottom:15px; background:#fbfbfb; padding:10px; border-radius:8px;">
                        <div style="font-weight:bold; font-size:11px; color:#6a5acd; margin-bottom:5px;">MIPPEDIA ${projects[p].name}</div>
                        <input type="text" id="in-link-${p}" placeholder="Judul Artikel..." style="width:100%; padding:8px; border:1px solid #ddd; border-radius:5px; margin-bottom:5px;">
                        <input type="text" id="in-desc-${p}" placeholder="Deskripsi Singkat (ShortDesc)..." style="width:100%; padding:8px; border:1px solid #ddd; border-radius:5px;">
                    </div>`).join('') +
                '<button id="mip-save" style="width:100%; padding:12px; background:#6a5acd; color:white; border:none; border-radius:8px; font-weight:bold; cursor:pointer;">Simpan & Sinkronkan</button>' +
             '</div></div>';


        $('#mw-content-text').prepend(headerHtml);
            $('#desc-in-id').val(myData.id || '');
        $('#mw-content-text').append(editorHtml);
            $('#desc-in-en').val(myData.en || '');
            $('#desc-in-concise').val(myData.concise || '');
           
            $('#desc-current').html(`<b>Current:</b> ${myData.id || 'Belum ada deskripsi'}`);
        });


         // --- ENGINE ---
         $('#desc-toggle').click(function() { $('#desc-editor').slideToggle(); });
        function loadAllData() {
            new mw.Api().get({ action: 'query', prop: 'revisions', titles: dataPage, rvprop: 'content', formatversion: 2 }).done(function(d) {
                var json = d.query.pages[0].revisions ? JSON.parse(d.query.pages[0].revisions[0].content) : {};
                var pageData = json[pageTitle] || {};
                var $box = $('#mip-display').empty();


                Object.keys(projects).forEach(p => {
        // 2. Simpan data ke JSON
                    var link = pageData[p + '_link'];
        $('#desc-save').click(function() {
                    var desc = pageData[p + '_desc'];
            if (!isAdmin) { alert('Hanya Pengurus yang bisa menyimpan data.'); return; }
                    if (link) {
           
                        $box.append(`<a style="background:${projects[p].color}; color:white; padding:6px 12px; border-radius:6px; font-size:11px; text-decoration:none; margin-right:5px;" href="${projects[p].base + encodeURIComponent(link)}" target="_blank">${projects[p].name}: ${link}</a>`);
            var api = new mw.Api();
                        $('#in-link-' + p).val(link);
            var newData = {
                    }
                id: $('#desc-in-id').val().trim(),
                    if (desc) $('#in-desc-' + p).val(desc);
                en: $('#desc-in-en').val().trim(),
                });
                concise: $('#desc-in-concise').val().trim()
             });
             };
        }


        $(document).on('click', '#mip-save', function() {
            api.get({ action: 'query', prop: 'revisions', titles: storagePage, rvprop: 'content', formatversion: 2 }).done(function(r) {
            if (!isAdmin) { alert('Hanya Pengurus yang bisa akses!'); return; }
                 var json = r.query.pages[0].revisions ? JSON.parse(r.query.pages[0].revisions[0].content) : {};
            var api = new mw.Api();
                 json[pageTitle] = newData;
            var updatedData = {};
           
            Object.keys(projects).forEach(p => {
                 var l = $('#in-link-' + p).val().trim();
                var d = $('#in-desc-' + p).val().trim();
                if (l) updatedData[p + '_link'] = l;
                 if (d) updatedData[p + '_desc'] = d;
            });


            api.get({ action: 'query', prop: 'revisions', titles: dataPage, rvprop: 'content', formatversion: 2 }).done(function(r) {
                 api.postWithEditToken({
                var fullJson = r.query.pages[0].revisions ? JSON.parse(r.query.pages[0].revisions[0].content) : {};
                    action: 'edit',
                fullJson[pageTitle] = updatedData;
                    title: storagePage,
               
                    text: JSON.stringify(json, null, 2),
                 api.postWithEditToken({ action: 'edit', title: dataPage, text: JSON.stringify(fullJson, null, 2), summary: 'Unified Sync: ' + pageTitle })
                    summary: 'Update ShortDesc: ' + pageTitle
                .done(function() { location.reload(); });
                }).done(function() {
                    alert('Berhasil disimpan!');
                    location.reload();
                });
             });
             });
         });
         });
        $(document).on('click', '#mip-open-editor', function() { $('#mip-editor').slideToggle(); });
        loadAllData();
     });
     });
})(jQuery, mediaWiki);
})(jQuery, mediaWiki);