diff --git a/wwwroot/js/ui.js b/wwwroot/js/ui.js index 74b64d6..651e3af 100644 --- a/wwwroot/js/ui.js +++ b/wwwroot/js/ui.js @@ -198,11 +198,13 @@ export function renderVotes() { input.addEventListener("input", (e) => { if (state.votesFinal) return; const val = Number(e.target.value); - $("score-" + e.target.dataset.id).textContent = val; - const emojiEl = $("emoji-" + e.target.dataset.id); + const id = e.target.dataset.id; + $("score-" + id).textContent = val; + const emojiEl = $("emoji-" + id); if (emojiEl) emojiEl.textContent = scoreToEmoji(val); - const warn = $("warn-" + e.target.dataset.id); - if (warn) warn.classList.add("hidden"); + const warn = $("warn-" + id); + if (warn) warn.classList.remove("hidden"); + e.target.dataset.pending = "1"; syncLinkedSliders(e.target, val); updateMissingBadgeFromDom(); }); @@ -210,11 +212,30 @@ export function renderVotes() { if (state.votesFinal) return; const suggestionId = Number(e.target.dataset.id); const score = Number(e.target.value); + const prevScore = votesMap[suggestionId]; + const resetUi = () => { + const label = $("score-" + suggestionId); + const emoji = $("emoji-" + suggestionId); + const warn = $("warn-" + suggestionId); + const fallbackValue = prevScore ?? 5; + const fallbackDisplay = prevScore ?? "—"; + const fallbackEmoji = prevScore != null ? scoreToEmoji(prevScore) : "⚠️"; + e.target.value = fallbackValue; + if (label) label.textContent = fallbackDisplay; + if (emoji) emoji.textContent = fallbackEmoji; + if (warn) warn.classList.remove("hidden"); + }; try { await api.vote(suggestionId, score); toast(t("vote.saved")); + delete e.target.dataset.pending; + const warn = $("warn-" + suggestionId); + if (warn) warn.classList.add("hidden"); await window.loadVoteData(); + updateMissingBadgeFromDom(); } catch (err) { + delete e.target.dataset.pending; + resetUi(); toast(err.message, true); } }); @@ -743,12 +764,8 @@ function updateMissingBadgeFromDom() { badge.classList.add("hidden"); return; } - const sliders = document.querySelectorAll("#vote-list input[type=range]"); - const missing = Array.from(sliders).some((slider) => { - const scoreLabel = $("score-" + slider.dataset.id); - return !scoreLabel || scoreLabel.textContent === "—"; - }); - badge.classList.toggle("hidden", !missing); + const missing = missingVotesCount(); + badge.classList.toggle("hidden", missing === 0); } function renderAdminVoteStatus() { @@ -987,7 +1004,8 @@ function syncLinkedSliders(sourceEl, value) { const emojiEl = $("emoji-" + id); if (emojiEl) emojiEl.textContent = scoreToEmoji(Number(value)); const warn = $("warn-" + id); - if (warn) warn.classList.add("hidden"); + if (warn) warn.classList.remove("hidden"); + slider.dataset.pending = "1"; }); }