From eaccbad139c8ac2838abf83a58c5494cdcb82160 Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Thu, 17 Jul 2014 17:09:47 -0400 Subject: [PATCH] initial patron hold placement via catalog Signed-off-by: Bill Erickson --- .../src/templates/staff/circ/patron/t_holds.tt2 | 7 ++ .../templates/staff/circ/patron/t_holds_create.tt2 | 4 ++ .../templates/staff/circ/patron/t_holds_list.tt2 | 2 + .../web/js/ui/default/staff/cat/catalog/app.js | 77 +------------------- .../web/js/ui/default/staff/circ/patron/app.js | 6 ++ .../web/js/ui/default/staff/circ/patron/holds.js | 31 +++++++++ .../web/js/ui/default/staff/services/eframe.js | 81 +++++++++++++++++++++- 7 files changed, 129 insertions(+), 79 deletions(-) create mode 100644 Open-ILS/src/templates/staff/circ/patron/t_holds_create.tt2 diff --git a/Open-ILS/src/templates/staff/circ/patron/t_holds.tt2 b/Open-ILS/src/templates/staff/circ/patron/t_holds.tt2 index cdd5e46763..5ccd762a76 100644 --- a/Open-ILS/src/templates/staff/circ/patron/t_holds.tt2 +++ b/Open-ILS/src/templates/staff/circ/patron/t_holds.tt2 @@ -29,3 +29,10 @@ record-id="detail_hold_record_id"> + + + +
+ +
diff --git a/Open-ILS/src/templates/staff/circ/patron/t_holds_create.tt2 b/Open-ILS/src/templates/staff/circ/patron/t_holds_create.tt2 new file mode 100644 index 0000000000..e8e82e4e64 --- /dev/null +++ b/Open-ILS/src/templates/staff/circ/patron/t_holds_create.tt2 @@ -0,0 +1,4 @@ + + + diff --git a/Open-ILS/src/templates/staff/circ/patron/t_holds_list.tt2 b/Open-ILS/src/templates/staff/circ/patron/t_holds_list.tt2 index d3bbae0a29..df026fa945 100644 --- a/Open-ILS/src/templates/staff/circ/patron/t_holds_list.tt2 +++ b/Open-ILS/src/templates/staff/circ/patron/t_holds_list.tt2 @@ -4,6 +4,8 @@ items-provider="gridDataProvider" persist-key="circ.patron.holds"> + diff --git a/Open-ILS/web/js/ui/default/staff/cat/catalog/app.js b/Open-ILS/web/js/ui/default/staff/cat/catalog/app.js index 4a58a2323c..8c06ad5c1a 100644 --- a/Open-ILS/web/js/ui/default/staff/cat/catalog/app.js +++ b/Open-ILS/web/js/ui/default/staff/cat/catalog/app.js @@ -72,82 +72,7 @@ function($scope , $routeParams , $location , $q , egCore , egHolds, } // xulG catalog handlers - $scope.handlers = { - get_barcode_and_settings_async : function(barcode, only_settings) { - if (!barcode) return $q.reject(); - var deferred = $q.defer(); - - var barcode_promise = $q.when(barcode); - if (!only_settings) { - - // first verify / locate the barcode - barcode_promise = egCore.net.request( - 'open-ils.actor', - 'open-ils.actor.get_barcodes', - egCore.auth.token(), - egCore.auth.user().ws_ou(), 'actor', barcode - ).then(function(resp) { - - if (!resp || egCore.evt.parse(resp) || !resp.length) { - console.error('user not found: ' + barcode); - deferred.reject(); - return null; - } - - resp = resp[0]; - return barcode = resp.barcode; - }); - } - - barcode_promise.then(function(barcode) { - if (!barcode) return; - - return egCore.net.request( - 'open-ils.actor', - 'open-ils.actor.user.fleshed.retrieve_by_barcode', - egCore.auth.token(), barcode); - - }).then(function(user) { - if (!user) return null; - - if (e = egCore.evt.parse(user)) { - console.error('user fetch failed : ' + e.toString()); - deferred.reject(); - return null; - } - - // copied more or less directly from XUL menu.js - var settings = {}; - for(var i = 0; i < user.settings().length; i++) { - settings[user.settings()[i].name()] = - JSON2js(user.settings()[i].value()); - } - - if(!settings['opac.default_phone'] && user.day_phone()) - settings['opac.default_phone'] = user.day_phone(); - if(!settings['opac.hold_notify'] && settings['opac.hold_notify'] !== '') - settings['opac.hold_notify'] = 'email:phone'; - - // Taken from patron/util.js format_name - // FIXME: I18n - var patron_name = - ( user.prefix() ? user.prefix() + ' ' : '') + - user.family_name() + ', ' + - user.first_given_name() + ' ' + - ( user.second_given_name() ? user.second_given_name() + ' ' : '' ) + - ( user.suffix() ? user.suffix() : ''); - - deferred.resolve({ - "barcode": barcode, - "settings" : settings, - "user_email" : user.email(), - "patron_name" : patron_name - }); - }); - - return deferred.promise; - } - } + $scope.handlers = { } // ------------------------------------------------------------------ // Holds diff --git a/Open-ILS/web/js/ui/default/staff/circ/patron/app.js b/Open-ILS/web/js/ui/default/staff/circ/patron/app.js index b1505280cc..275ccfc880 100644 --- a/Open-ILS/web/js/ui/default/staff/circ/patron/app.js +++ b/Open-ILS/web/js/ui/default/staff/circ/patron/app.js @@ -114,6 +114,12 @@ angular.module('egPatronApp', ['ngRoute', 'ui.bootstrap', resolve : resolver }); + $routeProvider.when('/circ/patron/:id/holds/create', { + templateUrl: './circ/patron/t_holds_create', + controller: 'PatronHoldsCreateCtrl', + resolve : resolver + }); + $routeProvider.when('/circ/patron/:id/holds/:hold_id', { templateUrl: './circ/patron/t_holds', controller: 'PatronHoldsCtrl', diff --git a/Open-ILS/web/js/ui/default/staff/circ/patron/holds.js b/Open-ILS/web/js/ui/default/staff/circ/patron/holds.js index d49c15a7aa..c42a1623e7 100644 --- a/Open-ILS/web/js/ui/default/staff/circ/patron/holds.js +++ b/Open-ILS/web/js/ui/default/staff/circ/patron/holds.js @@ -115,6 +115,10 @@ function($scope, $q, $routeParams, egCore, egUser, patronSvc, $location.path('/circ/patron/' + $scope.patron_id + '/holds'); } + $scope.place_hold = function() { + $location.path($location.path() + '/create'); + } + // when the detail hold is fetched (and updated), update the bib // record summary display record id. $scope.set_hold = function(hold_data) { @@ -122,3 +126,30 @@ function($scope, $q, $routeParams, egCore, egUser, patronSvc, } }]) + + +.controller('PatronHoldsCreateCtrl', + ['$scope','$routeParams','$location','egCore','patronSvc', +function($scope , $routeParams , $location , egCore , patronSvc) { + + $scope.handlers = { + opac_hold_placed : function() { + // FIXME: this isn't getting called.. not sure why + patronSvc.fetchUserStats(); // update hold counts + } + } + + $scope.initTab('holds', $routeParams.id).then(function(isAlert) { + if (isAlert) return; + // not guarenteed to have a barcode until init fetches the user + $scope.handlers.patron_barcode = patronSvc.current.card().barcode(); + }); + + $scope.catalog_url = + $location.absUrl().replace(/\/staff.*/, '/opac/advanced'); + + $scope.handle_page = function(url) { + } + +}]) + diff --git a/Open-ILS/web/js/ui/default/staff/services/eframe.js b/Open-ILS/web/js/ui/default/staff/services/eframe.js index fbbf88626d..7e18246270 100644 --- a/Open-ILS/web/js/ui/default/staff/services/eframe.js +++ b/Open-ILS/web/js/ui/default/staff/services/eframe.js @@ -23,8 +23,8 @@ angular.module('egCoreMod') + 'class="eg-embed-frame" style="height:{{height}}px">', controller : - ['$scope','$window','$location','egCore', - function($scope , $window , $location , egCore) { + ['$scope','$window','$location','$q','egCore', + function($scope , $window , $location , $q , egCore) { // Set the iframe height to just under the window height. // leave room for the navbar, padding, margins, etc. @@ -112,7 +112,82 @@ angular.module('egCoreMod') // open a user account new_patron_tab : function(tab_info, usr_info) { open_tab('/circ/patron/' + usr_info.id + '/checkout'); - } + }, + + get_barcode_and_settings_async : function(barcode, only_settings) { + if (!barcode) return $q.reject(); + var deferred = $q.defer(); + + var barcode_promise = $q.when(barcode); + if (!only_settings) { + + // first verify / locate the barcode + barcode_promise = egCore.net.request( + 'open-ils.actor', + 'open-ils.actor.get_barcodes', + egCore.auth.token(), + egCore.auth.user().ws_ou(), 'actor', barcode + ).then(function(resp) { + + if (!resp || egCore.evt.parse(resp) || !resp.length) { + console.error('user not found: ' + barcode); + deferred.reject(); + return null; + } + + resp = resp[0]; + return barcode = resp.barcode; + }); + } + + barcode_promise.then(function(barcode) { + if (!barcode) return; + + return egCore.net.request( + 'open-ils.actor', + 'open-ils.actor.user.fleshed.retrieve_by_barcode', + egCore.auth.token(), barcode); + + }).then(function(user) { + if (!user) return null; + + if (e = egCore.evt.parse(user)) { + console.error('user fetch failed : ' + e.toString()); + deferred.reject(); + return null; + } + + // copied more or less directly from XUL menu.js + var settings = {}; + for(var i = 0; i < user.settings().length; i++) { + settings[user.settings()[i].name()] = + JSON2js(user.settings()[i].value()); + } + + if(!settings['opac.default_phone'] && user.day_phone()) + settings['opac.default_phone'] = user.day_phone(); + if(!settings['opac.hold_notify'] && settings['opac.hold_notify'] !== '') + settings['opac.hold_notify'] = 'email:phone'; + + // Taken from patron/util.js format_name + // FIXME: I18n + var patron_name = + ( user.prefix() ? user.prefix() + ' ' : '') + + user.family_name() + ', ' + + user.first_given_name() + ' ' + + ( user.second_given_name() ? user.second_given_name() + ' ' : '' ) + + ( user.suffix() ? user.suffix() : ''); + + deferred.resolve({ + "barcode": barcode, + "settings" : settings, + "user_email" : user.email(), + "patron_name" : patron_name + }); + }); + + return deferred.promise; + } } if ($scope.handlers) { -- 2.11.0