LP#1727345 - fix bibsource when importing or overlaying
authorCesar Velez <cesar.velez@equinoxinitiative.org>
Fri, 21 Sep 2018 15:46:59 +0000 (11:46 -0400)
committerCesar Velez <cesardv@protonmail.ch>
Tue, 22 Jan 2019 17:32:00 +0000 (12:32 -0500)
This addresses several issues that were causing the
bib source to either not display correctly on the record page
or not save correctly when editing z3950 imports/overlays
Refactors passing around of bib source into eg-marc-edit and it's
child directive egMarcEditBibsource.

Two paths to test:
Path A)
    1. Import a new bib record from z3950, but via "Edit then Import"
    2. Bring up marc editor and choose save w/ bib source.
    3. Verify chosen bib source saved correctly on record page.
Path B)
    1. Mark a record as target for Overlay, go to z3950 import.
    2. Make a search, select item for Overlay.
    3. Choose Edit z3950 record to bring up marceditor, save with a bib source.
    4. Verify chosen bib source saved correctly on record page.

Signed-off by: Cesar Velez <cesar.velez@equinoxinitiative.org>
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Jane Sandberg <sandbej@linnbenton.edu>
Open-ILS/src/templates/staff/cat/z3950/t_edit_overlay_record.tt2
Open-ILS/src/templates/staff/cat/z3950/t_marc_edit.tt2
Open-ILS/web/js/ui/default/staff/cat/services/marcedit.js
Open-ILS/web/js/ui/default/staff/cat/z3950/app.js

index 7ebc94e..1281b43 100644 (file)
@@ -5,7 +5,7 @@
     <h4 class="modal-title">[% l('Edit Overlay Record') %]</h4>
   </div>
   <div class="modal-body">
-    <eg-marc-edit-record dirty-flag="dirty_flag" record-id="record_id" marc-xml="args.marc_xml"
+    <eg-marc-edit-record dirty-flag="dirty_flag" record-id="record_id" marc-xml="args.marc_xml" bib-source="args.bib_source"
                          on-save="ok" in-place-mode="true" record-type="bre" save-label="[% l('Save') %]" />
   </div>
   <div class="modal-footer">
index bcbe41f..6bc7086 100644 (file)
@@ -5,8 +5,8 @@
     <h4 class="modal-title">[% l('Import Record') %]</h4>
   </div>
   <div class="modal-body">
-    <eg-marc-edit-record dirty-flag="dirty_flag" record-id="record_id" marc-xml="marc_xml"
-                         record-type="bre" save-label="{{save_label}}"
+    <eg-marc-edit-record dirty-flag="dirty_flag" record-id="record_id" marc-xml="args.marc_xml"
+                         record-type="bre" save-label="{{save_label}}" bib-source="args.bib_source"
                          on-save="import_record_callback" fast-add="true" in-place-mode="in_place_mode"
     />
   </div>
index a3cca7a..d288669 100644 (file)
@@ -654,6 +654,7 @@ angular.module('egMarcMod', ['egCoreMod', 'ui.bootstrap'])
             dirtyFlag : '=',
             recordId : '=',
             marcXml : '=',
+            bibSource : '=?',
             onSave : '=',
             // in-place mode means that the editor is being
             // used just to munge some MARCXML client-side, rather
@@ -719,8 +720,11 @@ angular.module('egMarcMod', ['egCoreMod', 'ui.bootstrap'])
                     if (newVal != oldVal) egCore.hatch.setItem('cat.marcedit.flateditor', newVal);
                 });
 
+                // necessary to prevent ng-model scope hiding ugliness in egMarcEditBibSource:
+                $scope.bib_source = {
+                    id : $scope.bibSource ? $scope.bibSource : null
+                };
                 $scope.brandNewRecord = false;
-                $scope.bib_source = null;
                 $scope.record_type = $scope.recordType || 'bre';
                 $scope.max_undo = $scope.maxUndo || 100;
                 $scope.record_undo_stack = [];
@@ -1189,8 +1193,8 @@ angular.module('egMarcMod', ['egCoreMod', 'ui.bootstrap'])
                         $scope.dirtyFlag = false;
                         $scope.flat_text_marc = $scope.record.toBreaker();
 
-                        if ($scope.record_type == 'bre') {
-                            $scope.bib_source = $scope.Record().source();
+                        if ($scope.record_type == 'bre' && !$scope.brandNewRecord) {
+                            $scope.bib_source.id = $scope.bibSource = rec.source(); //$scope.Record().source();
                         }
 
                     }).then(function(){
@@ -1368,10 +1372,17 @@ angular.module('egMarcMod', ['egCoreMod', 'ui.bootstrap'])
                 };
 
                 $scope.saveRecord = function () {
+                    
                     if ($scope.inPlaceMode) {
                         $scope.marcXml = $scope.record.toXmlString();
+                        
+                        if ($scope.record_type == 'bre'){
+                            $scope.bibSource = $scope.bib_source.id;
+                        }
+
                         return $timeout(processOnSaveCallbacks);
                     }
+
                     $scope.mangle_005();
                     $scope.Record().editor(egCore.auth.user().id());
                     $scope.Record().edit_date('now');
@@ -1519,7 +1530,7 @@ angular.module('egMarcMod', ['egCoreMod', 'ui.bootstrap'])
         restrict: 'E',
         replace: true,
         template: '<span class="nullable">'+
-                    '<select class="form-control" ng-model="bib_source" ng-options="s.id() as s.source() for s in bib_sources | orderBy: \'source()\'">'+
+                    '<select class="form-control" ng-model="bib_source.id" ng-options="s.id() as s.source() for s in bib_sources | orderBy: \'source()\'">'+
                       '<option value="">Select a Source</option>'+
                     '</select>'+
                   '</span>',
@@ -1527,9 +1538,11 @@ angular.module('egMarcMod', ['egCoreMod', 'ui.bootstrap'])
             function ($scope , egCore) {
 
                 egCore.pcrud.retrieveAll('cbs', {}, {atomic : true})
-                    .then(function(list) { $scope.bib_sources = list; });
+                    .then(function(list) {
+                        $scope.bib_sources = list;
+                    });
 
-                $scope.$watch('bib_source',
+                $scope.$watch('bib_source.id',
                     function(newVal, oldVal) {
                         if (newVal !== oldVal) {
                             $scope.bre.source(newVal);
index b524797..94d6804 100644 (file)
@@ -68,6 +68,10 @@ function($scope , $q , $location , $timeout , $window,  egCore , egGridDataProvi
 
     $scope.total_hits = 0;
 
+    var bib_sources = null;
+    egCore.pcrud.retrieveAll('cbs', {}, {atomic : true})
+        .then(function(l) { bib_sources = l; });
+
     var provider = egGridDataProvider.instance({});
 
     provider.get = function(offset, count) {
@@ -148,6 +152,16 @@ function($scope , $q , $location , $timeout , $window,  egCore , egGridDataProvi
     $scope.raw_search_impossible = function() {
         return egZ3950TargetSvc.rawSearchImpossible();
     }
+
+    $scope.get_bibsrc_name_from_id = function(bs_id){
+        // var sel_bib_src = bib_src.id ? bib_src.list.filter(s => s.id() == bib_src.id) : null;
+        // TODO can we use arrow syntax yet???
+        if (!bs_id) return null;
+        var cbs = bib_sources.filter(function(s){ return s.id() == bs_id });
+
+        return (cbs && cbs[0] ? cbs[0].source() : null);
+    };
+
     $scope.showRawSearchForm = function() {
         $uibModal.open({
             templateUrl: './cat/z3950/t_raw_search',
@@ -218,14 +232,17 @@ function($scope , $q , $location , $timeout , $window,  egCore , egGridDataProvi
         return $scope._import(items[0]['marcxml']);
     };
 
-    $scope._import = function(marc_xml) {
+    $scope._import = function(marc_xml,bib_source) {
+
+        var bibsrc_name = $scope.get_bibsrc_name_from_id(bib_source);
+
         var deferred = $q.defer();
         egCore.net.request(
             'open-ils.cat',
             'open-ils.cat.biblio.record.xml.import',
             egCore.auth.token(),
             marc_xml,
-            null, // FIXME bib source
+            bibsrc_name,
             null,
             null,
             $scope.selectFieldStripGroups()
@@ -278,7 +295,9 @@ function($scope , $q , $location , $timeout , $window,  egCore , egGridDataProvi
                 $scope.focusMe = true;
                 $scope.record_id = recId;
                 $scope.dirty_flag = false;
-                $scope.marc_xml = items[0]['marcxml'];
+                $scope.args = {};
+                $scope.args.marc_xml = items[0]['marcxml'];
+                $scope.args.bib_source = null;
                 $scope.ok = function(args) { $uibModalInstance.close(args) }
                 $scope.cancel = function () { $uibModalInstance.dismiss() }
                 $scope.save_label = egCore.strings.IMPORT_BUTTON_LABEL;
@@ -289,7 +308,7 @@ function($scope , $q , $location , $timeout , $window,  egCore , egGridDataProvi
                         // This timeout is required to allow angular to finish variable assignments
                         // in the marcediter app. Allowing marc_xml to propigate here.
                         $timeout( function() {
-                            _import($scope.marc_xml).then( function(record_obj) {
+                            _import($scope.args.marc_xml, $scope.args.bib_source).then( function(record_obj) {
                                 if( record_obj.id ) {
                                     $scope.record_id = record_obj.id();
                                     $scope.save_label = egCore.strings.SAVE_BUTTON_LABEL;
@@ -332,8 +351,10 @@ function($scope , $q , $location , $timeout , $window,  egCore , egGridDataProvi
         var overlay_target = $scope.local_overlay_target;
         var live_overlay_target = egCore.hatch.getLocalItem('eg.cat.marked_overlay_record') || 0;
         var args = {
-            'marc_xml' : items[0]['marcxml']
+            'marc_xml' : items[0]['marcxml'],
+            'bib_source' : null
         };
+
         $uibModal.open({
             templateUrl: './cat/z3950/t_overlay',
             backdrop: 'static',
@@ -436,13 +457,14 @@ function($scope , $q , $location , $timeout , $window,  egCore , egGridDataProvi
 
             }]
         }).result.then(function (args) {
+            var bibsrc_name = $scope.get_bibsrc_name_from_id(args.bib_source);
             egCore.net.request(
                 'open-ils.cat',
                 'open-ils.cat.biblio.record.marc.replace',
                 egCore.auth.token(),
                 overlay_target,
                 (args.overlay_target.merged ? args.overlay_target.marc_xml : args.marc_xml),
-                null, // FIXME bib source
+                bibsrc_name,
                 null,
                 $scope.selectFieldStripGroups()
             ).then(