From c0b3ccfeccc0a484e8575b5f4a58d92bc71d576f Mon Sep 17 00:00:00 2001 From: Rostislav Wolny Date: Mon, 25 Nov 2019 17:36:45 +0100 Subject: [PATCH] Refactor form data validation to extra function and run on every change [MAILPOET-2455] --- assets/js/src/form_editor/store/controls.jsx | 5 +++-- .../src/form_editor/store/form_validator.jsx | 7 ++++++ .../store/reducers/changeFormSettings.jsx | 22 +++++++++++++------ assets/js/src/form_editor/store/selectors.jsx | 3 +++ assets/js/src/form_editor/store/store.jsx | 2 ++ 5 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 assets/js/src/form_editor/store/form_validator.jsx diff --git a/assets/js/src/form_editor/store/controls.jsx b/assets/js/src/form_editor/store/controls.jsx index 692db7d0cc..0bd663fc4b 100644 --- a/assets/js/src/form_editor/store/controls.jsx +++ b/assets/js/src/form_editor/store/controls.jsx @@ -7,11 +7,12 @@ export default { return; } dispatch('mailpoet-form-editor').removeNotice('save-form'); - const formData = select('mailpoet-form-editor').getFormData(); - if (!formData.settings.segments || formData.settings.segments.length === 0) { + const formErrors = select('mailpoet-form-editor').getFormErrors(); + if (formErrors.includes('missing-lists')) { dispatch('mailpoet-form-editor').addDismissibleNotice(MailPoet.I18n.t('settingsPleaseSelectList'), 'error', 'missing-lists'); return; } + const formData = select('mailpoet-form-editor').getFormData(); dispatch('mailpoet-form-editor').saveFormStarted(); dispatch('mailpoet-form-editor').removeNotice('missing-lists'); MailPoet.Ajax.post({ diff --git a/assets/js/src/form_editor/store/form_validator.jsx b/assets/js/src/form_editor/store/form_validator.jsx new file mode 100644 index 0000000000..a48604ce6c --- /dev/null +++ b/assets/js/src/form_editor/store/form_validator.jsx @@ -0,0 +1,7 @@ +export default (formData) => { + const errors = []; + if (!formData.settings.segments || formData.settings.segments.length === 0) { + errors.push('missing-lists'); + } + return errors; +}; diff --git a/assets/js/src/form_editor/store/reducers/changeFormSettings.jsx b/assets/js/src/form_editor/store/reducers/changeFormSettings.jsx index e960138c43..4053af12e3 100644 --- a/assets/js/src/form_editor/store/reducers/changeFormSettings.jsx +++ b/assets/js/src/form_editor/store/reducers/changeFormSettings.jsx @@ -1,7 +1,15 @@ -export default (state, action) => ({ - ...state, - formData: { - ...state.formData, - settings: action.settings, - }, -}); +import validateForm from '../form_validator.jsx'; + +export default (state, action) => { + const newState = { + ...state, + formData: { + ...state.formData, + settings: action.settings, + }, + }; + return { + ...newState, + formErrors: validateForm(newState.formData), + }; +}; diff --git a/assets/js/src/form_editor/store/selectors.jsx b/assets/js/src/form_editor/store/selectors.jsx index 6619754771..bff4be5946 100644 --- a/assets/js/src/form_editor/store/selectors.jsx +++ b/assets/js/src/form_editor/store/selectors.jsx @@ -35,4 +35,7 @@ export default { getNotice(state, id) { return state.notices.find((notice) => notice.id === id); }, + getFormErrors(state) { + return state.formErrors; + }, }; diff --git a/assets/js/src/form_editor/store/store.jsx b/assets/js/src/form_editor/store/store.jsx index 2a9a0295ab..a8a6df0854 100644 --- a/assets/js/src/form_editor/store/store.jsx +++ b/assets/js/src/form_editor/store/store.jsx @@ -7,11 +7,13 @@ import * as actions from './actions.jsx'; import createReducer from './reducer.jsx'; import selectors from './selectors.jsx'; import controls from './controls.jsx'; +import validateForm from './form_validator.jsx'; const defaultState = { sidebarOpened: true, formData: window.mailpoet_form_data, formExports: window.mailpoet_form_exports, + formErrors: validateForm(window.mailpoet_form_data), segments: window.mailpoet_form_segments, pages: window.mailpoet_form_pages, isFormSaving: false,