MediaWiki:Common.js: Porovnání verzí

Z Wiki JU
Ofara (diskuse | příspěvky)
Bez shrnutí editace
značka: revertováno
Ofara (diskuse | příspěvky)
Bez shrnutí editace
značka: revertováno
Řádek 64: Řádek 64:


/* Special:Search — Advanced profil, ns0 v URL, whitelist (remove z DOM), přejmenování,
/* Special:Search — Advanced profil, ns0 v URL, whitelist (remove z DOM), přejmenování,
   zachování voleb z URL, skrytí „Zapamatovat si…“, změna nadpisu */
   zachování voleb z URL, skrytí „Zapamatovat si…“, změna nadpisu, fix submitu formulářů */
(function () {
(function () {
   if (mw.config.get('wgCanonicalSpecialPageName') !== 'Search') return;
   if (mw.config.get('wgCanonicalSpecialPageName') !== 'Search') return;
Řádek 102: Řádek 102:
     'Kategorie'
     'Kategorie'
   ]);
   ]);
  // Přejmenování štítků (původní text → nový text)
   const RENAME = new Map([
   const RENAME = new Map([
     ['(Hlavní)', 'Stránky'],
     ['(Hlavní)', 'Stránky'],
Řádek 115: Řádek 113:
   const getContainer = () => document.querySelector('#mw-searchoptions, .mw-search-nsoptions');
   const getContainer = () => document.querySelector('#mw-searchoptions, .mw-search-nsoptions');


  // ── 3) Hlavní úprava UI + respektování voleb z URL ──
   function processOnce(root) {
   function processOnce(root) {
     if (!root || root.dataset.nsTweaked === '1') return;
     if (!root || root.dataset.nsTweaked === '1') return;
Řádek 140: Řádek 139:
     })();
     })();


     // Přečti explicitní volby z URL (nsX=1)
     // Přečti explicitní volby z URL (nsX=1) → zachovej při reloadu
     const sp = new URL(location.href).searchParams;
     const sp = new URL(location.href).searchParams;
     const requestedNs = new Set();
     const requestedNs = new Set();
Řádek 147: Řádek 146:
       if (m && v !== '0') requestedNs.add(parseInt(m[1], 10));
       if (m && v !== '0') requestedNs.add(parseInt(m[1], 10));
     }
     }
     const hasExplicitNs = requestedNs.size > 0; // po našem zajištění bude pravda (min. ns0)
     const hasExplicitNs = requestedNs.size > 0; // po zajištění výše je minimálně ns0


     // Najdi a zpracuj všechny checkboxy jmenných prostorů
     // Najdi a zpracuj checkboxy jmenných prostorů
     const cbs = root.querySelectorAll('input[type="checkbox"][id^="mw-search-ns"], input[type="checkbox"][name="ns[]"]');
     const cbs = root.querySelectorAll('input[type="checkbox"][id^="mw-search-ns"], input[type="checkbox"][name="ns[]"]');
     cbs.forEach(cb => {
     cbs.forEach(cb => {
Řádek 176: Řádek 175:
       if (!keep) { row.remove(); return; }
       if (!keep) { row.remove(); return; }


       // Nastavení zaškrtnutí:
       // Zaškrtnutí: respektuj explicitní URL; fallback (hypoteticky) jen ns0
      // - drž se explicitních voleb v URL (u nás vždy alespoň ns0=1),
      // - fallback (hypoteticky) jen Hlavní.
       if (!isNaN(nsId)) {
       if (!isNaN(nsId)) {
         if (hasExplicitNs) {
         if (hasExplicitNs) {
Řádek 186: Řádek 183:
         }
         }
       }
       }
    });
    // ── 4) FIX SUBMITU FORMULÁŘŮ — vždy pošli na Special:Search s profile=advanced + aktuálními NS ──
    function ensureHidden(form, name, value) {
      let i = form.querySelector(`input[name="${CSS.escape(name)}"]`);
      if (!i) {
        i = document.createElement('input');
        i.type = 'hidden';
        i.name = name;
        form.appendChild(i);
      }
      i.value = value;
    }
    const forms = document.querySelectorAll('form');
    forms.forEach(form => {
      const hasSearchInput = !!form.querySelector('input[name="search"], input[name="searchtext"]');
      if (!hasSearchInput) return;
      form.addEventListener('submit', function () {
        // přesměruj odeslání na Special:Search
        try { form.setAttribute('action', mw.util.getUrl('Special:Search')); } catch (e) { /* ignore */ }
        // základní parametry
        ensureHidden(form, 'profile', 'advanced');
        ensureHidden(form, 'ns0', '1');
        // přidej aktuální stavy viditelných checkboxů NS
        const nsBoxes = root.querySelectorAll('input[type="checkbox"][id^="mw-search-ns"]');
        nsBoxes.forEach(cb => {
          const m = cb.id.match(/mw-search-ns(\d+)/);
          if (!m) return;
          const name = 'ns' + m[1];
          // posílej jen "1" u zaškrtnutých; MediaWiki si nevyžádané NS bere jako 0
          if (cb.checked) ensureHidden(form, name, '1');
        });
      }, { capture: true });
     });
     });
   }
   }

Verze z 25. 9. 2025, 09:51

/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky */

//Zpětná vazba

$(function () {
  // Zruš jQuery UI vzhled tlačítka
  $('.articleFeedbackv5-submit').button('destroy');
});

document.addEventListener('DOMContentLoaded', function () {
  document.querySelectorAll('.extern-download').forEach(el => {
    el.style.cursor = 'pointer';
    el.style.color = '#0645AD';
    el.style.textDecoration = 'underline';
    el.addEventListener('click', () => {
      const a = document.createElement('a');
      a.href = el.getAttribute('data-url');
      a.setAttribute('download', '');
      a.style.display = 'none';
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
    });
  });
});

(function () {
  var NOTE_ID = 'af5-note';
  var NOTE_HTML =
    '<div id="' + NOTE_ID + '" class="articleFeedbackv5-note">' +
      '<b>Tento formulář slouží pouze jako zpětná vazba pro tuto stránku.</b> ' +
      'Řešíte-li nějaký problém, napište e-mail na ' +
      '<a href="/Servicedesk/Seznam_e-mailových_adres_pro_zadávání_požadavků">službu,</a> které se Váš problém týká.' +
    '</div>';

   function injectNote(root) {
    var $title = (root ? $(root) : $(document))
      .find('.articleFeedbackv5-title-wrap')
      .first();

    if (!$title.length) return false;                 // nadpis není
    if (document.getElementById(NOTE_ID)) return true; // už vloženo

    $title.after(NOTE_HTML);                          // vložit pod nadpis
    return true;
  }

  if (injectNote()) return;

  var obs = new MutationObserver(function (mutations) {
    for (var m of mutations) {
      if (injectNote(m.target)) {
        obs.disconnect();
        break;
      }
    }
  });

  obs.observe(document.body, { childList: true, subtree: true });
  setTimeout(function () { injectNote(); obs.disconnect(); }, 5000);
})();

//Vyhledávání

/* Special:Search — Advanced profil, ns0 v URL, whitelist (remove z DOM), přejmenování,
   zachování voleb z URL, skrytí „Zapamatovat si…“, změna nadpisu, fix submitu formulářů */
(function () {
  if (mw.config.get('wgCanonicalSpecialPageName') !== 'Search') return;

  // ── 1) Uprav URL jednorázově (profile=advanced + ns0=1) a reloadni, pokud bylo něco doplněno ──
  (function ensureUrlParams() {
    const url = new URL(location.href);
    let changed = false;

    if (url.searchParams.get('profile') !== 'advanced') {
      url.searchParams.set('profile', 'advanced');
      changed = true;
    }

    // když chybí ns0 nebo nejsou žádné ns parametry → přidej ns0=1
    const hasAnyNs = Array.from(url.searchParams.keys()).some(k => /^ns\d+$/.test(k));
    if (!hasAnyNs || !url.searchParams.has('ns0')) {
      url.searchParams.set('ns0', '1');
      changed = true;
    }

    if (changed) {
      location.replace(url.toString()); // jednorázový reload, žádná smyčka
      return;
    }
  })();

  // ── 2) Konfigurace ──
  // Standardní NS ID: 0 Hlavní, 6 Soubor, 10 Šablona, 14 Kategorie
  const ALLOW_IDS = new Set([0, 6, 10, 14]);
  const ALLOW_NAMES = new Set([
    '(Hlavní)', 'Hlavní', 'Stránky',
    'Aktuality',
    'PřF', 'Binolupa – Přírodovědecká fakulta',
    'Soubor', 'Soubory',
    'Šablona', 'Šablony',
    'Kategorie'
  ]);
  const RENAME = new Map([
    ['(Hlavní)', 'Stránky'],
    ['Hlavní',   'Stránky'],
    ['PřF',      'Binolupa – Přírodovědecká fakulta'],
    ['Soubor',   'Soubory'],
    ['Šablona',  'Šablony']
  ]);

  const norm = s => String(s || '').replace(/\u00A0/g, ' ').replace(/\s+/g, ' ').trim();
  const getContainer = () => document.querySelector('#mw-searchoptions, .mw-search-nsoptions');

  // ── 3) Hlavní úprava UI + respektování voleb z URL ──
  function processOnce(root) {
    if (!root || root.dataset.nsTweaked === '1') return;
    root.dataset.nsTweaked = '1';

    // Nadpis a skrytí horních profilových záložek
    const heading = root.querySelector('h4, legend');
    if (heading) heading.textContent = 'Co chcete vyhledávat?';
    const tabs = document.querySelector('.mw-search-profile-tabs');
    if (tabs) tabs.style.display = 'none';

    // Odstranit „Zapamatovat si výběr pro budoucí vyhledávání“
    (function hideRememberRow() {
      const input = root.querySelector('#mw-search-powersearch-remember');
      if (input) {
        const row = input.closest('.oo-ui-fieldLayout') || input.closest('div');
        if (row) row.remove();
      } else {
        const label = root.querySelector('label[for="mw-search-powersearch-remember"]');
        if (label) {
          const row = label.closest('.oo-ui-fieldLayout') || label.closest('div');
          if (row) row.remove();
        }
      }
    })();

    // Přečti explicitní volby z URL (nsX=1) → zachovej při reloadu
    const sp = new URL(location.href).searchParams;
    const requestedNs = new Set();
    for (const [k, v] of sp) {
      const m = /^ns(\d+)$/.exec(k);
      if (m && v !== '0') requestedNs.add(parseInt(m[1], 10));
    }
    const hasExplicitNs = requestedNs.size > 0; // po zajištění výše je minimálně ns0

    // Najdi a zpracuj checkboxy jmenných prostorů
    const cbs = root.querySelectorAll('input[type="checkbox"][id^="mw-search-ns"], input[type="checkbox"][name="ns[]"]');
    cbs.forEach(cb => {
      const row = cb.closest('.oo-ui-fieldLayout') || cb.closest('div');
      if (!row) return;

      const label = (cb.id && root.querySelector(`label[for="${cb.id}"]`)) || row.querySelector('label');
      if (!label) return;

      // ID jmenného prostoru
      let nsId = NaN;
      const m = cb.id && cb.id.match(/mw-search-ns(\d+)/);
      if (m) nsId = parseInt(m[1], 10);
      if (isNaN(nsId)) {
        const v = cb.getAttribute('value');
        if (v && /^\d+$/.test(v)) nsId = parseInt(v, 10);
      }

      // Původní text + přejmenování (vizuální)
      const orig = norm(label.textContent);
      if (RENAME.has(orig)) label.textContent = RENAME.get(orig);
      const current = norm(label.textContent);

      // Whitelist: co není povoleno, rovnou odstranit z DOM
      const keep = ALLOW_IDS.has(nsId) || ALLOW_NAMES.has(orig) || ALLOW_NAMES.has(current);
      if (!keep) { row.remove(); return; }

      // Zaškrtnutí: respektuj explicitní URL; fallback (hypoteticky) jen ns0
      if (!isNaN(nsId)) {
        if (hasExplicitNs) {
          cb.checked = requestedNs.has(nsId);
        } else {
          cb.checked = (nsId === 0);
        }
      }
    });

    // ── 4) FIX SUBMITU FORMULÁŘŮ — vždy pošli na Special:Search s profile=advanced + aktuálními NS ──
    function ensureHidden(form, name, value) {
      let i = form.querySelector(`input[name="${CSS.escape(name)}"]`);
      if (!i) {
        i = document.createElement('input');
        i.type = 'hidden';
        i.name = name;
        form.appendChild(i);
      }
      i.value = value;
    }

    const forms = document.querySelectorAll('form');
    forms.forEach(form => {
      const hasSearchInput = !!form.querySelector('input[name="search"], input[name="searchtext"]');
      if (!hasSearchInput) return;

      form.addEventListener('submit', function () {
        // přesměruj odeslání na Special:Search
        try { form.setAttribute('action', mw.util.getUrl('Special:Search')); } catch (e) { /* ignore */ }

        // základní parametry
        ensureHidden(form, 'profile', 'advanced');
        ensureHidden(form, 'ns0', '1');

        // přidej aktuální stavy viditelných checkboxů NS
        const nsBoxes = root.querySelectorAll('input[type="checkbox"][id^="mw-search-ns"]');
        nsBoxes.forEach(cb => {
          const m = cb.id.match(/mw-search-ns(\d+)/);
          if (!m) return;
          const name = 'ns' + m[1];
          // posílej jen "1" u zaškrtnutých; MediaWiki si nevyžádané NS bere jako 0
          if (cb.checked) ensureHidden(form, name, '1');
        });
      }, { capture: true });
    });
  }

  // Počkej, až se kontejner i checkboxy opravdu objeví, pak jednou zpracuj
  function waitAndRun(tries = 0) {
    const root = getContainer();
    const ready = root && root.querySelector('input[type="checkbox"][id^="mw-search-ns"], input[type="checkbox"][name="ns[]"]');
    if (ready) { processOnce(root); return; }
    if (tries < 60) setTimeout(() => waitAndRun(tries + 1), 100); // max ~6 s, bez smyček
  }

  document.addEventListener('DOMContentLoaded', waitAndRun);
  mw.hook('wikipage.content').add(waitAndRun);
})();