web staff: checkin transit dialog
authorBill Erickson <berick@esilibrary.com>
Wed, 27 Nov 2013 16:04:20 +0000 (11:04 -0500)
committerBill Erickson <berick@esilibrary.com>
Wed, 27 Nov 2013 16:04:20 +0000 (11:04 -0500)
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/src/templates/staff/circ/checkin/t_transit_dialog.tt2 [new file with mode: 0644]
Open-ILS/web/js/ui/default/staff/circ/checkin/app.js

diff --git a/Open-ILS/src/templates/staff/circ/checkin/t_transit_dialog.tt2 b/Open-ILS/src/templates/staff/circ/checkin/t_transit_dialog.tt2
new file mode 100644 (file)
index 0000000..ced65a3
--- /dev/null
@@ -0,0 +1,63 @@
+<div class="modal-dialog">
+  <div class="modal-content">
+    <div class="modal-header">
+      <button type="button" class="close" 
+        ng-click="ok()" aria-hidden="true">&times;</button>
+      <h4 class="modal-title">[% l('Transit Slip') %]</h4>
+    </div>
+    <div class="modal-body">
+      <div>
+        <span>[% l('Destination') %]</span>
+        <strong>{{dest.shortname()}}</strong>
+      </div>
+      <br/>
+      <div>
+        <address>
+          <strong>{{dest.name()}}</strong><br>
+          {{destAddr.street1()}} {{destAddr.street2()}}<br/>
+          {{destAddr.city()}}, {{destAddr.state()}} {{destAddr.post_code()}}<br/>
+          <abbr title="[% l('Phone') %]">P:</abbr> {{dest.phone()}}
+        </address>
+      </div>
+      <div>
+        <span>[% l('Item Barcode:') %]</span>
+        <span>{{evt.payload.copy.barcode()}}</span>
+      </div>
+      <div>
+        <span>[% l('Title:') %]</span>
+        <span>{{evt.payload.record.title()}}</span>
+      </div>
+      <div>
+        <span>[% l('Author:') %]</span>
+        <span>{{evt.payload.record.author()}}</span>
+      </div>
+      <div ng-if="holdUser">
+        <br/>
+        <div>[% |l %]
+          Hold for patron {{holdUser.family_name()}}, 
+          {{holdUser.first_given_name()}} {{holdUser.second_given_name()}}
+          [% END %]
+        </div>
+        <div>
+          <span>[% l('Patron Barcode:') %]</span>
+          <span>{{holdUser.card().barcode()}}</span>
+        </div>
+        <br/>
+        <div>
+          <span>[% l('Request Date:') %]</span>
+          <span>{{evt.payload.hold.request_time() | date:'shortDate'}}</span>
+        </div>
+        <div>
+          <span>[% l('Slip Date:') %]</span>
+          <span>{{now | date:'shortDate'}}</span>
+        </div>
+      </div>
+    </div>
+    <div class="modal-footer">
+      <input type="button" class="btn btn-primary" disabled="disabled"
+        ng-click="print()" value="[% l('Print') %]"/>
+      <input type="submit" class="btn btn-warning"
+        ng-click="ok()" value="[% l('Do Not Print') %]"/>
+    </div>
+  </div>
+</div>
index dd57d36..ef496c5 100644 (file)
@@ -19,11 +19,39 @@ function($q,  egList,  egNet,  egAuth,  egUser,  egEnv,  egOrg,  egList) {
 }])
 
 /**
+ * locally cached org unit addresses -- needed for route slips, etc.
+ */
+.factory('orgAddrSvc',
+       ['$q','egOrg','egPCRUD',
+function($q,  egOrg,  egPCRUD) {
+    var service = {cache : {}};
+    service.getAddr = function(org_id, addr_type) {
+        if (service.cache[org_id]) {
+            if (service.cache[org_id][addr_type]) {
+                return $q.when(service.cache[org_id][addr_type]);
+            }
+        } else {
+            service.cache[org_id] = {};
+        }
+
+        var deferred = $q.defer();
+        egPCRUD.retrieve('aoa', egOrg.get(org_id).holds_address())
+        .then(function(addr) {
+            service.cache[org_id][addr_type] = addr;
+            deferred.resolve(addr);
+        });
+        return deferred.promise;
+    }
+    return service;
+}])
+
+
+/**
  * Manages checkin
  */
 .controller('CheckinCtrl',
-       ['$scope','$modal','egStartup','checkinSvc','egNet','egAuth',
-function($scope,  $modal,  egStartup,  checkinSvc,  egNet,  egAuth) {
+       ['$scope','$q','$modal','egStartup','checkinSvc','egNet','egAuth','orgAddrSvc','egOrg','egPCRUD',
+function($scope,  $q,  $modal,  egStartup,  checkinSvc,  egNet,  egAuth,  orgAddrSvc,  egOrg,  egPCRUD) {
 
     // run egStartup here since it's not handled via resolver
     egStartup.go().then(
@@ -68,6 +96,7 @@ function($scope,  $modal,  egStartup,  checkinSvc,  egNet,  egAuth) {
             case 'SUCCESS':
             case 'ROUTE_ITEM':
                 checkinSvc.checkins.items.push(evt);
+                openRouteDialog(evt, args);
                 break;
             case 'ASSET_COPY_NOT_FOUND':
                 openAlertDialog('uncat_alert_dialog', evt, args);
@@ -95,5 +124,39 @@ function($scope,  $modal,  egStartup,  checkinSvc,  egNet,  egAuth) {
         }).result.then(function() {$scope.focusMe = true});
     }
 
+    function openRouteDialog(evt, args) {
+        // avoid unintended checkins while the dialog is open
+        $scope.blurMe = true;
+        $modal.open({
+            templateUrl: './circ/checkin/t_transit_dialog',
+            controller: 
+                ['$scope', '$modalInstance', 'destAddr', 'holdUser',
+                function($scope, $modalInstance, destAddr, holdUser) {
+                $scope.destAddr = destAddr;
+                $scope.holdUser = holdUser;
+                $scope.dest = egOrg.get(evt.org);
+                $scope.evt = evt;
+                $scope.now = new Date();
+                $scope.ok = function() {$modalInstance.close()}
+            }],
+            resolve : {
+                destAddr : function() {
+                    // TODO: response payload should flesh dest addr
+                    return orgAddrSvc.getAddr(evt.org, 'holds_address');
+                },
+                holdUser : function() {
+                    // TODO: response payload should flesh hold recipient
+                    if (!evt.payload.hold) return $q.when();
+                    return egPCRUD.retrieve('au', 
+                        evt.payload.hold.usr(), {
+                            flesh : 1,
+                            flesh_fields : {'au' : ['card']}
+                        }
+                    );
+                }
+            }
+        }).result.then(function() {$scope.focusMe = true});
+    }
+
 }])