Jump to content

MediaWiki:Common.js: Difference between revisions

From Megabonk Wiki
No edit summary
Tag: Reverted
mNo edit summary
 
(17 intermediate revisions by the same user not shown)
Line 1: Line 1:
/* === Inline Build Preview (row toggle + tabs + lazy load + cache) === */
mw.loader.using(['mediawiki.util'], function () {
mw.loader.using('mediawiki.api',function(){
    $(function () {
var api=new mw.Api();var cache={};
        if (!window.nitroAds || !window.nitroAds.createAd) return;
function extractParts(h){var w=$('<div>').html(h);var ov=w.find('.build-layout-container').first();var st=w.find('.build-strategy').first();return{overviewHTML:ov.length?ov.prop('outerHTML'):'<div>Overview not found.</div>',strategyHTML:st.length?st.prop('outerHTML'):'<div>Strategy not found.</div>'};}
function loadBuild(t,cb){if(cache[t])return cb(cache[t]);api.post({action:'parse',format:'json',page:t,prop:'text'}).done(function(r){var html=(r.parse&&r.parse.text&&r.parse.text['*'])||'';var p=extractParts(html);cache[t]={overviewHTML:p.overviewHTML,strategyHTML:p.strategyHTML};cb(cache[t]);}).fail(function(){cb({overviewHTML:'<div>Failed to load.</div>',strategyHTML:'<div>Failed to load.</div>'});});}
function onToggle(e){e.preventDefault();var a=$(this);var s=a.attr('data-state')||'closed';var row=a.closest('.build-row--interactive');var title=row.attr('data-page');var panel=$('.build-inline-panel[data-target="'+title.replace(/"/g,'&quot;')+'"]');if(s==='open'){a.attr('data-state','closed').text('Show');panel.hide();return;}
$('.build-inline-panel:visible').hide();$('.br-toggle[data-state="open"]').attr('data-state','closed').text('Show');a.attr('data-state','open').text('Hide');panel.show();if(!panel.data('loaded')){loadBuild(title,function(d){panel.find('.tab-panel[data-tab="overview"]').html(d.overviewHTML);panel.find('.tab-panel[data-tab="strategy"]').html(d.strategyHTML);panel.data('loaded','1');});}}
function onTab(e){e.preventDefault();var b=$(this);var tab=b.attr('data-tab');var p=b.closest('.build-inline-panel');p.find('.tab-btn').removeClass('active');b.addClass('active');p.find('.tab-panel').hide();p.find('.tab-panel[data-tab="'+tab+'"]').show();}
$(document).on('click','.br-toggle',onToggle);$(document).on('click','.build-inline-tabs .tab-btn',onTab);
});


/* === Optional: Vote→Cargo Sync (touch edit + throttled purge) ===
        var isMainPage =
Enable if your build template contains: <!-- VOTE_TOUCH: {{{_VoteTouch|}}} -->
            mw.config.get('wgIsMainPage') ||
Keeps Cargo Votes fresh so backend "ORDER BY Votes DESC" stays correct.
            mw.config.get('wgPageName') === mw.config.get('wgMainPageTitle');
*/
 
mw.loader.using(['mediawiki.api','mediawiki.util'],function(){
        window.megabonkNitro = window.megabonkNitro || {};
var voteUi=$('.vote, vote, .votenew, .voteny');if(!voteUi.length)return;
        var flags = window.megabonkNitro;
var title=mw.config.get('wgPageName')||'';var api=new mw.Api();
 
var STORAGE_KEY='megabonk_vote_touch:'+title;var THROTTLE_SEC=60;
        function initTopBanner() {
function nowSec(){return Math.floor(Date.now()/1000);}
            if (isMainPage) return;
function canTouch(){try{var m=JSON.parse(localStorage.getItem(STORAGE_KEY)||'{}');return !m.ts||(nowSec()-m.ts)>=THROTTLE_SEC;}catch(e){return true;}}
            if (flags.topBannerInit) return;
function setTouched(){localStorage.setItem(STORAGE_KEY,JSON.stringify({ts:nowSec()}));}
            flags.topBannerInit = true;
var purgeTargets=['Builds'];var purgeTimer=null;
 
function smartPurge(){if(purgeTimer)clearTimeout(purgeTimer);purgeTimer=setTimeout(function(){api.postWithToken('csrf',{action:'purge',titles:purgeTargets.join('|')});},500);}
            var bannerId = 'megabonk_top_banner';
function touchAndSave(){
            var $bodyContent = $('#bodyContent');
if(!canTouch())return;
            if (!$bodyContent.length) return;
api.get({action:'query',prop:'revisions',rvprop:'content|timestamp',rvslots:'main',titles:title,format:'json',maxlag:5}).done(function(res){
 
var pages=res.query&&res.query.pages;if(!pages)return;var pageObj=pages[Object.keys(pages)[0]];
            var $banner = $('#' + bannerId);
if(!pageObj||!pageObj.revisions||!pageObj.revisions.length)return;
            if (!$banner.length) {
var rev=pageObj.revisions[0];var content=(rev.slots&&rev.slots.main&&rev.slots.main['*'])||rev['*']||'';var baseTs=rev.timestamp;
                $banner = $('<div>', {
var marker=/<!--\s*VOTE_TOUCH:\s*([^>]*)\s*-->/i;
                    id: bannerId,
var d=new Date();var pad=function(n){return n<10?'0'+n:''+n;};
                    'class': 'nitro-top-banner'
var stamp=''+d.getUTCFullYear()+pad(d.getUTCMonth()+1)+pad(d.getUTCDate())+pad(d.getUTCHours())+pad(d.getUTCMinutes())+pad(d.getUTCSeconds());
                }).css({
if(marker.test(content)){content=content.replace(marker,'<!-- VOTE_TOUCH: '+stamp+' -->');}else{content+='\n<!-- VOTE_TOUCH: '+stamp+' -->\n';}
                    margin: '10px 0 20px',
api.postWithToken('csrf',{action:'edit',title:title,text:content,summary:'Vote sync: refresh Cargo data (auto)',minor:1,bot:1,basetimestamp:baseTs,maxlag:5}).done(function(){setTouched();smartPurge();});
                    textAlign: 'center'
});
                });
}
                $bodyContent.prepend($banner);
var voteTimer=null;var obs=new MutationObserver(function(){if(voteTimer)clearTimeout(voteTimer);voteTimer=setTimeout(touchAndSave,600);});
            }
obs.observe(document.body,{childList:true,subtree:true});
 
            window.nitroAds.createAd(bannerId, {
                sizes: [
                    [728, 90],
                    [970, 90],
                    [320, 100],
                    [320, 50]
                ],
                geoDeny: ["RU"]
            });
        }
 
        function initSidebarAd() {
            if (flags.sidebarInit) return;
            flags.sidebarInit = true;
 
            var adId = 'megabonk_sidebar';
            var $menuContainer = $('.vector-main-menu-container');
            if (!$menuContainer.length) return;
 
            var $adDiv = $('#' + adId);
            if (!$adDiv.length) {
                $adDiv = $('<div>', {
                    id: adId,
                    'class': 'nitro-sidebar-ad'
                }).css({
                    margin: '20px 0',
                    textAlign: 'center'
                });
 
                $menuContainer.after($adDiv);
            }
 
            window.nitroAds.createAd(adId, {
                sizes: [
                    [300, 350],
                    [300, 250],
                    [300, 600],
                    [160, 600]
                ],
                geoDeny: ["RU"]
            });
        }
 
        function initAnchor() {
            if (flags.anchorInit) return;
            flags.anchorInit = true;
 
            window.nitroAds.createAd('megabonk_anchor', {
                format: "anchor-v2",
                anchor: "bottom",
                anchorBgColor: "transparent",
                anchorClose: false,
                anchorPersistClose: false,
                anchorStickyOffset: 0,
                mediaQuery: "(min-width: 0px)",
                geoDeny: ["RU"]
            });
        }
 
        function initVideo() {
            if (flags.videoInit) return;
            flags.videoInit = true;
 
            window.nitroAds.createAd('megabonk_video', {
                format: "floating",
                geoDeny: ["RU"]
            });
        }
 
        function initSticky() {
            if (flags.stickyInit) return;
            flags.stickyInit = true;
 
            window.nitroAds.createAd('megabonk_sticky', {
                format: "rail",
                rail: "right",
                railOffsetTop: 0,
                railOffsetBottom: 0,
                railCollisionWhitelist: [],
                railCloseColor: "#666666",
                railSpacing: 5,
                railStack: true,
                railStickyTop: 0,
                railVerticalAlign: "center",
                sizes: [
                    [160, 600],
                    [300, 250],
                    [300, 600]
                ],
                mediaQuery: "(min-width: 1025px)",
                geoDeny: ["RU"]
            });
        }
 
        initTopBanner();
        initSidebarAd();
        initAnchor();
        initVideo();
        initSticky();
    });
});
});

Latest revision as of 14:32, 24 November 2025

mw.loader.using(['mediawiki.util'], function () {
    $(function () {
        if (!window.nitroAds || !window.nitroAds.createAd) return;

        var isMainPage =
            mw.config.get('wgIsMainPage') ||
            mw.config.get('wgPageName') === mw.config.get('wgMainPageTitle');

        window.megabonkNitro = window.megabonkNitro || {};
        var flags = window.megabonkNitro;

        function initTopBanner() {
            if (isMainPage) return;
            if (flags.topBannerInit) return;
            flags.topBannerInit = true;

            var bannerId = 'megabonk_top_banner';
            var $bodyContent = $('#bodyContent');
            if (!$bodyContent.length) return;

            var $banner = $('#' + bannerId);
            if (!$banner.length) {
                $banner = $('<div>', {
                    id: bannerId,
                    'class': 'nitro-top-banner'
                }).css({
                    margin: '10px 0 20px',
                    textAlign: 'center'
                });
                $bodyContent.prepend($banner);
            }

            window.nitroAds.createAd(bannerId, {
                sizes: [
                    [728, 90],
                    [970, 90],
                    [320, 100],
                    [320, 50]
                ],
                geoDeny: ["RU"]
            });
        }

        function initSidebarAd() {
            if (flags.sidebarInit) return;
            flags.sidebarInit = true;

            var adId = 'megabonk_sidebar';
            var $menuContainer = $('.vector-main-menu-container');
            if (!$menuContainer.length) return;

            var $adDiv = $('#' + adId);
            if (!$adDiv.length) {
                $adDiv = $('<div>', {
                    id: adId,
                    'class': 'nitro-sidebar-ad'
                }).css({
                    margin: '20px 0',
                    textAlign: 'center'
                });

                $menuContainer.after($adDiv);
            }

            window.nitroAds.createAd(adId, {
                sizes: [
                    [300, 350],
                    [300, 250],
                    [300, 600],
                    [160, 600]
                ],
                geoDeny: ["RU"]
            });
        }

        function initAnchor() {
            if (flags.anchorInit) return;
            flags.anchorInit = true;

            window.nitroAds.createAd('megabonk_anchor', {
                format: "anchor-v2",
                anchor: "bottom",
                anchorBgColor: "transparent",
                anchorClose: false,
                anchorPersistClose: false,
                anchorStickyOffset: 0,
                mediaQuery: "(min-width: 0px)",
                geoDeny: ["RU"]
            });
        }

        function initVideo() {
            if (flags.videoInit) return;
            flags.videoInit = true;

            window.nitroAds.createAd('megabonk_video', {
                format: "floating",
                geoDeny: ["RU"]
            });
        }

        function initSticky() {
            if (flags.stickyInit) return;
            flags.stickyInit = true;

            window.nitroAds.createAd('megabonk_sticky', {
                format: "rail",
                rail: "right",
                railOffsetTop: 0,
                railOffsetBottom: 0,
                railCollisionWhitelist: [],
                railCloseColor: "#666666",
                railSpacing: 5,
                railStack: true,
                railStickyTop: 0,
                railVerticalAlign: "center",
                sizes: [
                    [160, 600],
                    [300, 250],
                    [300, 600]
                ],
                mediaQuery: "(min-width: 1025px)",
                geoDeny: ["RU"]
            });
        }

        initTopBanner();
        initSidebarAd();
        initAnchor();
        initVideo();
        initSticky();
    });
});