Keep vote warnings until save succeeds

This commit is contained in:
2026-02-06 22:32:18 +01:00
parent 4889274e8e
commit b2a5a625a3

View File

@@ -198,11 +198,13 @@ export function renderVotes() {
input.addEventListener("input", (e) => { input.addEventListener("input", (e) => {
if (state.votesFinal) return; if (state.votesFinal) return;
const val = Number(e.target.value); const val = Number(e.target.value);
$("score-" + e.target.dataset.id).textContent = val; const id = e.target.dataset.id;
const emojiEl = $("emoji-" + e.target.dataset.id); $("score-" + id).textContent = val;
const emojiEl = $("emoji-" + id);
if (emojiEl) emojiEl.textContent = scoreToEmoji(val); if (emojiEl) emojiEl.textContent = scoreToEmoji(val);
const warn = $("warn-" + e.target.dataset.id); const warn = $("warn-" + id);
if (warn) warn.classList.add("hidden"); if (warn) warn.classList.remove("hidden");
e.target.dataset.pending = "1";
syncLinkedSliders(e.target, val); syncLinkedSliders(e.target, val);
updateMissingBadgeFromDom(); updateMissingBadgeFromDom();
}); });
@@ -210,11 +212,30 @@ export function renderVotes() {
if (state.votesFinal) return; if (state.votesFinal) return;
const suggestionId = Number(e.target.dataset.id); const suggestionId = Number(e.target.dataset.id);
const score = Number(e.target.value); 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 { try {
await api.vote(suggestionId, score); await api.vote(suggestionId, score);
toast(t("vote.saved")); toast(t("vote.saved"));
delete e.target.dataset.pending;
const warn = $("warn-" + suggestionId);
if (warn) warn.classList.add("hidden");
await window.loadVoteData(); await window.loadVoteData();
updateMissingBadgeFromDom();
} catch (err) { } catch (err) {
delete e.target.dataset.pending;
resetUi();
toast(err.message, true); toast(err.message, true);
} }
}); });
@@ -743,12 +764,8 @@ function updateMissingBadgeFromDom() {
badge.classList.add("hidden"); badge.classList.add("hidden");
return; return;
} }
const sliders = document.querySelectorAll("#vote-list input[type=range]"); const missing = missingVotesCount();
const missing = Array.from(sliders).some((slider) => { badge.classList.toggle("hidden", missing === 0);
const scoreLabel = $("score-" + slider.dataset.id);
return !scoreLabel || scoreLabel.textContent === "—";
});
badge.classList.toggle("hidden", !missing);
} }
function renderAdminVoteStatus() { function renderAdminVoteStatus() {
@@ -987,7 +1004,8 @@ function syncLinkedSliders(sourceEl, value) {
const emojiEl = $("emoji-" + id); const emojiEl = $("emoji-" + id);
if (emojiEl) emojiEl.textContent = scoreToEmoji(Number(value)); if (emojiEl) emojiEl.textContent = scoreToEmoji(Number(value));
const warn = $("warn-" + id); const warn = $("warn-" + id);
if (warn) warn.classList.add("hidden"); if (warn) warn.classList.remove("hidden");
slider.dataset.pending = "1";
}); });
} }