LP#1549505: add validation of required badge fields
authorGalen Charlton <gmc@esilibrary.com>
Wed, 30 Mar 2016 21:29:32 +0000 (17:29 -0400)
committerGalen Charlton <gmc@esilibrary.com>
Wed, 30 Mar 2016 21:29:32 +0000 (17:29 -0400)
The badge name is always required; the horizon and
percentile may be required depending on the popularity
parameter.

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
Open-ILS/src/templates/staff/admin/local/rating/edit_badge.tt2
Open-ILS/src/templates/staff/css/style.css.tt2
Open-ILS/web/js/ui/default/staff/admin/local/rating/badge.js

index 75e2958..9a1426b 100644 (file)
@@ -1,4 +1,4 @@
-<form ng-submit="ok(record)" role="form">
+<form ng-submit="ok(record)" role="form" class="form-validated">
     <div class="modal-header">
       <button type="button" class="close" ng-click="cancel()" 
         aria-hidden="true">&times;</button>
                 onchange="record[field.name + '_ou'].update_org">
             </eg-org-selector>
             <input ng-if="field.datatype == 'text'"
+                ng-required="field.is_required(record)"
                 ng-model="record[field.name]"></input>
             <input ng-if="field.datatype == 'int'" type="number"
+                ng-required="field.is_required(record)"
                 ng-model="record[field.name]"></input>
             <input ng-if="field.datatype == 'float'" type="number" step="0.1"
+                ng-required="field.is_required(record)"
                 ng-model="record[field.name]"></input>
             <span ng-if="field.datatype == 'link'" class="nullable">
             <select ng-if="field.datatype == 'link'"
index 0c21913..9e3c7c3 100644 (file)
@@ -97,6 +97,9 @@
 .form-validated input.ng-valid.ng-dirty {
   background-color: #78FA89;
 }
+.form-validated input.ng-invalid-required {
+  background-color: #FACDCF;
+}
 
 /* --------------------------------------------------------------------------
  * Local style
index a581a87..3df43e9 100644 (file)
@@ -35,6 +35,19 @@ function($scope , $q , $timeout , $location , $window , $modal ,
         return results;
     }
 
+    horizon_required = {};
+    percentile_required = {};
+    function get_popularity_with_required() {
+        egCore.pcrud.retrieveAll(
+            'rp', {}, {atomic : true}
+        ).then(function(list) {
+            angular.forEach(list, function(item) {
+                horizon_required[item.id()] = item.require_horizon();
+                percentile_required[item.id()] = item.require_percentile();
+            });
+        });
+    }
+
     function get_field_list(rec) {
         var fields = egCore.idl.classes['rb'].fields;
 
@@ -58,6 +71,24 @@ function($scope , $q , $timeout , $location , $window , $modal ,
             if (fld.name == 'last_calc') {
                 fld['readonly'] = true;
             }
+            fld.is_required = function(record) {
+                return false;
+            };
+            if (fld.name == 'name') {
+                fld.is_required = function(record) {
+                    return true;
+                };
+            }
+            if (fld.name == 'horizon_age') {
+                fld.is_required = function(record) {
+                    return horizon_required[record['popularity_parameter']] == 't';
+                };
+            }
+            if (fld.name == 'percentile') {
+                fld.is_required = function(record) {
+                    return percentile_required[record['popularity_parameter']] == 't';
+                };
+            }
         });
         return fields;
     }
@@ -74,6 +105,7 @@ function($scope , $q , $timeout , $location , $window , $modal ,
                 $scope.record.percentile = parseFloat($scope.record.percentile);
                 $scope.record_label = get_record_label();
                 $scope.fields = get_field_list($scope.record);
+                get_popularity_with_required();
                 $scope.ok = function(args) { $modalInstance.close(args) }
                 $scope.cancel = function () { $modalInstance.dismiss() }
             }]