diff --git a/Configuration/TypoScript/Main/Configuration/10_Validation.typoscript b/Configuration/TypoScript/Main/Configuration/10_Validation.typoscript index c15c6a146..4b60242a2 100644 --- a/Configuration/TypoScript/Main/Configuration/10_Validation.typoscript +++ b/Configuration/TypoScript/Main/Configuration/10_Validation.typoscript @@ -9,6 +9,11 @@ plugin.tx_powermail.settings.setup { # enable serverside validation server = {$plugin.tx_powermail.settings.validation.server} + morestep { + # enable clientside fieldset validation for morestep forms on step change + fieldset = {$plugin.tx_powermail.settings.validation.morestep.fieldset} + } + unique { # EXAMPLE: Enable unique check for {email} #email = 1 diff --git a/Configuration/TypoScript/Main/constants.typoscript b/Configuration/TypoScript/Main/constants.typoscript index e745da81a..b06e05396 100644 --- a/Configuration/TypoScript/Main/constants.typoscript +++ b/Configuration/TypoScript/Main/constants.typoscript @@ -38,6 +38,11 @@ plugin.tx_powermail { # cat=powermail_additional//0120; type=boolean; label= PHP Server Validation: Validate User Input with PHP on serverside server = 1 + + morestep { + # cat=powermail_additional//0130; type=boolean; label= Validate User Fieldset Input on Multistep Forms with JavaScript on step change + fieldset = 0 + } } receiver { diff --git a/Resources/Private/Build/JavaScript/FormValidation.js b/Resources/Private/Build/JavaScript/FormValidation.js index 457dec277..65e91d87d 100644 --- a/Resources/Private/Build/JavaScript/FormValidation.js +++ b/Resources/Private/Build/JavaScript/FormValidation.js @@ -129,7 +129,7 @@ class Form { fieldsWithError.forEach((field) => { if (Utility.isElementVisible(field)) { field.scrollIntoView({behavior:'smooth', block:'center'}); - field.focus({preventScroll:true}); + setTimeout(() => field.focus({ preventScroll: true }), 300); throw 'StopException'; } }); @@ -149,6 +149,24 @@ class Form { this.#validateFieldListener(); } + validateVisibleFields() { + const that = this; + let fields = that.#getFieldsFromForm(); + // reset errors + this.#error = false; + for (let i = 0; i < fields.length; i++) { + that.#updateErrorClassesForFormAndFieldsets(fields[i]); + this.#addFieldErrorStatus(fields[i], false); + } + // validate + for (let i = 0; i < fields.length; i++) { + if (Utility.isElementVisible(fields[i])) { + that.#validateField(fields[i]); + } + } + return !that.#hasFormErrors(); + } + /** * @param name * @param validator @@ -157,6 +175,12 @@ class Form { this.#validators[name] = validator; } + scrollToFirstError() { + if (this.#hasFormErrors()) { + this.#submitErrorCallbacks['scrollToFirstError'](); + } + } + /** * @param name * @param callback diff --git a/Resources/Private/Build/JavaScript/MoreStepForm.js b/Resources/Private/Build/JavaScript/MoreStepForm.js index cdee80b90..81db558fb 100644 --- a/Resources/Private/Build/JavaScript/MoreStepForm.js +++ b/Resources/Private/Build/JavaScript/MoreStepForm.js @@ -50,7 +50,24 @@ export default function MoreStepForm() { let targetFieldset = event.target.getAttribute('data-powermail-morestep-show'); const backwards = event.target.getAttribute('data-powermail-morestep-previous') !== null; let form = event.target.closest('form'); + + // CUSTOM visible field validation + let validateVisibleFields = ['true', '1'].includes(event.target.getAttribute('data-powermail-morestep-validate')); + let scrollIntoView = ['true', '1'].includes(event.target.getAttribute('data-powermail-morestep-scroll')); + // validate visible fields if set before proceed + if (validateVisibleFields + && !form.powermailFormValidation.validateVisibleFields() + ) { + this.form.powermailFormValidation.scrollToFirstError(); + event.target.blur(); + event.preventDefault(); + return; + } + that.showFieldset(targetFieldset, form, backwards); + if (scrollIntoView) { + getAllFieldsetsOfForm(form)[targetFieldset]?.scrollIntoView({behavior:'smooth'}); + } }); } } diff --git a/Resources/Private/Partials/Form/Page.html b/Resources/Private/Partials/Form/Page.html index 927998cf5..0a647d8c0 100644 --- a/Resources/Private/Partials/Form/Page.html +++ b/Resources/Private/Partials/Form/Page.html @@ -16,7 +16,7 @@ - + diff --git a/Resources/Private/Templates/Form/Form.html b/Resources/Private/Templates/Form/Form.html index f7e259a50..213faac83 100644 --- a/Resources/Private/Templates/Form/Form.html +++ b/Resources/Private/Templates/Form/Form.html @@ -33,7 +33,7 @@

{form.title}

- +