Show emoji votes and my vote in results

This commit is contained in:
2026-02-04 15:17:25 +01:00
parent e6dd64649d
commit 243377ea70
3 changed files with 24 additions and 12 deletions

View File

@@ -34,6 +34,11 @@ public static class ResultsEndpoints
Total = s.Votes.Sum(v => v.Score), Total = s.Votes.Sum(v => v.Score),
Count = s.Votes.Count, Count = s.Votes.Count,
Average = s.Votes.Count == 0 ? 0 : s.Votes.Average(v => v.Score), Average = s.Votes.Count == 0 ? 0 : s.Votes.Average(v => v.Score),
Votes = s.Votes.Select(v => v.Score).ToList(),
MyVote = s.Votes
.Where(v => v.PlayerId == player.Id)
.Select(v => (int?)v.Score)
.FirstOrDefault(),
s.ScreenshotUrl, s.ScreenshotUrl,
s.YoutubeUrl, s.YoutubeUrl,
s.GameUrl, s.GameUrl,

View File

@@ -71,9 +71,8 @@ const translations = {
"results.rank": "Rank", "results.rank": "Rank",
"results.game": "Game", "results.game": "Game",
"results.author": "Author", "results.author": "Author",
"results.votes": "Votes", "results.votesList": "Votes",
"results.avg": "Average", "results.myVote": "Your vote",
"results.total": "Total",
"results.links": "Links", "results.links": "Links",
"results.link.site": "Site ↗", "results.link.site": "Site ↗",
"results.link.youtube": "YouTube ↗", "results.link.youtube": "YouTube ↗",
@@ -177,9 +176,8 @@ const translations = {
"results.rank": "Rang", "results.rank": "Rang",
"results.game": "Spiel", "results.game": "Spiel",
"results.author": "Autor", "results.author": "Autor",
"results.votes": "Stimmen", "results.votesList": "Stimmen (Emojis)",
"results.avg": "Durchschnitt", "results.myVote": "Deine Stimme",
"results.total": "Gesamt",
"results.links": "Links", "results.links": "Links",
"results.link.site": "Webseite ↗", "results.link.site": "Webseite ↗",
"results.link.youtube": "YouTube ↗", "results.link.youtube": "YouTube ↗",

View File

@@ -216,9 +216,8 @@ export function renderResults() {
<th>${t("results.rank")}</th> <th>${t("results.rank")}</th>
<th>${t("results.game")}</th> <th>${t("results.game")}</th>
<th>${t("results.author")}</th> <th>${t("results.author")}</th>
<th>${t("results.votes")}</th> <th>${t("results.votesList")}</th>
<th>${t("results.avg")}</th> <th>${t("results.myVote")}</th>
<th>${t("results.total")}</th>
<th>${t("results.links")}</th> <th>${t("results.links")}</th>
</tr> </tr>
</thead> </thead>
@@ -240,9 +239,8 @@ export function renderResults() {
</div> </div>
</td> </td>
<td class="author-cell">${r.author ?? "—"}</td> <td class="author-cell">${r.author ?? "—"}</td>
<td>${r.count}</td> <td>${formatVotes(r.votes)}</td>
<td>${r.average.toFixed(1)}</td> <td>${formatMyVote(r.myVote)}</td>
<td>${r.total}</td>
<td> <td>
${r.gameUrl ? `<a class="link compact" href="${r.gameUrl}" target="_blank" rel="noopener">${t("results.link.site")}</a><br>` : ''} ${r.gameUrl ? `<a class="link compact" href="${r.gameUrl}" target="_blank" rel="noopener">${t("results.link.site")}</a><br>` : ''}
${r.youtubeUrl ? `<a class="link compact" href="${r.youtubeUrl}" target="_blank" rel="noopener">${t("results.link.youtube")}</a>` : ''} ${r.youtubeUrl ? `<a class="link compact" href="${r.youtubeUrl}" target="_blank" rel="noopener">${t("results.link.youtube")}</a>` : ''}
@@ -587,6 +585,17 @@ export function neutralEmoji() {
return "😐"; return "😐";
} }
function formatVotes(votes) {
if (!Array.isArray(votes) || votes.length === 0) return "—";
const sorted = [...votes].sort((a, b) => a - b);
return sorted.map((v) => scoreToEmoji(v)).join(" ");
}
function formatMyVote(score) {
if (score == null || Number.isNaN(score)) return "—";
return `${score} ${scoreToEmoji(score)}`;
}
function isValidImageUrl(url) { function isValidImageUrl(url) {
if (!url) return true; if (!url) return true;
try { try {