webstaff: improve dirty detection and reloading on prediction manager
authorGalen Charlton <gmc@equinoxinitiative.org>
Thu, 13 Jul 2017 20:43:01 +0000 (16:43 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Thu, 13 Jul 2017 20:43:01 +0000 (16:43 -0400)
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Open-ILS/src/templates/staff/serials/t_prediction_manager.tt2
Open-ILS/web/js/ui/default/staff/serials/directives/prediction_manager.js

index 0dda638..f28b1b6 100644 (file)
@@ -11,7 +11,7 @@
     </select>
   </div>
   <div class="row" ng-if="new_prediction">
-    <ng-form name="new_prediction.predform" class="form-inline">
+    <ng-form name="forms.newpredform" class="form-inline">
       <div class="col-md-1"></div>
       <div class="col-md-1">
         <label class="checkbox-inline">
               <option value="index">[% l('Index') %]</option>
           </select>
           <button class="btn btn-default" ng-if="new_prediction.pattern_code === null"
-                  ng-click="openPatternEditorDialog(new_prediction)">[% l('Create Pattern') %]</button>
+                  ng-click="openPatternEditorDialog(new_prediction, forms.newpredform)">[% l('Create Pattern') %]</button>
           <button class="btn btn-default" ng-if="new_prediction.pattern_code !== null"
-                  ng-click="openPatternEditorDialog(new_prediction)">[% l('Edit Pattern') %]</button>
+                  ng-click="openPatternEditorDialog(new_prediction, forms.newpredform)">[% l('Edit Pattern') %]</button>
         </div>
       <div>
           <button type="submit" class="btn btn-default" ng-click="cancelNewScap()">[% l('Cancel') %]</button>
-          <button type="submit" class="btn btn-primary" ng-disabled="!new_prediction.predform.$dirty" ng-click="createScap(new_prediction)">[% l('Create') %]</button>
+          <button type="submit" class="btn btn-primary" ng-disabled="(new_prediction.pattern_code === null) || !forms.newpredform.$dirty" ng-click="createScap(new_prediction)">[% l('Create') %]</button>
       </div>
     </form>
   </div>
   <h3>[% l('Existing Prediction Patterns') %]</h3>
   <div class="row" ng-repeat="pred in predictions | orderBy: 'id' as filtered track by pred.id">
-    <ng-form name="pred.predform" class="form-inline">
+    <ng-form name="forms['predform' + pred.id]" class="form-inline">
     <div class="col-md-1"><label>[% l('ID') %] {{pred.id}}</label></div>
     <div class="col-md-1">
       <label class="checkbox-inline">
             <option value="supplement">[% l('Supplement') %]</option>
             <option value="index">[% l('Index') %]</option>
         </select>
-        <button class="btn btn-default" ng-click="openPatternEditorDialog(pred, false)" ng-if=" pred._can_edit_or_delete">[% l('Edit Pattern') %]</button>
-        <button class="btn btn-default" ng-click="openPatternEditorDialog(pred, true)"  ng-if="!pred._can_edit_or_delete">[% l('View Pattern') %]</button>
+        <button class="btn btn-default" ng-click="openPatternEditorDialog(pred, forms['predform' + pred.id], false)" ng-if=" pred._can_edit_or_delete">[% l('Edit Pattern') %]</button>
+        <button class="btn btn-default" ng-click="openPatternEditorDialog(pred, forms['predform' + pred.id], true)"  ng-if="!pred._can_edit_or_delete">[% l('View Pattern') %]</button>
     </div>
     <div>
-        <button class="btn btn-default" ng-disabled="pred.predform.$dirty" ng-click="add_issuances()">[% l('Predict New Issues') %]</button>
+        <button class="btn btn-default" ng-disabled="forms['predform' + pred.id].$dirty" ng-click="add_issuances()">[% l('Predict New Issues') %]</button>
         <button type="submit" class="btn btn-default" ng-disabled="!pred._can_edit_or_delete" ng-click="deleteScap(pred)">[% l('Delete') %]</button>
-        <button type="submit" class="btn btn-primary" ng-disabled="!pred.predform.$dirty" ng-click="updateScap(pred)">[% l('Save') %]</button>
+        <button type="submit" class="btn btn-primary" ng-disabled="!forms['predform' + pred.id].$dirty" ng-click="updateScap(pred)">[% l('Save') %]</button>
     </div>
     </form>
   </div>
index 14164f3..d0cd44f 100644 (file)
@@ -16,6 +16,7 @@ function($scope , $q , egSerialsCoreSvc , egCore , egGridDataProvider ,
          $uibModal , $timeout , $location , egConfirmDialog , ngToast) {
 
     $scope.has_pattern_to_import = false;
+    $scope.forms = [];
     egSerialsCoreSvc.fetch($scope.bibId).then(function() {
         reload($scope.ssubId);
         egSerialsCoreSvc.fetch_patterns_from_bibs_mfhds($scope.bibId).then(function() {
@@ -26,6 +27,7 @@ function($scope , $q , egSerialsCoreSvc , egCore , egGridDataProvider ,
     });
 
     function reload(ssubId) {
+        if (!ssubId) return;
         var ssub = egSerialsCoreSvc.get_ssub(ssubId);
         $scope.predictions = egCore.idl.toTypedHash(ssub.scaps());
         angular.forEach($scope.predictions, function(pred) {
@@ -48,10 +50,6 @@ function($scope , $q , egSerialsCoreSvc , egCore , egGridDataProvider ,
         });
     }
 
-    $scope.$watch('ssubId', function(newVal, oldVal) {
-        if (newVal && newVal != oldVal) reload(newVal);
-    });
-
     $scope.createScap = function(pred) {
         var scap = egCore.idl.fromTypedHash(pred);
         egCore.pcrud.create(scap).then(function() {
@@ -162,12 +160,14 @@ function($scope , $q , egSerialsCoreSvc , egCore , egGridDataProvider ,
         }
         // Mark form dirty because, when it's created from a template,
         // it can be immediately saved if the user so chooses. The
-        // $timeout() allows this to happen after the form is bound
-        // is bound to $scope.new_prediction.
-        $timeout(function() { $scope.new_prediction.predform.$setDirty() });
+        // $watch() allows this to happen after the form is bound
+        // is bound to the scope.
+        $scope.$watch('forms.newpredform', function(form) {
+            if (form) form.$setDirty();
+        });
     }
 
-    $scope.openPatternEditorDialog = function(pred, viewOnly) {
+    $scope.openPatternEditorDialog = function(pred, form, viewOnly) {
         $uibModal.open({
             templateUrl: './serials/t_pattern_editor_dialog',
             size: 'lg',
@@ -184,7 +184,7 @@ function($scope , $q , egSerialsCoreSvc , egCore , egGridDataProvider ,
         }).result.then(function (patternCode) {
             if (pred.pattern_code !== patternCode) {
                 pred.pattern_code = patternCode;
-                pred.predform.$setDirty();        
+                form.$setDirty();        
             }
         });
     }