MediaWiki:Common.js: Difference between revisions
Appearance
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 - | 🚀 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 | 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, | 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; | 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) { | ||
targetDataPage = wikiRes.query.search[0].title; | targetDataPage = wikiRes.query.search[0].title; | ||
} | } | ||
targetDataPage = targetDataPage.replace(/\s+/g, '_'); | targetDataPage = targetDataPage.replace(/\s+/g, '_'); | ||
// Langkah 2: Cek langsung ke Mippedia Data | // 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: '*' }, | ||
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 (isExist) { | if (isExist) { | ||
injectFloatingDataBtn(targetDataPage, dataDomain); | injectFloatingDataBtn(targetDataPage, dataDomain); | ||
| Line 69: | Line 55: | ||
}, | }, | ||
error: function() { | error: function() { | ||
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; | ||
// | 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: | iiurlwidth: 128, | ||
format: 'json' | format: 'json' | ||
}).done(function(data) { | }).done(function(data) { | ||
| Line 107: | Line 94: | ||
} | } | ||
} | } | ||
} catch (e) { | } catch (e) { 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', | ||
style: 'z-index: 1000; text-decoration: none; display: inline-block; transition: transform 0.2s; position: absolute;', | |||
style: ' | |||
html: $('<img>', { | html: $('<img>', { | ||
src: imageUrl, | src: imageUrl, | ||
alt: 'Data Icon', | alt: 'Data Icon', | ||
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;' | ||
}) | }) | ||
}); | }); | ||
$btn.hover( | $btn.hover( | ||
function() { $(this).css({ 'transform': 'scale(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 $ | // 🛠️ 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 { | } else { | ||
$('# | // TAMPILAN DESKTOP (Vector / Skin Desktop Lainnya) | ||
$btn.css('top' | // 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);
}
}
});
}
});