From 6eca3661bfd19e3543b59b2850c3eb049408f1ad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Matej=20Zrim=C5=A1ek?= <mzrimsek@biosistemika.com>
Date: Thu, 8 Sep 2016 12:43:31 +0200
Subject: [PATCH] Some JS error refactoring and accordingly updated error
 rendering when experiment description is too long.

---
 .../experiments/dropdown_actions.js           | 27 ++++++-------------
 .../javascripts/sitewide/form_errors.js       | 16 ++++++++---
 .../sitewide/form_validators.js.erb           |  4 +--
 3 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/app/assets/javascripts/experiments/dropdown_actions.js b/app/assets/javascripts/experiments/dropdown_actions.js
index f0a48806d..f6956737e 100644
--- a/app/assets/javascripts/experiments/dropdown_actions.js
+++ b/app/assets/javascripts/experiments/dropdown_actions.js
@@ -61,15 +61,9 @@
         var msg = JSON.parse(error.responseText);
         renderFormError(e,
                         form.find("#experiment_project_id"),
-                        msg.message.toString());
+                        msg.message.toString(),
+                        true);
       })
-      .on('submit', function(){
-        form.clearFormErrors();
-      });
-
-      $(modal).on("hidden.bs.modal", function (){
-        form.clearFormErrors();
-      });
     }
   }
   // Setup front-end validations for experiment form
@@ -86,25 +80,20 @@
         if ( 'name' in msg ) {
           renderFormError(e,
                           element.find("#experiment-name"),
-                          msg.name.toString());
+                          msg.name.toString(),
+                          true);
         } else if ( 'description' in msg ) {
           renderFormError(e,
                           element.find("#experiment-description"),
-                          msg.description.toString());
+                          msg.description.toString(),
+                          true);
         } else {
           renderFormError(e,
                           element.find("#experiment-name"),
-                          error.statusText);
+                          error.statusText,
+                          true);
         }
       })
-      .on('submit', function() {
-        form.clearFormErrors();
-      });
-
-      $("#new-experiment-modal").on("hidden.bs.modal", function (){
-        form.clearFormErrors();
-      });
-
     }
   }
 
diff --git a/app/assets/javascripts/sitewide/form_errors.js b/app/assets/javascripts/sitewide/form_errors.js
index 8695dcf6d..5f9707cbc 100644
--- a/app/assets/javascripts/sitewide/form_errors.js
+++ b/app/assets/javascripts/sitewide/form_errors.js
@@ -33,9 +33,21 @@ $.fn.renderFormErrors = function (modelName, errors, clear, ev) {
  * and, if present, mark and show the tab where the error occured and
  * focus/scroll to the error input, if it is the first one to be
  * specified or if errMsgs is undefined.
+ *
+ * @param {string} errAttributes Span element (error) attributes
+ * @param {boolean} clearErr Set clearErr to true if this is the only
+ * error that can happen/show.
  */
-var renderFormError = function (ev, input, errMsgs, errAttributes) {
+var renderFormError = function (ev, input, errMsgs, clearErr, errAttributes) {
+  clearErr = _.isUndefined(clearErr) ? false : clearErr;
+  errAttributes = _.isUndefined(errAttributes) ? "" : " " + errAttributes;
+  $form = $(input).closest("form");
+
   if (!_.isUndefined(errMsgs)) {
+    if (clearErr) {
+      $form.clearFormErrors();
+    }
+
     // Mark error form group
     $formGroup = $(input).closest(".form-group");
     if (!$formGroup.hasClass("has-error")) {
@@ -43,7 +55,6 @@ var renderFormError = function (ev, input, errMsgs, errAttributes) {
     }
 
     // Add error message/s
-    errAttributes = _.isUndefined(errAttributes) ? "" : " " + errAttributes;
     error_text = ($.makeArray(errMsgs).map(function (m) {
       return m.strToErrorFormat();
     })).join("<br />");
@@ -51,7 +62,6 @@ var renderFormError = function (ev, input, errMsgs, errAttributes) {
     $formGroup.append($errSpan);
   }
 
-  $form = $(input).closest("form");
   $tab = $(input).closest(".tab-pane");
   if ($tab.length) {
     // Mark error tab
diff --git a/app/assets/javascripts/sitewide/form_validators.js.erb b/app/assets/javascripts/sitewide/form_validators.js.erb
index f42afec50..bd96677cc 100644
--- a/app/assets/javascripts/sitewide/form_validators.js.erb
+++ b/app/assets/javascripts/sitewide/form_validators.js.erb
@@ -95,7 +95,7 @@ function filesPresentValidator(ev, fileInputs) {
   _.each(fileInputs, function(fileInput) {
     if (!fileInput.files[0]) {
       assetError = I18n.t("general.file.blank");
-      renderFormError(ev, fileInput, assetError, "data-error='file-missing'");
+      renderFormError(ev, fileInput, assetError, false, "data-error='file-missing'");
       filesPresentValid = false;
     }
   });
@@ -125,7 +125,7 @@ function filesSizeValidator(ev, fileInputs, fileTypeEnum) {
     var file = fileInput.files[0];
     var assetError = getFileTooBigError(file);
     if (assetError) {
-      renderFormError(ev, fileInput, assetError, "data-error='file-size'");
+      renderFormError(ev, fileInput, assetError, false, "data-error='file-size'");
       filesSizeValid = false;
     }
   });