MediaWiki:Minerva.js: Unterschied zwischen den Versionen
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung Markierungen: Mobile Bearbeitung Mobile Web-Bearbeitung Erweiterte mobile Bearbeitung |
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| Zeile 2: | Zeile 2: | ||
/* Weitere Menüs für MobileFrontend & MinervaNeue (Mobile Ansicht) */ | /* Weitere Menüs für MobileFrontend & MinervaNeue (Mobile Ansicht) */ | ||
(function () { | |||
if (mw.config.get('skin') !== 'minerva') return; | |||
' | |||
// ---- KONFIG: Links als [Label, Seitentitel] ---- | |||
const LINKS = [ | |||
['Hauptkategorien', null], // Header/Toggle, kein Link | |||
['Alle A Dream of Scotland Abfüllungen', 'Kategorie:Alle A Dream of Scotland Abfüllungen'], | |||
['Alle A Dream of Ireland Abfüllungen', 'Kategorie:Alle A Dream of Ireland Abfüllungen'], | |||
['Alle A Dream of... – Der Rest der Welt', 'Kategorie:Alle A Dream of... – Der Rest der Welt Abfüllungen'], | |||
['Cigar Malt Übersicht', 'Kategorie:Cigar Malt Übersicht'], | |||
['Alle Rumbastic Abfüllungen', 'Kategorie:Alle Rumbastic Abfüllungen'], | |||
['The Tasteful 8', 'Kategorie:The Tasteful 8'], | |||
['Còmhlan Abfüllungen', 'Kategorie:Còmhlan Abfüllungen'], | |||
['Friendly Mr. Z Whiskytainment Abfüllungen', 'Kategorie:Friendly Mr. Z Whiskytainment Abfüllungen'], | |||
['Die Whisky Elfen Abfüllungen', 'Kategorie:Die Whisky Elfen Abfüllungen'], | |||
['The Fine Art of Whisky Abfüllungen', 'Kategorie:The Fine Art of Whisky Abfüllungen'], | |||
['The Forbidden Kingdom', 'Kategorie:The Forbidden Kingdom'] | |||
]; | |||
const BLOCK_ID = 'ados-custom-links'; | |||
function findMenuList() { | |||
return ( | |||
document.querySelector('#mw-mf-main-menu nav ul') || | |||
document.querySelector('#mw-mf-main-menu ul') || | |||
document.querySelector('.minerva-main-menu .menu__list') || | |||
document.querySelector('.menu__list') || | |||
document.querySelector('.menu') | |||
); | |||
} | |||
function build() { | |||
const host = findMenuList(); | |||
if (!host) return false; | |||
if (document.getElementById(BLOCK_ID)) return true; // schon vorhanden | |||
const ul = document.createElement('ul'); | |||
ul.id = BLOCK_ID; | |||
ul.className = 'toggle-list__list'; | |||
// Header/Toggle | |||
<span class="minerva-icon"></span> | const [headerLabel] = LINKS[0]; | ||
<span class="toggle-list-item__label"> | const headerLi = document.createElement('li'); | ||
headerLi.className = 'toggle-list-item'; | |||
const headerBtn = document.createElement('button'); | |||
headerBtn.type = 'button'; | |||
headerBtn.className = 'toggle-list-item__anchor'; | |||
headerBtn.setAttribute('aria-expanded', 'true'); | |||
headerBtn.innerHTML = | |||
'<span class="minerva-icon minerva-icon--listBullet"></span>' + | |||
`<span class="toggle-list-item__label">${headerLabel}</span>`; | |||
headerLi.appendChild(headerBtn); | |||
ul.appendChild(headerLi); | |||
// Container für die eigentlichen Links (collapsible) | |||
const innerUl = document.createElement('ul'); | |||
innerUl.className = 'toggle-list__list'; | |||
innerUl.style.marginLeft = '12px'; | |||
for (let i = 1; i < LINKS.length; i++) { | |||
const [label, title] = LINKS[i]; | |||
const li = document.createElement('li'); | |||
li.className = 'toggle-list-item'; | |||
const a = document.createElement('a'); | |||
a.className = 'toggle-list-item__anchor'; | |||
a.textContent = label; | |||
if (title) { | |||
// sichere URL auf Basis des Seitentitels (Sonderzeichen/Leerzeichen ok) | |||
a.href = mw.util.getUrl(title); | |||
} else { | |||
a.href = '#'; | |||
a.setAttribute('role', 'button'); | |||
} | |||
); | const icon = document.createElement('span'); | ||
}); | icon.className = 'minerva-icon'; | ||
a.prepend(icon); | |||
li.appendChild(a); | |||
innerUl.appendChild(li); | |||
} | |||
ul.appendChild(innerUl); | |||
// Toggle-Verhalten für Header | |||
headerBtn.addEventListener('click', function () { | |||
const expanded = this.getAttribute('aria-expanded') === 'true'; | |||
this.setAttribute('aria-expanded', String(!expanded)); | |||
innerUl.style.display = expanded ? 'none' : ''; | |||
try { localStorage.setItem(BLOCK_ID + ':collapsed', expanded ? '1' : '0'); } catch (e) {} | |||
}); | |||
// Zustand wiederherstellen | |||
try { | |||
if (localStorage.getItem(BLOCK_ID + ':collapsed') === '1') { | |||
headerBtn.setAttribute('aria-expanded', 'false'); | |||
innerUl.style.display = 'none'; | |||
} | |||
} catch (e) {} | |||
// Nach der ersten UL einfügen | |||
const firstUl = host.querySelector('ul') || host; | |||
(firstUl.parentNode || host).insertBefore(ul, firstUl.nextSibling); | |||
return true; | |||
} | |||
// Beim Laden versuchen | |||
document.addEventListener('DOMContentLoaded', () => setTimeout(build, 0)); | |||
// Wenn das Menü erst beim Öffnen gebaut wird – nachklinken | |||
document.addEventListener('click', (e) => { | |||
const btn = e.target.closest('button, a'); | |||
if (!btn) return; | |||
const s = (btn.className + ' ' + btn.id).toLowerCase(); | |||
if (s.includes('menu') || s.includes('hamburger') || s.includes('main-menu')) { | |||
setTimeout(build, 250); | |||
} | |||
}); | |||
// Fallback: Menü taucht asynchron auf | |||
const obs = new MutationObserver(() => { if (build()) obs.disconnect(); }); | |||
obs.observe(document.documentElement, { childList: true, subtree: true }); | |||
})(); | |||