webstaff: quick-receive from catalog record
authorMike Rylander <mrylander@gmail.com>
Fri, 26 May 2017 20:32:23 +0000 (16:32 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Tue, 30 May 2017 16:06:51 +0000 (12:06 -0400)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/templates/staff/cat/catalog/index.tt2
Open-ILS/src/templates/staff/cat/catalog/t_catalog.tt2
Open-ILS/src/templates/staff/share/t_org_select_dialog.tt2 [new file with mode: 0644]
Open-ILS/web/js/ui/default/staff/cat/catalog/app.js
Open-ILS/web/js/ui/default/staff/serials/services/core.js

index c2df10e..afaef9f 100644 (file)
@@ -10,6 +10,7 @@
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/eframe.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/cat/services/record.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/cat/services/tagtable.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/serials/services/core.js"></script>
 [% INCLUDE 'staff/cat/share/marcedit_strings.tt2' %]
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/cat/services/marcedit.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/services/circ.js"></script>
       "[% l('Item Transfer Target set') %]";                
     s.MARK_OVERLAY_TARGET =                                                                                                            
       "[% l('Record Overlay Target set') %]";                
+
+    s.SERIALS_NO_SUBS = "[% l('No subscriptions at the selected library') %]";
+    s.SERIALS_NO_ITEMS = "[% l('No items at the selected library') %]";
+
+    s.SERIALS_ISSUANCE_FAIL_SAVE = "[% l('Failed to save issuance') %]";
+    s.SERIALS_ISSUANCE_SUCCESS_SAVE = "[% l('Issuance saved') %]";
+
+    s.SERIALS_ITEM_STATUS = {};
+    s.SERIALS_ITEM_STATUS.Expected = "[% l('Expected') %]";
+    s.SERIALS_ITEM_STATUS.Received = "[% l('Received') %]";
+    s.SERIALS_ITEM_STATUS.Claimed = "[% l('Claimed') %]";
+    s.SERIALS_ITEM_STATUS.Bindery = "[% l('Bindery') %]";
+    s.SERIALS_ITEM_STATUS.Bound = "[% l('Bound') %]";
+    s.SERIALS_ITEM_STATUS.Discarded = "[% l('Discarded') %]";
+    s.SERIALS_ITEM_STATUS['Not Held'] = "[% l('Not Held' ) %]";
+    s.SERIALS_ITEM_STATUS['Not Published'] = "[% l('Not Published') %]";
+
   }])
 </script>
 
index 3819339..43719f3 100644 (file)
@@ -34,7 +34,7 @@
         </button>
         <ul uib-dropdown-menu role="menu" aria-labelledby="serials-button">
              <li role="menuitem">
-                <a ng-click="">[% l('Quick Receive') %]</a>
+                <a ng-click="quickReceive()">[% l('Quick Receive') %]</a>
             </li>
              <li role="menuitem">
                 <a target="_self" href="./serials/{{record_id}}">[% l('Manage Subscriptions') %]</a>
diff --git a/Open-ILS/src/templates/staff/share/t_org_select_dialog.tt2 b/Open-ILS/src/templates/staff/share/t_org_select_dialog.tt2
new file mode 100644 (file)
index 0000000..7981165
--- /dev/null
@@ -0,0 +1,22 @@
+<!--
+  Org selection interstitial
+-->
+<div>
+  <div class="modal-header">
+    <button type="button" class="close" 
+      ng-click="cancel()" aria-hidden="true">&times;</button>
+    <h4 class="modal-title alert alert-info">{{ title || '[% l('Select library') %]'}}</h4> 
+  </div>
+  <div class="modal-body">
+    <div class="row">
+      <div class="col-md-12">
+        <eg-org-selector sticky-setting="{{rememberMe}}" selected="ws_ou" focus-me="focus"></eg-org-selector>
+      </div>
+    </div>
+  </div>
+  <div class="modal-footer">
+    <input type="submit" class="btn btn-primary" 
+      ng-click="ok()" value="[% l('OK/Continue') %]"/>
+    <button class="btn btn-warning" ng-click="cancel()">[% l('Cancel') %]</button>
+  </div>
+</div>
index 1f1ac58..1fa43f0 100644 (file)
@@ -7,7 +7,7 @@
  *
  */
 
-angular.module('egCatalogApp', ['ui.bootstrap','ngRoute','ngLocationUpdate','egCoreMod','egGridMod', 'egMarcMod', 'egUserMod', 'egHoldingsMod', 'ngToast'])
+angular.module('egCatalogApp', ['ui.bootstrap','ngRoute','ngLocationUpdate','egCoreMod','egGridMod', 'egMarcMod', 'egUserMod', 'egHoldingsMod', 'ngToast', 'egSerialsMod'])
 
 .config(['ngToastProvider', function(ngToastProvider) {
   ngToastProvider.configure({
@@ -246,10 +246,10 @@ function($scope , $routeParams , $location , $window , $q , egCore) {
 .controller('CatalogCtrl',
        ['$scope','$routeParams','$location','$window','$q','egCore','egHolds','egCirc','egConfirmDialog','ngToast',
         'egGridDataProvider','egHoldGridActions','egProgressDialog','$timeout','$uibModal','holdingsSvc','egUser','conjoinedSvc',
-        '$cookies',
+        '$cookies','egSerialsCoreSvc',
 function($scope , $routeParams , $location , $window , $q , egCore , egHolds , egCirc , egConfirmDialog , ngToast ,
          egGridDataProvider , egHoldGridActions , egProgressDialog , $timeout , $uibModal , holdingsSvc , egUser , conjoinedSvc,
-         $cookies
+         $cookies , egSerialsCoreSvc
 ) {
 
     var holdingsSvcInst = new holdingsSvc();
@@ -365,6 +365,67 @@ function($scope , $routeParams , $location , $window , $q , egCore , egHolds , e
     $scope.current_voltransfer_target = egCore.hatch.getLocalItem('eg.cat.marked_volume_transfer_record');
     $scope.current_conjoined_target   = egCore.hatch.getLocalItem('eg.cat.marked_conjoined_record');
 
+    $scope.quickReceive = function () {
+        var list = [];
+        var next_per_stream = {};
+
+        return $uibModal.open({
+            templateUrl: './share/t_org_select_dialog',
+            controller: ['$scope', '$uibModalInstance',
+                function($scope, $uibModalInstance) {
+
+                    $scope.focus = true;
+                    $scope.rememberMe = 'eg.serials.quickreceive.last_org';
+
+                    $scope.ok = function() { $uibModalInstance.close($scope.ws_ou.id()) }
+                    $scope.cancel = function() { $uibModalInstance.dismiss(); }
+                }
+            ]
+        }).result.then(function(org) {
+            if (org) {
+                return egSerialsCoreSvc.fetch($scope.record_id, egCore.org.descendants(org, true)).then(function(sub_list){
+                    if (!sub_list.length) {
+                        ngToast.warning(egCore.strings.SERIALS_NO_SUBS);
+                        return $q.reject();
+                    }
+
+                    var promises = [];
+                    angular.forEach(sub_list, function (sub) {
+                        promises.push(egSerialsCoreSvc.fetchItemsForSub(sub.id(),{status:'Expected'}).then(function(){
+                            angular.forEach(egSerialsCoreSvc.itemTree, function (item) {
+                                if (next_per_stream[item.stream().id()]) return;
+                                if (item.status() == 'Expected') {
+                                    next_per_stream[item.stream().id()] = item;
+                                    list.push(egCore.idl.Clone(item));
+                                }
+                            });
+                        }));
+                    });
+
+                    return $q.all(promises).then(function() {
+
+                        if (!list.length) {
+                            ngToast.warning(egCore.strings.SERIALS_NO_ITEMS);
+                            return $q.reject();
+                        }
+
+                        return egSerialsCoreSvc.process_items(
+                            'receive',
+                            $scope.record_id,
+                            list,
+                            true, // barcode
+                            false,// bind
+                            false, // print by default
+                            function() { $scope.holdings_record_id_changed($scope.record_id) }
+                        );
+                    });
+                });
+            } else {
+                return $q.reject();
+            }
+        });
+    }
+
     $scope.markConjoined = function () {
         $scope.current_conjoined_target = $scope.record_id;
         egCore.hatch.setLocalItem('eg.cat.marked_conjoined_record',$scope.record_id);
index 7ec21ba..47d1bf5 100644 (file)
@@ -152,9 +152,11 @@ function(egCore , orderByFilter , $q , $filter , $uibModal , ngToast , egConfirm
     // and notes associated with the indicated bib
     service.fetch = function(bibId, contextOrg) {
         // TODO filter by contextOrg
-        return egCore.pcrud.search('ssub', {
-                record_entry : bibId
-            }, {
+
+        var filter = { record_entry : bibId };
+        if (contextOrg) filter.owning_lib = contextOrg;
+        return egCore.pcrud.search('ssub', filter,
+            {
                 flesh : 5,
                 flesh_fields : {
                     'ssub'  : ['owning_lib','distributions', 'scaps', 'notes'],
@@ -174,6 +176,7 @@ function(egCore , orderByFilter , $q , $filter , $uibModal , ngToast , egConfirm
             service.bibId = bibId;
             service.subTree = list;
             update_flat_sdist_sstr_list();
+            return $q.when(list);
         });
     }