|
import { OptimisticAction } from "./OptimisticAction.js";
|
|
|
|
export class VoteManager extends OptimisticAction {
|
|
constructor() {
|
|
super();
|
|
this.initVoteButtons();
|
|
}
|
|
|
|
initVoteButtons() {
|
|
document.querySelectorAll('form[action^="/votes/"] button[type="submit"]').forEach((button) => {
|
|
const form = button.closest("form");
|
|
button.addEventListener("click", (event) => {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
this.cast(form, button);
|
|
});
|
|
});
|
|
}
|
|
|
|
cast(form, button) {
|
|
const action = form.getAttribute("action");
|
|
const value = form.querySelector('input[name="value"]').value;
|
|
return this.submit(action, { value }, button, (result) => this.render(action, result));
|
|
}
|
|
|
|
render(action, result) {
|
|
const targetUid = action.split("/").pop();
|
|
document.querySelectorAll(`[data-vote-count="${targetUid}"]`).forEach((counter) => {
|
|
counter.textContent = result.net;
|
|
});
|
|
document.querySelectorAll(`form[action="${action}"] button[type="submit"]`).forEach((button) => {
|
|
const formValue = parseInt(button.closest("form").querySelector('input[name="value"]').value, 10);
|
|
button.classList.toggle("voted", result.value !== 0 && formValue === result.value);
|
|
});
|
|
}
|
|
}
|