Add admin vote status list and ready/wait messaging
This commit is contained in:
@@ -53,6 +53,7 @@ export const api = {
|
||||
|
||||
export const adminApi = {
|
||||
setResultsOpen: (resultsOpen) => request("/api/admin/results", { method: "POST", body: { resultsOpen } }),
|
||||
voteStatus: () => request("/api/admin/vote-status"),
|
||||
reset: () => request("/api/admin/reset", { method: "POST" }),
|
||||
factoryReset: () => request("/api/admin/factory-reset", { method: "POST" }),
|
||||
};
|
||||
|
||||
@@ -69,6 +69,9 @@ export async function refreshPhaseData() {
|
||||
state.votesRendered = false;
|
||||
await loadVoteData();
|
||||
}
|
||||
if (state.me?.isAdmin) {
|
||||
state.adminVoteStatus = await adminApi.voteStatus();
|
||||
}
|
||||
} catch (err) {
|
||||
if (handleAuthError(err, clearUserState)) return;
|
||||
throw err;
|
||||
|
||||
@@ -104,6 +104,8 @@ const translations = {
|
||||
"admin.factoryReset": "Factory reset",
|
||||
"admin.resetDone": "Reset complete",
|
||||
"admin.factoryResetDone": "Factory reset complete",
|
||||
"admin.readyForResults": "Ready for results",
|
||||
"admin.waitingForPlayers": "Waiting for players: {names}",
|
||||
|
||||
"toast.unexpected": "Unexpected error",
|
||||
"toast.registered": "Registered",
|
||||
@@ -230,6 +232,8 @@ const translations = {
|
||||
"admin.factoryReset": "Werkseinstellung",
|
||||
"admin.resetDone": "Zurücksetzen abgeschlossen",
|
||||
"admin.factoryResetDone": "Werkseinstellung abgeschlossen",
|
||||
"admin.readyForResults": "Bereit für Ergebnisse",
|
||||
"admin.waitingForPlayers": "Warten auf: {names}",
|
||||
|
||||
"toast.unexpected": "Unerwarteter Fehler",
|
||||
"toast.registered": "Registriert",
|
||||
|
||||
@@ -13,6 +13,7 @@ export const state = {
|
||||
myVotes: [],
|
||||
results: [],
|
||||
votesRendered: false,
|
||||
adminVoteStatus: null,
|
||||
};
|
||||
|
||||
export function clearUserState() {
|
||||
|
||||
@@ -653,6 +653,27 @@ function missingVotesCount() {
|
||||
return missing < 0 ? 0 : missing;
|
||||
}
|
||||
|
||||
function renderAdminVoteStatus() {
|
||||
if (!state.me?.isAdmin) return;
|
||||
const list = $("admin-voter-list");
|
||||
const status = $("admin-ready-status");
|
||||
if (!state.adminVoteStatus || !list || !status) return;
|
||||
|
||||
list.innerHTML = "";
|
||||
state.adminVoteStatus.voters.forEach((v) => {
|
||||
const li = document.createElement("li");
|
||||
li.textContent = `${v.name} — ${v.finalized ? "✅" : "⏳"}`;
|
||||
list.appendChild(li);
|
||||
});
|
||||
|
||||
const waiting = state.adminVoteStatus.waiting;
|
||||
const ready = waiting.length === 0;
|
||||
status.textContent = ready
|
||||
? t("admin.readyForResults")
|
||||
: t("admin.waitingForPlayers", { names: waiting.join(", ") });
|
||||
status.className = ready ? "badge" : "badge warning";
|
||||
}
|
||||
|
||||
function openDeleteConfirmModal(s) {
|
||||
const overlay = document.createElement("div");
|
||||
overlay.className = "edit-modal";
|
||||
@@ -762,6 +783,8 @@ export function updatePhaseNav() {
|
||||
voteStatusText.textContent = state.votesFinal ? t("nav.voteFinalized") : t("nav.voteHint");
|
||||
}
|
||||
|
||||
renderAdminVoteStatus();
|
||||
|
||||
// Toggle admin-only back buttons
|
||||
const backButtons = ["nav-vote-prev"];
|
||||
backButtons.forEach((id) => {
|
||||
|
||||
Reference in New Issue
Block a user