Files
afup/htdocs/js/vote.js

123 lines
4.4 KiB
JavaScript

var forms = document.querySelectorAll('div.event--vote-form form');
var starContainers = document.querySelectorAll('.stars');
var lockForm = function (form) {
form.querySelector('button[type=submit]').disabled = true;
}
var unlockForm = function (form) {
form.querySelector('button[type=submit]').disabled = false;
}
var resetFormError = function (form) {
var errors = form.querySelector('div.errors');
if (errors !== null) {
errors.remove();
}
form.querySelector('button[type=submit]').classList.remove('error');
form.querySelector('button[type=submit]').classList.remove('success');
};
var setFormErrors = function (form, errors) {
var submit = form.querySelector('button[type=submit]');
submit.classList.add('error');
var div = document.createElement('div');
div.setAttribute('class', 'errors');
var content = document.createElement('p');
content.textContent = 'Ooooops ! Quelque chose s\'est mal passé !';
var ul = document.createElement('ul');
var li = document.createElement('li');
for (var error in errors) {
if (errors.hasOwnProperty(error)) {
var myLi = li.cloneNode();
myLi.textContent = errors[error];
ul.appendChild(myLi);
}
}
div.appendChild(content);
div.appendChild(ul);
submit.parentNode.appendChild(div);
};
var setFormSuccess = function(form) {
form.querySelector('button[type=submit]').classList.add('success');
};
[].forEach.call(forms, function (form) {
var starContainer = form.querySelector('.stars');
form.addEventListener('submit', function(e){
e.preventDefault();
e.stopPropagation();
lockForm(this);
resetFormError(this);
var form = this;
if (form.querySelector('input[name*="[vote]"]').value === "0") {
unlockForm(form);
setFormErrors(form, ['Merci de donner une note !']);
return;
}
var httpRequest = new XMLHttpRequest()
httpRequest.onreadystatechange = function (data) {
var DONE = 4; // readyState 4 means the request is done.
var OK = 200; // status 200 is a successful return.
var ACCESS_DENIED = 403;
var BAD_REQUEST = 400;
var SERVER_ERROR = 500;
if (httpRequest.readyState === DONE) {
unlockForm(form);
var errors = {};
var errorMessage = '';
if (httpRequest.getResponseHeader('content-type') === 'application/json') {
errors = JSON.parse(httpRequest.responseText);
if (httpRequest.status === OK) {
setFormSuccess(form);
return ;
} else if (httpRequest.status !== ACCESS_DENIED && httpRequest.status !== BAD_REQUEST && httpRequest.status !== SERVER_ERROR) {
errors = ['Une erreur inattendue est survenue :\'('];
}
} else {
errors = ['Une erreur inattendue est survenue :\'('];
}
setFormErrors(form, errors, errorMessage);
}
};
httpRequest.open('POST', this.getAttribute('action'));
httpRequest.setRequestHeader('Accept', 'application/json');
var data = new FormData(form);
data.append(form.querySelector('button').getAttribute('name'), form.querySelector('button').textContent);
httpRequest.send(data);
});
starContainer.addEventListener('click', function(e) {
e.preventDefault();
e.stopPropagation();
var stars = Array.prototype.slice.call(this.children);
var totalStars = stars.length;
var index = stars.indexOf(e.target);
var vote = totalStars - index;
stars.forEach(function(el) {
el.classList.remove('is-selected')
})
e.target.classList.add('is-selected')
form.querySelector('input[name*="[vote]"]').setAttribute('value', vote);
});
// We can have a value in the field vote, we need to update the matching stars
if (form.querySelector('input[name*="[vote]"]').value !== "0") {
var stars = Array.prototype.slice.call(form.querySelector('div.stars').children);
var totalStars = stars.length;
var star = stars[totalStars - form.querySelector('input[name*="[vote]"]').value];
star.classList.add('is-selected');
}
});