mirror of
https://github.com/quentin-g-dev/afup.git
synced 2026-03-24 09:12:16 +01:00
123 lines
4.4 KiB
JavaScript
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');
|
|
}
|
|
}); |