MediaWiki:Minerva.js: Unterschied zwischen den Versionen
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
||
| Zeile 40: | Zeile 40: | ||
} | } | ||
function build() { | |||
const host = findMenuList(); | |||
if (!host) return false; | |||
// Block schon eingebaut? | |||
if (document.getElementById(BLOCK_ID)) return true; | |||
// Container für alle Sektionen | |||
const container = document.createElement('div'); | |||
container.id = BLOCK_ID; | |||
// LINKS in Sektionen aufteilen: jeder Header (title=null) startet neue Sektion | |||
const sections = []; | |||
let current = null; | |||
for (const [label, title] of LINKS) { | |||
if (title === null) { | |||
current = { header: label, items: [] }; | |||
sections.push(current); | |||
} else if (current) { | |||
current.items.push({ label, title }); | |||
} | |||
} | |||
// Sektionen bauen | |||
sections.forEach((sec, idx) => { | |||
const secId = `${BLOCK_ID}-sec-${idx}`; | |||
const outer = document.createElement('ul'); | const outer = document.createElement('ul'); | ||
outer.className = 'toggle-list__list'; | outer.className = 'toggle-list__list'; | ||
// Header | // Header | ||
const headerLi = document.createElement('li'); | const headerLi = document.createElement('li'); | ||
headerLi.className = 'toggle-list-item'; | headerLi.className = 'toggle-list-item'; | ||
| Zeile 61: | Zeile 81: | ||
headerBtn.innerHTML = | headerBtn.innerHTML = | ||
'<span class="minerva-icon minerva-icon--listBullet"></span>' + | '<span class="minerva-icon minerva-icon--listBullet"></span>' + | ||
`<span class="toggle-list-item__label">${ | `<span class="toggle-list-item__label">${sec.header}</span>`; | ||
headerLi.appendChild(headerBtn); | headerLi.appendChild(headerBtn); | ||
outer.appendChild(headerLi); | outer.appendChild(headerLi); | ||
// | // Inner list | ||
const inner = document.createElement('ul'); | const inner = document.createElement('ul'); | ||
inner.className = 'toggle-list__list'; | inner.className = 'toggle-list__list'; | ||
inner.style.marginLeft = '10px'; | inner.style.marginLeft = '10px'; | ||
sec.items.forEach(({ label, title }) => { | |||
const li = document.createElement('li'); | const li = document.createElement('li'); | ||
li.className = 'toggle-list-item'; | li.className = 'toggle-list-item'; | ||
| Zeile 79: | Zeile 98: | ||
a.className = 'toggle-list-item__anchor'; | a.className = 'toggle-list-item__anchor'; | ||
a.textContent = label; | a.textContent = label; | ||
a.href = | a.href = mw.util.getUrl(title); | ||
li.appendChild(a); | li.appendChild(a); | ||
inner.appendChild(li); | inner.appendChild(li); | ||
} | }); | ||
outer.appendChild(inner); | outer.appendChild(inner); | ||
// Toggle-Logik | // Toggle-Logik pro Sektion | ||
headerBtn.addEventListener('click', function () { | headerBtn.addEventListener('click', function () { | ||
const expanded = this.getAttribute('aria-expanded') === 'true'; | const expanded = this.getAttribute('aria-expanded') === 'true'; | ||
this.setAttribute('aria-expanded', String(!expanded)); | this.setAttribute('aria-expanded', String(!expanded)); | ||
inner.style.display = expanded ? 'none' : ''; | inner.style.display = expanded ? 'none' : ''; | ||
try { localStorage.setItem( | try { localStorage.setItem(secId + ':collapsed', expanded ? '1' : '0'); } catch (e) {} | ||
}); | }); | ||
// Zustand wiederherstellen | // Zustand wiederherstellen | ||
try { | try { | ||
if (localStorage.getItem( | if (localStorage.getItem(secId + ':collapsed') === '1') { | ||
headerBtn.setAttribute('aria-expanded', 'false'); | headerBtn.setAttribute('aria-expanded', 'false'); | ||
inner.style.display = 'none'; | inner.style.display = 'none'; | ||
| Zeile 103: | Zeile 122: | ||
} catch (e) {} | } catch (e) {} | ||
container.appendChild(outer); | |||
}); | |||
// Einfügen (wie bei dir: direkt nach erster UL) | |||
const firstUl = host.querySelector('ul') || host; | |||
(firstUl.parentNode || host).insertBefore(container, firstUl.nextSibling); | |||
return true; | |||
} | |||
} | |||