Keep vote warnings until save succeeds
This commit is contained in:
@@ -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";
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user