Jump to content

MediaWiki:Common.js: Difference between revisions

From Megabonk Wiki
No edit summary
Tag: Reverted
No edit summary
Tag: Reverted
Line 1: Line 1:
mw.loader.using('mediawiki.api', function () {
/* === Inline Build Preview (row toggle + tabs + lazy load + cache) === */
  var api = new mw.Api();
mw.loader.using('mediawiki.api',function(){
  var cache = {}; // title -> { overviewHTML, strategyHTML }
var api=new mw.Api();var cache={};
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);
});


  function extractParts(html) {
/* === Optional: Vote→Cargo Sync (touch edit + throttled purge) ===
    var $wrap = $('<div>').html(html);
Enable if your build template contains: <!-- VOTE_TOUCH: {{{_VoteTouch|}}} -->
    var $overview = $wrap.find('.build-layout-container').first();
Keeps Cargo Votes fresh so backend "ORDER BY Votes DESC" stays correct.
    var $strategy = $wrap.find('.build-strategy').first();
*/
    return {
mw.loader.using(['mediawiki.api','mediawiki.util'],function(){
      overview: $overview.length ? $overview.prop('outerHTML') : '<div>Overview bulunamadı.</div>',
var voteUi=$('.vote, vote, .votenew, .voteny');if(!voteUi.length)return;
      strategy: $strategy.length ? $strategy.prop('outerHTML') : '<div>Strategy bulunamadı.</div>'
var title=mw.config.get('wgPageName')||'';var api=new mw.Api();
    };
var STORAGE_KEY='megabonk_vote_touch:'+title;var THROTTLE_SEC=60;
  }
function nowSec(){return Math.floor(Date.now()/1000);}
 
function canTouch(){try{var m=JSON.parse(localStorage.getItem(STORAGE_KEY)||'{}');return !m.ts||(nowSec()-m.ts)>=THROTTLE_SEC;}catch(e){return true;}}
  function loadBuild(title, cb) {
function setTouched(){localStorage.setItem(STORAGE_KEY,JSON.stringify({ts:nowSec()}));}
    if (cache[title]) return cb(cache[title]);
var purgeTargets=['Builds'];var purgeTimer=null;
 
function smartPurge(){if(purgeTimer)clearTimeout(purgeTimer);purgeTimer=setTimeout(function(){api.postWithToken('csrf',{action:'purge',titles:purgeTargets.join('|')});},500);}
    api.post({
function touchAndSave(){
      action: 'parse',
if(!canTouch())return;
      format: 'json',
api.get({action:'query',prop:'revisions',rvprop:'content|timestamp',rvslots:'main',titles:title,format:'json',maxlag:5}).done(function(res){
      page: title,
var pages=res.query&&res.query.pages;if(!pages)return;var pageObj=pages[Object.keys(pages)[0]];
      prop: 'text'
if(!pageObj||!pageObj.revisions||!pageObj.revisions.length)return;
    }).done(function (res) {
var rev=pageObj.revisions[0];var content=(rev.slots&&rev.slots.main&&rev.slots.main['*'])||rev['*']||'';var baseTs=rev.timestamp;
      var html = (res.parse && res.parse.text && res.parse.text['*']) || '';
var marker=/<!--\s*VOTE_TOUCH:\s*([^>]*)\s*-->/i;
      var parts = extractParts(html);
var d=new Date();var pad=function(n){return n<10?'0'+n:''+n;};
      cache[title] = { overviewHTML: parts.overview, strategyHTML: parts.strategy };
var stamp=''+d.getUTCFullYear()+pad(d.getUTCMonth()+1)+pad(d.getUTCDate())+pad(d.getUTCHours())+pad(d.getUTCMinutes())+pad(d.getUTCSeconds());
      cb(cache[title]);
if(marker.test(content)){content=content.replace(marker,'<!-- VOTE_TOUCH: '+stamp+' -->');}else{content+='\n<!-- VOTE_TOUCH: '+stamp+' -->\n';}
    }).fail(function () {
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();});
      cb({ overviewHTML: '<div>Yüklenemedi.</div>', strategyHTML: '<div>Yüklenemedi.</div>'});
});
    });
}
  }
var voteTimer=null;var obs=new MutationObserver(function(){if(voteTimer)clearTimeout(voteTimer);voteTimer=setTimeout(touchAndSave,600);});
 
obs.observe(document.body,{childList:true,subtree:true});
  function onToggleClick(btn) {
    var $btn = $(btn);
    var state = $btn.attr('data-state') || 'closed';
    var $row = $btn.closest('.build-row--interactive');
    var title = $row.attr('data-page');
    var $panel = $('.build-inline-panel[data-target="' + title.replace(/"/g,'&quot;') + '"]');
 
    if (state === 'open') {
      $btn.attr('data-state', 'closed').text('Göster');
      $panel.attr('hidden', true);
      return;
    }
 
    // önce diğer açık panelleri kapat (opsiyonel)
    $('.build-inline-panel:not([hidden])').attr('hidden', true);
    $('.br-toggle[data-state="open"]').attr('data-state','closed').text('Göster');
 
    $btn.attr('data-state', 'open').text('Gizle');
    $panel.removeAttr('hidden');
 
    // İlk açılışta yükle
    if (!$panel.data('loaded')) {
      loadBuild(title, function (data) {
        $panel.find('.tab-panel[data-tab="overview"]').html(data.overviewHTML);
        $panel.find('.tab-panel[data-tab="strategy"]').html(data.strategyHTML);
        $panel.data('loaded', '1');
      });
    }
  }
 
  // Satır düğmesi
  $(document).on('click', '.br-toggle', function () { onToggleClick(this); });
 
  // Basit sekme kontrolü
  $(document).on('click', '.build-inline-tabs .tab-btn', function () {
    var $btn = $(this);
    var tab = $btn.attr('data-tab');
    var $panel = $btn.closest('.build-inline-panel');
    $panel.find('.tab-btn').removeClass('active');
    $btn.addClass('active');
    $panel.find('.tab-panel').attr('hidden', true);
    $panel.find('.tab-panel[data-tab="' + tab + '"]').removeAttr('hidden');
  });
});
});

Revision as of 22:07, 4 October 2025

/* === Inline Build Preview (row toggle + tabs + lazy load + cache) === */
mw.loader.using('mediawiki.api',function(){
var api=new mw.Api();var cache={};
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) ===
Enable if your build template contains: <!-- VOTE_TOUCH: {{{_VoteTouch|}}} -->
Keeps Cargo Votes fresh so backend "ORDER BY Votes DESC" stays correct.
*/
mw.loader.using(['mediawiki.api','mediawiki.util'],function(){
var voteUi=$('.vote, vote, .votenew, .voteny');if(!voteUi.length)return;
var title=mw.config.get('wgPageName')||'';var api=new mw.Api();
var STORAGE_KEY='megabonk_vote_touch:'+title;var THROTTLE_SEC=60;
function nowSec(){return Math.floor(Date.now()/1000);}
function canTouch(){try{var m=JSON.parse(localStorage.getItem(STORAGE_KEY)||'{}');return !m.ts||(nowSec()-m.ts)>=THROTTLE_SEC;}catch(e){return true;}}
function setTouched(){localStorage.setItem(STORAGE_KEY,JSON.stringify({ts:nowSec()}));}
var purgeTargets=['Builds'];var purgeTimer=null;
function smartPurge(){if(purgeTimer)clearTimeout(purgeTimer);purgeTimer=setTimeout(function(){api.postWithToken('csrf',{action:'purge',titles:purgeTargets.join('|')});},500);}
function touchAndSave(){
if(!canTouch())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]];
if(!pageObj||!pageObj.revisions||!pageObj.revisions.length)return;
var rev=pageObj.revisions[0];var content=(rev.slots&&rev.slots.main&&rev.slots.main['*'])||rev['*']||'';var baseTs=rev.timestamp;
var marker=/<!--\s*VOTE_TOUCH:\s*([^>]*)\s*-->/i;
var d=new Date();var pad=function(n){return n<10?'0'+n:''+n;};
var stamp=''+d.getUTCFullYear()+pad(d.getUTCMonth()+1)+pad(d.getUTCDate())+pad(d.getUTCHours())+pad(d.getUTCMinutes())+pad(d.getUTCSeconds());
if(marker.test(content)){content=content.replace(marker,'<!-- VOTE_TOUCH: '+stamp+' -->');}else{content+='\n<!-- VOTE_TOUCH: '+stamp+' -->\n';}
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();});
});
}
var voteTimer=null;var obs=new MutationObserver(function(){if(voteTimer)clearTimeout(voteTimer);voteTimer=setTimeout(touchAndSave,600);});
obs.observe(document.body,{childList:true,subtree:true});
});