main
1import ApplicationController from './application_controller';
2import Email from '../models/email';
3import FormValidation from '../models/form_validation';
4import I18n from '../i18n';
5
6export default class extends ApplicationController {
7 get form() { return this.element.closest('form'); }
8
9 get formValidation() { return new FormValidation(this.form); }
10
11 get submitButton() { return this.form.querySelector('[type=submit]'); }
12
13 changed() {
14 this.validate(this.element);
15
16 if (this.formValidation.valid()) super.enable(this.submitButton);
17 }
18
19 validate(element) {
20 const isRequired = element.getAttribute('required') === 'required';
21 if (isRequired && element.value.length === 0) {
22 return this.displayError(I18n.translate('js.form.errors.required'));
23 }
24
25 const isEmail = element.getAttribute('type') === 'email';
26 if (isEmail && new Email(element.value).invalid()) {
27 return this.displayError(I18n.translate('js.form.errors.invalid'));
28 }
29
30 const minLength = element.getAttribute('minlength');
31 if (minLength && element.value.length < parseInt(minLength, 10)) {
32 return this.displayError(I18n.translate('js.form.errors.too_short'));
33 }
34
35 const maxLength = element.getAttribute('maxlength');
36 if (maxLength && element.value.length > parseInt(maxLength, 10)) {
37 return this.displayError(I18n.translate('js.form.errors.too_long'));
38 }
39
40 const isEqualTo = element.getAttribute('data-is-equal-to');
41 if (isEqualTo && document.querySelector(isEqualTo).value !== element.value) {
42 return this.displayError(I18n.translate('js.form.errors.confirmation'));
43 }
44
45 return this.hideError();
46 }
47
48 hideError() {
49 this.data.set('valid', true);
50 this.element.classList.remove('is-danger');
51 const controlElement = this.element.parentElement;
52 const fieldElement = controlElement.parentElement;
53 const helpElement = fieldElement.querySelector('.help');
54 if (helpElement) {
55 helpElement.textContent = '';
56 helpElement.classList.remove('is-danger');
57 super.hide(helpElement);
58 }
59 }
60
61 displayError(message) {
62 this.data.set('valid', false);
63 super.disable(this.submitButton);
64 this.element.classList.add('is-danger');
65 const controlElement = this.element.parentElement;
66 const fieldElement = controlElement.parentElement;
67 const helpElement = fieldElement.querySelector('.help');
68 if (helpElement) {
69 helpElement.textContent = message;
70 helpElement.classList.add('is-danger');
71 super.show(helpElement);
72 }
73 }
74}