Jump to content

MediaWiki:Common.js: Difference between revisions

From English Mippedia, general encyclopedia
No edit summary
Tags: Reverted Mobile edit Mobile web edit
No edit summary
Tags: Reverted Mobile edit Mobile web edit
Line 1: Line 1:
/* ==========================================================
/* ==========================================================
   🚀 MIPPEDIA DATA BUTTON ONLY (Otomatis - English Bridge Version)
   🚀 MIPPEDIA DATA BUTTON ONLY (Otomatis - Universal Bridge Version)
   Hanya memunculkan tombol jika data tersedia di pusat.
   Hanya memunculkan tombol jika data tersedia di pusat.
   Mendukung pencarian otomatis ke Mippedia ID secara mandiri tanpa interwiki manual.
   Mendukung penuh tampilan Mobile (Login/Anonim) & Desktop.
   ========================================================== */
   ========================================================== */
$(document).ready(function() {
$(document).ready(function() {
Line 21: Line 21:
                 action: 'query',
                 action: 'query',
                 list: 'search',
                 list: 'search',
                 srsearch: pageName, // Mencari padanan berdasarkan judul Inggris
                 srsearch: pageName,
                 srlimit: 1,
                 srlimit: 1,
                 format: 'json',
                 format: 'json',
Line 28: Line 28:
             dataType: 'json',
             dataType: 'json',
             success: function(wikiRes) {
             success: function(wikiRes) {
                 var targetDataPage = pageName; // Fallback jika tidak ditemukan
                 var targetDataPage = pageName;
                  
                  
                 if (wikiRes && wikiRes.query && wikiRes.query.search && wikiRes.query.search.length > 0) {
                 if (wikiRes && wikiRes.query && wikiRes.query.search && wikiRes.query.search.length > 0) {
                    // Ketemu judul bahasa Indonesianya secara otomatis dari sistem search internal
                     targetDataPage = wikiRes.query.search[0].title;
                     targetDataPage = wikiRes.query.search[0].title;
                 }
                 }
                  
                  
                // Format spasi menjadi underscore untuk validasi nama halaman MediaWiki
                 targetDataPage = targetDataPage.replace(/\s+/g, '_');
                 targetDataPage = targetDataPage.replace(/\s+/g, '_');


                 // Langkah 2: Cek langsung ke Mippedia Data menggunakan nama halaman Indonesia hasil pelacakan
                 // Langkah 2: Cek langsung ke Mippedia Data
                 $.ajax({
                 $.ajax({
                     url: dataDomain + '/api.php',
                     url: dataDomain + '/api.php',
                     data: {  
                     data: { action: 'query', titles: targetDataPage, format: 'json', origin: '*' },
                        action: 'query',  
                        titles: targetDataPage,  
                        format: 'json',  
                        origin: '*'  
                    },
                     dataType: 'jsonp',
                     dataType: 'jsonp',
                     success: function(res) {
                     success: function(res) {
Line 52: Line 45:
                             var pages = res.query.pages;
                             var pages = res.query.pages;
                             var isExist = false;
                             var isExist = false;
                           
                             for (var id in pages) { if (parseInt(id) > 0) { isExist = true; break; } }
                             for (var id in pages) {
                                if (parseInt(id) > 0) {
                                    isExist = true;
                                    break;
                                }
                            }


                            // Jika data valid ditemukan di pusat, munculkan tombol melayang
                             if (isExist) {
                             if (isExist) {
                                 injectFloatingDataBtn(targetDataPage, dataDomain);
                                 injectFloatingDataBtn(targetDataPage, dataDomain);
Line 69: Line 55:
             },
             },
             error: function() {
             error: function() {
                // Jika server Wiki Indonesia down, langsung pakai nama asli Inggris-nya sebagai fallback akhir
                 var nativePage = pageName.replace(/\s+/g, '_');
                 var nativePage = pageName.replace(/\s+/g, '_');
                 $.ajax({
                 $.ajax({
Line 89: Line 74:
         if ($('#mippedia-data-btn').length) return;
         if ($('#mippedia-data-btn').length) return;


         // Otak Cerdas: Ambil link render resolusi tinggi (64px) dari server agar tidak buram
        var currentSkin = mw.config.get('skin');
 
         // Tarik resolusi tinggi (128px) dari server agar di kondisi mana pun tetep Ultra HD / Tajam
         var api = new mw.Api();
         var api = new mw.Api();
         api.get({
         api.get({
Line 96: Line 83:
             prop: 'imageinfo',
             prop: 'imageinfo',
             iiprop: 'url',
             iiprop: 'url',
             iiurlwidth: 64,  
             iiurlwidth: 128,  
             format: 'json'
             format: 'json'
         }).done(function(data) {
         }).done(function(data) {
Line 107: Line 94:
                     }
                     }
                 }
                 }
             } catch (e) {
             } catch (e) { imageUrl = ''; }
                imageUrl = '';
            }


             if (!imageUrl) return;
             if (!imageUrl) return;


            // Inisialisasi tombol dasar
             var $btn = $('<a>', {
             var $btn = $('<a>', {
                 id: 'mippedia-data-btn',
                 id: 'mippedia-data-btn',
                 href: domain + '/wiki/' + encodeURIComponent(name),
                 href: domain + '/wiki/' + encodeURIComponent(name),
                 target: '_blank',
                 target: '_blank',
                // top: 2px dan right: 12px disesuaikan agar pas di barisan menu mobile minerva
                 style: 'z-index: 1000; text-decoration: none; display: inline-block; transition: transform 0.2s; position: absolute;',
                 style: 'position: absolute; right: 12px; top: 2px; z-index: 1000; text-decoration: none; display: inline-block; transition: transform 0.2s;',
                 html: $('<img>', {
                 html: $('<img>', {
                     src: imageUrl,
                     src: imageUrl,
                     alt: 'Data Icon',
                     alt: 'Data Icon',
                    // Memaksa dimensi tampilan ke 20px agar seukuran dengan tombol bintang/edit bawaan
                     style: 'height: 20px; width: 20px; display: block; opacity: 0.85; vertical-align: middle;'
                     style: 'height: 20px; width: 20px; display: block; opacity: 0.85; vertical-align: middle;'
                 })
                 })
             });
             });


            // Efek interaksi hover/touch tipis
             $btn.hover(
             $btn.hover(
                 function() { $(this).css({ 'transform': 'scale(1.1)', 'opacity': '1' }); },
                 function() { $(this).css({ 'transform': 'scale(1.15)', 'opacity': '1' }); },
                 function() { $(this).css({ 'transform': 'scale(1.0)', 'opacity': '0.85' }); }
                 function() { $(this).css({ 'transform': 'scale(1.0)', 'opacity': '0.85' }); }
             );
             );


             var $target = $('.page-actions-menu, .mw-editsection-visualeditor, #ca-edit, .minerva__tab-container').first();
             // 🛠️ STRATEGI DOCKING POSISI BERDASARKAN SKIN & STATUS LOGIN
           
            if (currentSkin === 'minerva') {
            if ($target.length) {
                // TAMPILAN MOBILE (MINERVA)
                $target.css('position', 'relative').append($btn);
                var $actionMenu = $('.page-actions-menu');
               
                if ($actionMenu.length && $actionMenu.is(':visible')) {
                    // Kondisi 1: User Login (Menu Aksi Aktif Sempurna)
                    $actionMenu.css('position', 'relative');
                    $btn.css({ 'right': '12px', 'top': '2px' });
                    $actionMenu.append($btn);
                } else {
                    // Kondisi 2: User Belum Login / Menu Aksi Menyusut
                    // Kita tempelkan langsung sejajar di sisi kanan baris Judul Utama (firstHeading)
                    var $heading = $('#firstHeading');
                    $heading.css({ 'position': 'relative', 'padding-right': '40px' });
                    $btn.css({ 'right': '10px', 'top': '5px' });
                    $heading.append($btn);
                }
             } else {
             } else {
                 $('#firstHeading').css('position', 'relative').append($btn);
                 // TAMPILAN DESKTOP (Vector / Skin Desktop Lainnya)
                 $btn.css('top', '8px');  
                // Di desktop, tempat paling rapi adalah di sebelah kiri barisan Tab Atas (Read, Edit, View History)
                var $desktopTarget = $('#p-views ul, .vector-menu-content-list').first();
               
                if ($desktopTarget.length) {
                    // Dibungkus `<li>` agar menyatu secara alami dengan struktur menu desktop MediaWiki
                    var $wrapperLi = $('<li>', {
                        style: 'display: inline-block; vertical-align: middle; margin-right: 12px; margin-left: 8px; position: relative; padding-top: 10px;'  
                    });
                    $btn.css({ 'position': 'static', 'display': 'inline-block' });
                    $wrapperLi.append($btn);
                    $desktopTarget.prepend($wrapperLi);
                 } else {
                    // Fallback aman Desktop jika tab tidak ketemu
                    var $headingDesktop = $('#firstHeading');
                    $headingDesktop.css('position', 'relative');
                    $btn.css({ 'right': '20px', 'top': '10px' });
                    $headingDesktop.append($btn);
                }
             }
             }
         });
         });
     }
     }
});
});

Revision as of 12:34, 29 May 2026

/* ==========================================================
   🚀 MIPPEDIA DATA BUTTON ONLY (Otomatis - Universal Bridge Version)
   Hanya memunculkan tombol jika data tersedia di pusat.
   Mendukung penuh tampilan Mobile (Login/Anonim) & Desktop.
   ========================================================== */
$(document).ready(function() {
    var pageName = mw.config.get('wgPageName').replace(/_/g, ' ');
    var namespace = mw.config.get('wgNamespaceNumber');
    var dataDomain = 'https://data.mippedia.org';
    
    // Alamat API Mippedia Bahasa Indonesia
    var indonesianWikiApi = 'https://id.mippedia.org/api.php'; 

    // Jalankan hanya di namespace artikel resmi
    if (namespace === 0) {
        
        // Langkah 1: Tembak API Mippedia Indonesia untuk mencari padanan halaman paling relevan
        $.ajax({
            url: indonesianWikiApi,
            data: {
                action: 'query',
                list: 'search',
                srsearch: pageName,
                srlimit: 1,
                format: 'json',
                origin: '*'
            },
            dataType: 'json',
            success: function(wikiRes) {
                var targetDataPage = pageName;
                
                if (wikiRes && wikiRes.query && wikiRes.query.search && wikiRes.query.search.length > 0) {
                    targetDataPage = wikiRes.query.search[0].title;
                }
                
                targetDataPage = targetDataPage.replace(/\s+/g, '_');

                // Langkah 2: Cek langsung ke Mippedia Data
                $.ajax({
                    url: dataDomain + '/api.php',
                    data: { action: 'query', titles: targetDataPage, format: 'json', origin: '*' },
                    dataType: 'jsonp',
                    success: function(res) {
                        if (res && res.query && res.query.pages) {
                            var pages = res.query.pages;
                            var isExist = false;
                            for (var id in pages) { if (parseInt(id) > 0) { isExist = true; break; } }

                            if (isExist) {
                                injectFloatingDataBtn(targetDataPage, dataDomain);
                            }
                        }
                    }
                });
            },
            error: function() {
                var nativePage = pageName.replace(/\s+/g, '_');
                $.ajax({
                    url: dataDomain + '/api.php',
                    data: { action: 'query', titles: nativePage, format: 'json', origin: '*' },
                    dataType: 'jsonp',
                    success: function(res) {
                        var pages = res.query.pages;
                        var isExist = false;
                        for (var id in pages) { if (parseInt(id) > 0) { isExist = true; break; } }
                        if (isExist) { injectFloatingDataBtn(nativePage, dataDomain); }
                    }
                });
            }
        });
    }

    function injectFloatingDataBtn(name, domain) {
        if ($('#mippedia-data-btn').length) return;

        var currentSkin = mw.config.get('skin');

        // Tarik resolusi tinggi (128px) dari server agar di kondisi mana pun tetep Ultra HD / Tajam
        var api = new mw.Api();
        api.get({
            action: 'query',
            titles: 'File:Locked_Data.svg',
            prop: 'imageinfo',
            iiprop: 'url',
            iiurlwidth: 128, 
            format: 'json'
        }).done(function(data) {
            var imageUrl = '';
            try {
                var pages = data.query.pages;
                for (var id in pages) {
                    if (pages[id].imageinfo && pages[id].imageinfo[0]) {
                        imageUrl = pages[id].imageinfo[0].thumburl || pages[id].imageinfo[0].url;
                    }
                }
            } catch (e) { imageUrl = ''; }

            if (!imageUrl) return;

            // Inisialisasi tombol dasar
            var $btn = $('<a>', {
                id: 'mippedia-data-btn',
                href: domain + '/wiki/' + encodeURIComponent(name),
                target: '_blank',
                style: 'z-index: 1000; text-decoration: none; display: inline-block; transition: transform 0.2s; position: absolute;',
                html: $('<img>', {
                    src: imageUrl,
                    alt: 'Data Icon',
                    style: 'height: 20px; width: 20px; display: block; opacity: 0.85; vertical-align: middle;'
                })
            });

            $btn.hover(
                function() { $(this).css({ 'transform': 'scale(1.15)', 'opacity': '1' }); },
                function() { $(this).css({ 'transform': 'scale(1.0)', 'opacity': '0.85' }); }
            );

            // 🛠️ STRATEGI DOCKING POSISI BERDASARKAN SKIN & STATUS LOGIN
            if (currentSkin === 'minerva') {
                // TAMPILAN MOBILE (MINERVA)
                var $actionMenu = $('.page-actions-menu');
                
                if ($actionMenu.length && $actionMenu.is(':visible')) {
                    // Kondisi 1: User Login (Menu Aksi Aktif Sempurna)
                    $actionMenu.css('position', 'relative');
                    $btn.css({ 'right': '12px', 'top': '2px' });
                    $actionMenu.append($btn);
                } else {
                    // Kondisi 2: User Belum Login / Menu Aksi Menyusut
                    // Kita tempelkan langsung sejajar di sisi kanan baris Judul Utama (firstHeading)
                    var $heading = $('#firstHeading');
                    $heading.css({ 'position': 'relative', 'padding-right': '40px' });
                    $btn.css({ 'right': '10px', 'top': '5px' });
                    $heading.append($btn);
                }
            } else {
                // TAMPILAN DESKTOP (Vector / Skin Desktop Lainnya)
                // Di desktop, tempat paling rapi adalah di sebelah kiri barisan Tab Atas (Read, Edit, View History)
                var $desktopTarget = $('#p-views ul, .vector-menu-content-list').first();
                
                if ($desktopTarget.length) {
                    // Dibungkus `<li>` agar menyatu secara alami dengan struktur menu desktop MediaWiki
                    var $wrapperLi = $('<li>', { 
                        style: 'display: inline-block; vertical-align: middle; margin-right: 12px; margin-left: 8px; position: relative; padding-top: 10px;' 
                    });
                    $btn.css({ 'position': 'static', 'display': 'inline-block' });
                    $wrapperLi.append($btn);
                    $desktopTarget.prepend($wrapperLi);
                } else {
                    // Fallback aman Desktop jika tab tidak ketemu
                    var $headingDesktop = $('#firstHeading');
                    $headingDesktop.css('position', 'relative');
                    $btn.css({ 'right': '20px', 'top': '10px' });
                    $headingDesktop.append($btn);
                }
            }
        });
    }
});