From 7ae201655ab1e877d01d97e443570c3514cdf14c Mon Sep 17 00:00:00 2001 From: dandds Date: Tue, 25 Sep 2018 12:02:59 -0400 Subject: [PATCH] refactor new project component form validation --- js/components/forms/new_project.js | 64 ++++++---------------- templates/components/alert.html | 8 ++- templates/fragments/edit_project_form.html | 11 +--- 3 files changed, 24 insertions(+), 59 deletions(-) diff --git a/js/components/forms/new_project.js b/js/components/forms/new_project.js index c4aa3642..480592b4 100644 --- a/js/components/forms/new_project.js +++ b/js/components/forms/new_project.js @@ -3,45 +3,6 @@ import textinput from '../text_input' const createEnvironment = (name) => ({ name }) -const VALIDATIONS = { - showMissingError: "hasEnvironments", - showUniqueError: "envNamesAreUnique", - showEmptyError: "environmentsHaveNames", -} - -class Validator { - constructor(validations) { - this.validations = validations - } - - errorList() { - let errors = {} - this.map((key) => { - errors[key] = false - }) - return errors - } - - map(callback) { - Object.keys(this.validations).map((k) => callback(k)) - } - - update(object) { - this.map((errName) => { - if (object[this.validations[errName]]()) { - object.errors[errName] = false - } - }) - } - - validate(object) { - this.map((errName) => { - object.errors[errName] = !object[this.validations[errName]]() - }) - return Object.values(object.errors).every(e => e) - } -} - export default { name: 'new-project', @@ -70,11 +31,13 @@ export default { : [""] ).map(createEnvironment) - const validator = new Validator(VALIDATIONS) - return { - validator, - errors: validator.errorList(), + validations: [ + {func: "hasEnvironments", message: "Provide at least one environment name."}, + {func: "envNamesAreUnique", message: "Environment names must be unique."}, + {func: "environmentsHaveNames", message: "Environment names cannot be empty."}, + ], + errors: [], environments, name, } @@ -84,10 +47,6 @@ export default { this.$root.$on('onEnvironmentAdded', this.addEnvironment) }, - updated: function() { - this.validator.update(this) - }, - methods: { addEnvironment: function (event) { this.environments.push(createEnvironment("")) @@ -99,6 +58,14 @@ export default { } }, + validate: function() { + this.errors = this.validations.map((validation) => { + if (!this[validation.func]()) { + return validation.message + } + }).filter(Boolean) + }, + hasEnvironments: function () { return this.environments.length > 0 && this.environments.some((e) => e.name !== "") }, @@ -128,7 +95,8 @@ export default { return newVal.showValid && previous }, true) - isValid = this.validator.validate(this) && isValid + this.validate() + isValid = this.errors.length == 0 && isValid if (isValid) { this.openModal(modalName) diff --git a/templates/components/alert.html b/templates/components/alert.html index 1fa86489..d170e2bb 100644 --- a/templates/components/alert.html +++ b/templates/components/alert.html @@ -1,6 +1,6 @@ {% from "components/icon.html" import Icon %} -{% macro Alert(title, message=None, actions=None, level='info', fragment=None) -%} +{% macro Alert(title, message=None, actions=None, level='info', fragment=None, vue_template=False) -%} {% set role = 'alertdialog' if actions else 'alert' %} {% set levels = { 'warning': { @@ -25,7 +25,11 @@ {{ Icon(levels.get(level).get('icon'), classes='alert__icon icon--large') }}
-

{{title}}

+ {% if vue_template %} +

+ {% else %} +

{{title}}

+ {% endif %} {% if message %}
{{ message | safe }}
diff --git a/templates/fragments/edit_project_form.html b/templates/fragments/edit_project_form.html index 59f90607..006ceb24 100644 --- a/templates/fragments/edit_project_form.html +++ b/templates/fragments/edit_project_form.html @@ -42,14 +42,8 @@
-
- {{ Alert("Provide at least one environment name.", level="error") }} -
-
- {{ Alert("Environment names must be unique.", level="error") }} -
-
- {{ Alert("Environment names cannot be empty.", level="error") }} +
+ {{ Alert(message=None, level="error", vue_template=True) }}
@@ -78,7 +72,6 @@
-