MediaWiki:Common.js: Difference between revisions
MediaWiki interface page
More actions
No edit summary |
No edit summary |
||
| Line 132: | Line 132: | ||
/* =========================== | |||
FIXED COMPETITION LEADERBOARD | |||
=========================== */ | |||
function buildCompetitionLeaderboard() { | |||
const rows = Array.from(table.querySelectorAll("tr")).slice(1); | const rows = Array.from(table.querySelectorAll("tr")).slice(1); | ||
const playerPoints = {}; | |||
function getPoints(rank) { | |||
const scoring = { | |||
1: 25, 2: 20, 3: 17, 4: 15, 5: 13, | |||
6: 11, 7: 10, 8: 9, 9: 8, 10: 7, | |||
11: 6, 12: 5, 13: 4, 14: 3, 15: 2 | |||
}; | |||
return scoring[rank] || 1; | |||
} | |||
rows.forEach(row => { | rows.forEach(row => { | ||
const | const rank = parseInt(row.cells[0].innerText); | ||
const player = row.cells[2].innerText. | const player = row.cells[2].innerText.trim(); | ||
if (!player || isNaN(rank)) return; | |||
const points = getPoints(rank); | |||
playerPoints[player] = (playerPoints[player] || 0) + points; | |||
}); | |||
const leaderboard = Object.entries(playerPoints) | |||
.map(([player, points]) => ({ player, points })) | |||
.sort((a, b) => b.points - a.points); | |||
const existing = document.getElementById("competitionLeaderboard"); | |||
if (existing) existing.remove(); | |||
const container = document.createElement("div"); | |||
container.id = "competitionLeaderboard"; | |||
container.style.marginBottom = "20px"; | |||
const title = document.createElement("h2"); | |||
title.innerText = "🏆 Competition Leaderboard"; | |||
container.appendChild(title); | |||
const tableEl = document.createElement("table"); | |||
tableEl.className = "wikitable"; | |||
tableEl.style.width = "50%"; | |||
tableEl.innerHTML = ` | |||
<tr> | |||
<th>Rank</th> | |||
<th>Player</th> | |||
<th>Points</th> | |||
</tr> | |||
`; | |||
leaderboard.forEach((entry, index) => { | |||
const medals = ["🥇", "🥈", "🥉"]; | |||
const row = document.createElement("tr"); | |||
row.innerHTML = ` | |||
<td>${medals[index] || (index + 1)}</td> | |||
<td>${entry.player}</td> | |||
<td>${entry.points}</td> | |||
`; | |||
tableEl.appendChild(row); | |||
}); | |||
container.appendChild(tableEl); | |||
table.parentNode.insertBefore(container, table); | |||
} | |||
function filterTable() { | |||
const selectedDungeon = dungeonSelect.value; | |||
const playerSearch = playerInput.value.toLowerCase(); | |||
const rows = Array.from(table.querySelectorAll("tr")).slice(1); | |||
rows.forEach(row => { | |||
const dungeon = row.cells[1].innerText.trim(); | |||
const player = row.cells[2].innerText.toLowerCase(); | |||
row.style.display = | |||
(selectedDungeon === "All" || dungeon === selectedDungeon) && | |||
player.includes(playerSearch) | |||
? "" | |||
: "none"; | |||
}); | |||
} | |||
dungeonSelect.addEventListener("change", filterTable); | |||
playerInput.addEventListener("input", filterTable); | |||
sortAndRank(); | |||
buildCompetitionLeaderboard(); // ✅ ONLY RUNS ON LOAD | |||
} | |||
} | |||
/* =========================== | |||
PARTY TABLE (unchanged) | |||
=========================== */ | |||
const partyTable = document.getElementById("partyLeaderboardTable"); | |||
if (partyTable) { | |||
function sortAndRankParty() { | |||
const rows = Array.from(partyTable.querySelectorAll("tr")).slice(1); | |||
rows.sort((a,b) => { | |||
const dungeonA = a.cells[1].innerText.trim(); | |||
const dungeonB = b.cells[1].innerText.trim(); | |||
if (dungeonA < dungeonB) return -1; | |||
if (dungeonA > dungeonB) return 1; | |||
return parseTime(a.cells[5].innerText) - parseTime(b.cells[5].innerText); | |||
}); | |||
rows.forEach(row => partyTable.appendChild(row)); | |||
let currentDungeon = ""; | |||
let dungeonRank = 0; | |||
let prevTime = null; | |||
let position = 0; | |||
rows.forEach(row => { | |||
const dungeon = row.cells[1].innerText.trim(); | |||
const time = parseTime(row.cells[5].innerText); | |||
const rankCell = row.cells[0]; | |||
if (dungeon !== currentDungeon) { | |||
currentDungeon = dungeon; | |||
dungeonRank = 1; | |||
position = 1; | |||
prevTime = time; | |||
} else { | |||
position++; | |||
if (time !== prevTime) { | |||
dungeonRank = position; | |||
} | |||
} | prevTime = time; | ||
} | |||
if (dungeonRank === 1) rankCell.innerHTML = "🥇 1"; | |||
else if (dungeonRank === 2) rankCell.innerHTML = "🥈 2"; | |||
else if (dungeonRank === 3) rankCell.innerHTML = "🥉 3"; | |||
else rankCell.innerText = dungeonRank; | |||
}); | |||
} | } | ||
sortAndRankParty(); | |||
} | } | ||
}); | }); | ||