Skip to content

Commit 3d4d5fa

Browse files
committed
[FEATURE] Extend form validation with error callback functionality
If you want to hook into the process when a user submits a form and the validation fails, you can now hook into it from outside like: const forms = document.querySelectorAll('.powermail_form'); forms.forEach(function(form) { let formValidation = form.powermailFormValidation; formValidation.addValidator('custom100', function(field) { if (field.hasAttribute('data-powermail-custom100')) { // return true means validation has failed return field.value < parseInt(field.getAttribute('data-powermail-custom100')); } return false; }); });
1 parent e79d45f commit 3d4d5fa

File tree

2 files changed

+89
-53
lines changed

2 files changed

+89
-53
lines changed

Resources/Private/Build/JavaScript/FormValidation.js

Lines changed: 87 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,9 @@ class Form {
4040
#errorContainerClass = 'data-powermail-class-handler';
4141
#errorMessageContainerClass = 'powermail-errors-list';
4242

43-
constructor(form) {
44-
this.#form = form;
45-
this.#form.powermailFormValidation = this;
46-
}
47-
48-
validate() {
49-
this.#validateFormSubmit();
50-
this.#validateFieldListener();
51-
}
52-
5343
/**
44+
* Validator configuration
45+
*
5446
* Add possibility to add own validators from outside like:
5547
*
5648
* const forms = document.querySelectorAll('.powermail_form');
@@ -66,19 +58,95 @@ class Form {
6658
* });
6759
* });
6860
*
61+
* @type {{name: function(*=, *): boolean}}
62+
*/
63+
#validators = {
64+
'required': (field) => {
65+
return this.#isRequiredField(field) && this.#isValidationRequiredConfirmed(field) === false;
66+
},
67+
'email': (field) => {
68+
return this.#isEmailField(field) && this.#isValidationEmailConfirmed(field) === false;
69+
},
70+
'url': (field) => {
71+
return this.#isUrlField(field) && this.#isValidationUrlConfirmed(field) === false;
72+
},
73+
'pattern': (field) => {
74+
return this.#isPatternField(field) && this.#isValidationPatternConfirmed(field) === false;
75+
},
76+
'number': (field) => {
77+
return this.#isNumberField(field) && this.#isValidationNumberConfirmed(field) === false;
78+
},
79+
'minimum': (field) => {
80+
return this.#isMinimumField(field) && this.#isValidationMinimumConfirmed(field) === false;
81+
},
82+
'maximum': (field) => {
83+
return this.#isMaximumField(field) && this.#isValidationMaximumConfirmed(field) === false;
84+
},
85+
'length': (field) => {
86+
return this.#isLengthField(field) && this.#isValidationLengthConfirmed(field) === false;
87+
},
88+
'equalto': (field) => {
89+
return this.#isEqualtoField(field) && this.#isValidationEqualtoConfirmed(field) === false;
90+
},
91+
'powermailfilesize': (field) => {
92+
return this.#isUploadField(field) && this.#isValidationUploadFieldSizeConfirmed(field) === false;
93+
},
94+
'powermailfileextensions': (field) => {
95+
return this.#isUploadField(field) && this.#isValidationUploadFieldExtensionConfirmed(field) === false;
96+
},
97+
};
98+
99+
/**
100+
* Submit error callback configuration
101+
*
102+
* Add possibility to add own callbacks when a user submits a form and an error happens from outside like:
103+
*
104+
* const forms = document.querySelectorAll('.powermail_form');
105+
* forms.forEach(function(form) {
106+
* let formValidation = form.powermailFormValidation;
107+
*
108+
* formValidation.addSubmitErrorCallback('custom100', function() {
109+
* // error happens, do something
110+
* });
111+
* });
112+
*
113+
* @type {{name: function(*=, *): boolean}}
114+
*/
115+
#submitErrorCallbacks = {};
116+
117+
constructor(form) {
118+
this.#form = form;
119+
this.#form.powermailFormValidation = this;
120+
}
121+
122+
validate() {
123+
this.#validateFormSubmit();
124+
this.#validateFieldListener();
125+
}
126+
127+
/**
69128
* @param name
70129
* @param validator
71130
*/
72131
addValidator(name, validator) {
73132
this.#validators[name] = validator;
74133
}
75134

135+
/**
136+
* @param name
137+
* @param callback
138+
*/
139+
addSubmitErrorCallback(name, callback) {
140+
this.#submitErrorCallbacks[name] = callback;
141+
}
142+
76143
#validateFormSubmit() {
77144
const that = this;
78145
this.#form.setAttribute('novalidate', 'novalidate')
79146
this.#form.addEventListener('submit', function(event) {
80147
that.#validateForm();
81148
if (that.#hasFormErrors() === true) {
149+
that.#runSubmitErrorCallbacks();
82150
event.preventDefault();
83151
}
84152
})
@@ -109,47 +177,6 @@ class Form {
109177
}
110178
};
111179

112-
/**
113-
* Validator configuration
114-
*
115-
* @type {{name: function(*=, *): boolean}}
116-
*/
117-
#validators = {
118-
'required': (field) => {
119-
return this.#isRequiredField(field) && this.#isValidationRequiredConfirmed(field) === false;
120-
},
121-
'email': (field) => {
122-
return this.#isEmailField(field) && this.#isValidationEmailConfirmed(field) === false;
123-
},
124-
'url': (field) => {
125-
return this.#isUrlField(field) && this.#isValidationUrlConfirmed(field) === false;
126-
},
127-
'pattern': (field) => {
128-
return this.#isPatternField(field) && this.#isValidationPatternConfirmed(field) === false;
129-
},
130-
'number': (field) => {
131-
return this.#isNumberField(field) && this.#isValidationNumberConfirmed(field) === false;
132-
},
133-
'minimum': (field) => {
134-
return this.#isMinimumField(field) && this.#isValidationMinimumConfirmed(field) === false;
135-
},
136-
'maximum': (field) => {
137-
return this.#isMaximumField(field) && this.#isValidationMaximumConfirmed(field) === false;
138-
},
139-
'length': (field) => {
140-
return this.#isLengthField(field) && this.#isValidationLengthConfirmed(field) === false;
141-
},
142-
'equalto': (field) => {
143-
return this.#isEqualtoField(field) && this.#isValidationEqualtoConfirmed(field) === false;
144-
},
145-
'powermailfilesize': (field) => {
146-
return this.#isUploadField(field) && this.#isValidationUploadFieldSizeConfirmed(field) === false;
147-
},
148-
'powermailfileextensions': (field) => {
149-
return this.#isUploadField(field) && this.#isValidationUploadFieldExtensionConfirmed(field) === false;
150-
},
151-
};
152-
153180
#validateField(field) {
154181
let error = false;
155182
field = this.#getValidationField(field);
@@ -175,6 +202,15 @@ class Form {
175202
return error;
176203
}
177204

205+
#runSubmitErrorCallbacks() {
206+
for (let callback in this.#submitErrorCallbacks) {
207+
if (this.#submitErrorCallbacks.hasOwnProperty(callback) === false) {
208+
continue;
209+
}
210+
this.#submitErrorCallbacks[callback]();
211+
}
212+
}
213+
178214
/*
179215
* Check for validations
180216
*/

Resources/Public/JavaScript/Powermail/Form.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)