From 1e111dede283983bed2f031cb9ed86db0d2e100e Mon Sep 17 00:00:00 2001 From: Cesar Velez Date: Thu, 21 Sep 2017 15:45:23 +0100 Subject: [PATCH] LP#1378383-WebStaff Fix Item circ history to obey max setting The circ.item_checkout_history.max lib setting should be respected in both Circ History tabs, and also check for the permission to VIEW_COPY_CHECKOUT_HISTORY for the current user. Also, There was ambiguity for the user to tell the difference (from the displayed message) if an item truly has no circulations, or if they see no circs due to the relevant permission setting being set to 0 (Maximum previous checkouts.) This changes the templates a bit to make that clearer. Signed-off by: Cesar Velez Signed-off-by: Jason Etheridge --- .../templates/staff/cat/item/t_circ_list_pane.tt2 | 11 +- .../src/templates/staff/cat/item/t_circs_pane.tt2 | 9 +- Open-ILS/web/js/ui/default/staff/cat/item/app.js | 132 +++++++++++++-------- 3 files changed, 95 insertions(+), 57 deletions(-) diff --git a/Open-ILS/src/templates/staff/cat/item/t_circ_list_pane.tt2 b/Open-ILS/src/templates/staff/cat/item/t_circ_list_pane.tt2 index 422830f9c4..f4a3d0f455 100644 --- a/Open-ILS/src/templates/staff/cat/item/t_circ_list_pane.tt2 +++ b/Open-ILS/src/templates/staff/cat/item/t_circ_list_pane.tt2 @@ -1,9 +1,14 @@ -
+
[% l('Item has not circulated.') %]
-
+
+
+ [% l('Circulation History not available for display.') %] +
+
+
-
+
-
+
[% l('No Recent Circ Group') %]
-
+
+
+ [% l('Most Recent Circ Group not available for display.') %] +
+
+
[% l('Most Recent Circ Group') %] diff --git a/Open-ILS/web/js/ui/default/staff/cat/item/app.js b/Open-ILS/web/js/ui/default/staff/cat/item/app.js index d1e8b5ed7d..8b8f9ef3ca 100644 --- a/Open-ILS/web/js/ui/default/staff/cat/item/app.js +++ b/Open-ILS/web/js/ui/default/staff/cat/item/app.js @@ -625,63 +625,85 @@ function($scope , $q , $location , $routeParams , $timeout , $window , egCore , return deferred.promise; } - // if loadPrev load the two most recent circulations - function loadCurrentCirc(loadPrev) { + // load the two most recent circulations in /circs tab + function loadCurrentCirc() { delete $scope.circ; delete $scope.circ_summary; delete $scope.prev_circ_summary; delete $scope.prev_circ_usr; if (!copyId) return; - egCore.pcrud.search('aacs', - {target_copy : copyId}, - { flesh : 2, - flesh_fields : { - aacs : [ - 'usr', - 'workstation', - 'checkin_workstation', - 'duration_rule', - 'max_fine_rule', - 'recurring_fine_rule' - ], - au : ['card'] - }, - order_by : {aacs : 'xact_start desc'}, - limit : 1 + var copy_org = + itemSvc.copy.call_number().id() == -1 ? + itemSvc.copy.circ_lib().id() : + itemSvc.copy.call_number().owning_lib().id(); + + // since a user can still view patron checkout history here, check perms + egCore.perm.hasPermAt('VIEW_COPY_CHECKOUT_HISTORY', true) + .then(function(orgIds){ + if(orgIds.indexOf(copy_org) == -1){ + console.warn('User is not allowed to view circ history!'); + $q.when(0); } - ).then(null, null, function(circ) { - $scope.circ = circ; + return fetchMaxCircHistory(); + }) + .then(function(maxHistCount){ - // load the chain for this circ - egCore.net.request( - 'open-ils.circ', - 'open-ils.circ.renewal_chain.retrieve_by_circ.summary', - egCore.auth.token(), $scope.circ.id() - ).then(function(summary) { - $scope.circ_summary = summary; - }); + if (!maxHistCount) $scope.isMaxCircHistoryZero = true; + + egCore.pcrud.search('aacs', + {target_copy : copyId}, + { flesh : 2, + flesh_fields : { + aacs : [ + 'usr', + 'workstation', + 'checkin_workstation', + 'duration_rule', + 'max_fine_rule', + 'recurring_fine_rule' + ], + au : ['card'] + }, + order_by : {aacs : 'xact_start desc'}, + limit : 1 + } - if (!loadPrev) return; + ).then(null, null, function(circ) { + $scope.circ = circ; - // load the chain for the previous circ, plus the user - egCore.net.request( - 'open-ils.circ', - 'open-ils.circ.prev_renewal_chain.retrieve_by_circ.summary', - egCore.auth.token(), $scope.circ.id() + if (!circ) return $q.when(); - ).then(null, null, function(summary) { - $scope.prev_circ_summary = summary.summary; + // load the chain for this circ + egCore.net.request( + 'open-ils.circ', + 'open-ils.circ.renewal_chain.retrieve_by_circ.summary', + egCore.auth.token(), $scope.circ.id() + ).then(function(summary) { + $scope.circ_summary = summary; + }); - if (summary.usr) { // aged circs have no 'usr'. - egCore.pcrud.retrieve('au', summary.usr, - {flesh : 1, flesh_fields : {au : ['card']}}) + if (maxHistCount <= 1) return; - .then(function(user) { $scope.prev_circ_usr = user }); - } + // load the chain for the previous circ, plus the user + egCore.net.request( + 'open-ils.circ', + 'open-ils.circ.prev_renewal_chain.retrieve_by_circ.summary', + egCore.auth.token(), $scope.circ.id() + + ).then(null, null, function(summary) { + $scope.prev_circ_summary = summary.summary; + + if (summary.usr) { // aged circs have no 'usr'. + egCore.pcrud.retrieve('au', summary.usr, + {flesh : 1, flesh_fields : {au : ['card']}}) + + .then(function(user) { $scope.prev_circ_usr = user }); + } + }); }); - }); + }) } var maxHistory; @@ -691,7 +713,7 @@ function($scope , $q , $location , $routeParams , $timeout , $window , egCore , 'circ.item_checkout_history.max') .then(function(set) { maxHistory = set['circ.item_checkout_history.max'] || 4; - return maxHistory; + return Number(maxHistory); }); } @@ -718,13 +740,14 @@ function($scope , $q , $location , $routeParams , $timeout , $window , egCore , }); } + // load data for /circ_list tab function loadCircHistory() { $scope.circ_list = []; var copy_org = itemSvc.copy.call_number().id() == -1 ? itemSvc.copy.circ_lib().id() : - itemSvc.copy.call_number().owning_lib().id() + itemSvc.copy.call_number().owning_lib().id(); // there is an extra layer of permissibility over circ // history views @@ -738,26 +761,31 @@ function($scope , $q , $location , $routeParams , $timeout , $window , egCore , return fetchMaxCircHistory(); - }).then(function(count) { + }).then(function(maxHistCount) { + + if(!maxHistCount) $scope.isMaxCircHistoryZero = true; - egCore.pcrud.search('aacs', + egCore.pcrud.search('aacs', {target_copy : copyId}, { flesh : 2, flesh_fields : { aacs : [ 'usr', - 'workstation', - 'checkin_workstation', - 'recurring_fine_rule' + 'workstation', + 'checkin_workstation', + 'recurring_fine_rule' ], au : ['card'] }, - order_by : {aacs : 'xact_start desc'}, - limit : count + order_by : {aacs : 'xact_start desc'}, + // fetch at least one to see if copy ever circulated + limit : $scope.isMaxCircHistoryZero ? 1 : maxHistCount } ).then(null, null, function(circ) { + $scope.circ = circ; + // flesh circ_lib locally circ.circ_lib(egCore.org.get(circ.circ_lib())); circ.checkin_lib(egCore.org.get(circ.checkin_lib())); @@ -855,7 +883,7 @@ function($scope , $q , $location , $routeParams , $timeout , $window , egCore , break; case 'circs': - loadCurrentCirc(true); + loadCurrentCirc(); break; case 'circ_list': -- 2.11.0