MediaWiki:Common.js: Unterschied zwischen den Versionen
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| Zeile 280: | Zeile 280: | ||
} | } | ||
// --- Stats laden (Ø & Stimmen, eigene Stimme, canVote/see) --- | |||
function updateStats() { | |||
const api = new mw.Api(); | |||
api.get({ | |||
action: 'query', | |||
prop: 'pagerating', | |||
pageids: pageId, | |||
prcontest: contest || undefined, | |||
format: 'json' | |||
}).done(function (data) { | |||
try { | |||
// Robuster Zugriff: Page-ID-String aus dem Response nehmen | |||
const pages = (data && data.query && data.query.pages) || {}; | |||
const pid = Object.keys(pages)[0]; | |||
const page = pages[pid] || {}; | |||
const pr = page.pagerating; | |||
if (!pr) { | |||
// Keine Daten – lieber neutralen Text setzen | |||
meta.textContent = meta.textContent || 'Noch keine Bewertungen'; | |||
return; | |||
} | |||
if (typeof pr.canVote !== 'undefined' && pr.canVote === 0) { | // Ergebnisse sichtbar? | ||
if (typeof pr.canSee !== 'undefined' && pr.canSee === 0) { | |||
meta.textContent = 'Bewertungen sind verborgen.'; | |||
} else { | |||
const hist = pr.pageRating || {}; | |||
let total = 0, sum = 0; | |||
Object.keys(hist).forEach(k => { | |||
const s = parseInt(k, 10), c = parseInt(hist[k], 10); | |||
if (!isNaN(s) && !isNaN(c)) { total += c; sum += s * c; } | |||
}); | |||
meta.textContent = total | |||
? ('Ø ' + (Math.round((sum/total)*10)/10) + ' (' + total + ' Stimmen)') | |||
: 'Noch keine Bewertungen'; | |||
} | |||
// eigene Stimme hervorheben | |||
if (pr.userVote) { | |||
current = pr.userVote; | |||
highlight(current); | |||
} | |||
// Voting ggf. deaktivieren | |||
if (typeof pr.canVote !== 'undefined' && pr.canVote === 0) { | |||
box.classList.add('whisky-rating--disabled'); | |||
widget.querySelectorAll('.whisky-glass').forEach(b => b.disabled = true); | |||
if (!/nicht abstimmen/.test(meta.textContent)) { | |||
meta.textContent += (meta.textContent ? ' • ' : '') + 'Du darfst hier nicht abstimmen.'; | |||
} | } | ||
} | } | ||
} catch (e) { | |||
console.error(e); | |||
if (!meta.textContent) meta.textContent = 'Bewertungen konnten nicht geladen werden.'; | |||
} | } | ||
}).fail(function (xhr) { | |||
console.error('Pagerating-Load-Error', xhr); | |||
if (!meta.textContent) meta.textContent = 'Bewertungen konnten nicht geladen werden.'; | |||
}); | |||
} | |||
// --- Vote senden (per pageid) --- | |||
function vote(value) { | |||
const api = new mw.Api(); | |||
meta.textContent = 'Wird gespeichert …'; | |||
// Sicherheitsnetz: nach 8s nicht hängen bleiben | |||
let saved = false; | |||
const failTimer = setTimeout(function () { | |||
if (!saved) meta.textContent = 'Speichern dauert ungewöhnlich lange … bitte Seite neu laden.'; | |||
}, 8000); | |||
api.postWithToken('csrf', { | |||
action: 'ratepage', | |||
pageid: pageId, // ROBUST | |||
answer: value, // 1..10 | |||
contest: contest || undefined, // Kategorie | |||
format: 'json' | |||
}).done(function () { | |||
saved = true; | |||
clearTimeout(failTimer); | |||
current = value; | |||
highlight(current); | |||
// Sofort eine Bestätigung anzeigen … | |||
meta.textContent = 'Danke! Deine Bewertung: ' + value + ' / ' + scale; | |||
// … und dann die echten Ø/Count nachladen | |||
updateStats(); | |||
}).fail(function (xhr) { | |||
clearTimeout(failTimer); | |||
let msg = 'Unbekannter Fehler'; | |||
try { | |||
const j = xhr && xhr.responseJSON ? xhr.responseJSON : xhr; | |||
if (j && j.error) { | |||
msg = (j.error.code ? j.error.code + ': ' : '') + (j.error.info || ''); | |||
} | |||
} catch(e){} | |||
console.error('RatePage-API-Fehler:', xhr); | |||
meta.textContent = 'Speichern fehlgeschlagen: ' + msg; | |||
}); | |||
} | |||
updateStats(); | updateStats(); | ||
} | } | ||