From b6cf72c76b6df916f899a347dd0528be8612f4f4 Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Thu, 28 May 2020 10:52:05 -0400 Subject: [PATCH] initial implementation of staged, arrived, and delivered tabs TODO: * hook up arrived and delivered button on the staged tab * add a progress bar when the delivered action is invoked * add more error handling for the delivered action * add 'checked out' language to the delivered buttons? * include list of holds on the arrived tab? Signed-off-by: Galen Charlton --- .../src/templates/staff/circ/curbside/index.tt2 | 9 +++ .../staff/circ/curbside/t_arrived_manager.tt2 | 31 ++++++++ .../staff/circ/curbside/t_delivered_manager.tt2 | 24 ++++++ .../src/templates/staff/circ/curbside/t_main.tt2 | 6 +- .../staff/circ/curbside/t_staged_manager.tt2 | 36 +++++++++ .../circ/curbside/directives/arrived_manager.js | 92 ++++++++++++++++++++++ .../circ/curbside/directives/delivered_manager.js | 63 +++++++++++++++ .../circ/curbside/directives/staged_manager.js | 92 ++++++++++++++++++++++ .../default/staff/circ/curbside/services/core.js | 89 +++++++++++++++++++++ 9 files changed, 439 insertions(+), 3 deletions(-) create mode 100644 Open-ILS/src/templates/staff/circ/curbside/t_arrived_manager.tt2 create mode 100644 Open-ILS/src/templates/staff/circ/curbside/t_delivered_manager.tt2 create mode 100644 Open-ILS/src/templates/staff/circ/curbside/t_staged_manager.tt2 create mode 100644 Open-ILS/web/js/ui/default/staff/circ/curbside/directives/arrived_manager.js create mode 100644 Open-ILS/web/js/ui/default/staff/circ/curbside/directives/delivered_manager.js create mode 100644 Open-ILS/web/js/ui/default/staff/circ/curbside/directives/staged_manager.js diff --git a/Open-ILS/src/templates/staff/circ/curbside/index.tt2 b/Open-ILS/src/templates/staff/circ/curbside/index.tt2 index 4ad4410f26..7955e26168 100644 --- a/Open-ILS/src/templates/staff/circ/curbside/index.tt2 +++ b/Open-ILS/src/templates/staff/circ/curbside/index.tt2 @@ -9,11 +9,20 @@ + + + [% END %] diff --git a/Open-ILS/src/templates/staff/circ/curbside/t_arrived_manager.tt2 b/Open-ILS/src/templates/staff/circ/curbside/t_arrived_manager.tt2 new file mode 100644 index 0000000000..e34e9b4a5e --- /dev/null +++ b/Open-ILS/src/templates/staff/circ/curbside/t_arrived_manager.tt2 @@ -0,0 +1,31 @@ +
+
+ [% l('Updates to the list of appointments whose patron has arrived are available. Please refresh.') %] +
+ + + + + + + + {{item.slot.patron().family_name()}} / {{item.slot.patron().card().barcode()}} + + + + + + + + +
diff --git a/Open-ILS/src/templates/staff/circ/curbside/t_delivered_manager.tt2 b/Open-ILS/src/templates/staff/circ/curbside/t_delivered_manager.tt2 new file mode 100644 index 0000000000..d37f4b5212 --- /dev/null +++ b/Open-ILS/src/templates/staff/circ/curbside/t_delivered_manager.tt2 @@ -0,0 +1,24 @@ +
+
+ [% l('Updates to the list of appointments whose items were delivered are available. Please refresh.') %] +
+ + + + + + + + {{item.patron().family_name()}} / {{item.patron().card().barcode()}} + + + + + +
diff --git a/Open-ILS/src/templates/staff/circ/curbside/t_main.tt2 b/Open-ILS/src/templates/staff/circ/curbside/t_main.tt2 index 5f7eb3b2d5..5f81f3b938 100644 --- a/Open-ILS/src/templates/staff/circ/curbside/t_main.tt2 +++ b/Open-ILS/src/templates/staff/circ/curbside/t_main.tt2 @@ -16,17 +16,17 @@
- XXX +
- XXX +
- XXX +
diff --git a/Open-ILS/src/templates/staff/circ/curbside/t_staged_manager.tt2 b/Open-ILS/src/templates/staff/circ/curbside/t_staged_manager.tt2 new file mode 100644 index 0000000000..ce7b8b53e8 --- /dev/null +++ b/Open-ILS/src/templates/staff/circ/curbside/t_staged_manager.tt2 @@ -0,0 +1,36 @@ +
+
+ [% l('Updates to the list of staged and ready appointments are available. Please refresh.') %] +
+ + + + + + + + {{item.slot.patron().family_name()}} / {{item.slot.patron().card().barcode()}} + + + + + + + + + +
diff --git a/Open-ILS/web/js/ui/default/staff/circ/curbside/directives/arrived_manager.js b/Open-ILS/web/js/ui/default/staff/circ/curbside/directives/arrived_manager.js new file mode 100644 index 0000000000..77d940e730 --- /dev/null +++ b/Open-ILS/web/js/ui/default/staff/circ/curbside/directives/arrived_manager.js @@ -0,0 +1,92 @@ +angular.module('egCurbsideAppDep') + +.directive('egCurbsideArrivedManager', function() { + return { + transclude: true, + restrict: 'E', + scope: { }, + templateUrl: './circ/curbside/t_arrived_manager', + controller: + ['$scope','$q','egCurbsideCoreSvc','egCore','egGridDataProvider', + '$uibModal','$timeout','$location','egConfirmDialog','ngToast','$interval', +function($scope , $q , egCurbsideCoreSvc , egCore , egGridDataProvider , + $uibModal , $timeout , $location , egConfirmDialog , ngToast , $interval) { + + $scope.gridControls = {}; + + $scope.wasHandled = {}; + $scope.refreshNeeded = false; + + latestTime = undefined; + var checkRefresh = undefined; + function startRefreshCheck() { + if (!angular.isDefined(checkRefresh)) { + checkRefresh = $interval(function() { + egCurbsideCoreSvc.get_latest_arrived().then(function(latest) { + if (angular.isDefined(latest)) { + if (angular.isDefined(latestTime) && latestTime != latest) { + $scope.refreshNeeded = true; + stopRefreshCheck(); + } + latestTime = latest; + } + }); + }, 15000); + } + } + function stopRefreshCheck() { + if (angular.isDefined(checkRefresh)) { + $interval.cancel(checkRefresh); + checkRefresh = undefined; + } + } + this.$onInit = function() { + startRefreshCheck(); + } + this.$onDestroy = function() { + stopRefreshCheck(); + } + + $scope.gridDataProvider = egGridDataProvider.instance({ + get : function(offset, count) { + $scope.wasHandled = {}; + $scope.refreshNeeded = false; + startRefreshCheck(); + return egCurbsideCoreSvc.get_arrived(offset, count); + } + }); + + $scope.refresh_arrived = function() { + $scope.gridControls.refresh(); + } + + $scope.gridCellHandlers = { }; + $scope.gridCellHandlers.mark_delivered = function(id) { + egCurbsideCoreSvc.mark_delivered(id).then(function(resp) { + if (evt = egCore.evt.parse(resp)) { + ngToast.danger(egCore.strings.$replace( + egCore.strings.FAILED_CURBSIDE_MARK_DELIVERED, + { slot_id : id, evt_code : evt.code } + )); + return; + } + if (!angular.isDefined(resp)) { + ngToast.warning(egCore.strings.$replace( + egCore.strings.NOTFOUND_CURBSIDE_MARK_DELIVERED, + { slot_id : id } + )); + return; + } + ngToast.success(egCore.strings.$replace( + egCore.strings.SUCCESS_CURBSIDE_MARK_DELIVERED, + { slot_id : id } + )); + $scope.wasHandled[id] = true; + $timeout(function() { $scope.refresh_arrived() }, 500); + }); + } + $scope.gridCellHandlers.wasHandled = function(id) { + return $scope.wasHandled[id]; + } + +}]}}); diff --git a/Open-ILS/web/js/ui/default/staff/circ/curbside/directives/delivered_manager.js b/Open-ILS/web/js/ui/default/staff/circ/curbside/directives/delivered_manager.js new file mode 100644 index 0000000000..447725b360 --- /dev/null +++ b/Open-ILS/web/js/ui/default/staff/circ/curbside/directives/delivered_manager.js @@ -0,0 +1,63 @@ +angular.module('egCurbsideAppDep') + +.directive('egCurbsideDeliveredManager', function() { + return { + transclude: true, + restrict: 'E', + scope: { }, + templateUrl: './circ/curbside/t_delivered_manager', + controller: + ['$scope','$q','egCurbsideCoreSvc','egCore','egGridDataProvider', + '$uibModal','$timeout','$location','egConfirmDialog','ngToast','$interval', +function($scope , $q , egCurbsideCoreSvc , egCore , egGridDataProvider , + $uibModal , $timeout , $location , egConfirmDialog , ngToast , $interval) { + + $scope.gridControls = {}; + + $scope.refreshNeeded = false; + + latestTime = undefined; + var checkRefresh = undefined; + function startRefreshCheck() { + if (!angular.isDefined(checkRefresh)) { + checkRefresh = $interval(function() { + egCurbsideCoreSvc.get_latest_delivered().then(function(latest) { + if (angular.isDefined(latest)) { + if (angular.isDefined(latestTime) && latestTime != latest) { + $scope.refreshNeeded = true; + stopRefreshCheck(); + } + latestTime = latest; + } + }); + }, 15000); + } + } + function stopRefreshCheck() { + if (angular.isDefined(checkRefresh)) { + $interval.cancel(checkRefresh); + checkRefresh = undefined; + } + } + this.$onInit = function() { + startRefreshCheck(); + } + this.$onDestroy = function() { + stopRefreshCheck(); + } + + $scope.gridDataProvider = egGridDataProvider.instance({ + get : function(offset, count) { + $scope.refreshNeeded = false; + startRefreshCheck(); + return egCurbsideCoreSvc.get_delivered(offset, count); + } + }); + + $scope.refresh_delivered = function() { + $scope.gridControls.refresh(); + } + + $scope.gridCellHandlers = { }; + +}]}}); diff --git a/Open-ILS/web/js/ui/default/staff/circ/curbside/directives/staged_manager.js b/Open-ILS/web/js/ui/default/staff/circ/curbside/directives/staged_manager.js new file mode 100644 index 0000000000..db5d9881be --- /dev/null +++ b/Open-ILS/web/js/ui/default/staff/circ/curbside/directives/staged_manager.js @@ -0,0 +1,92 @@ +angular.module('egCurbsideAppDep') + +.directive('egCurbsideStagedManager', function() { + return { + transclude: true, + restrict: 'E', + scope: { }, + templateUrl: './circ/curbside/t_staged_manager', + controller: + ['$scope','$q','egCurbsideCoreSvc','egCore','egGridDataProvider', + '$uibModal','$timeout','$location','egConfirmDialog','ngToast','$interval', +function($scope , $q , egCurbsideCoreSvc , egCore , egGridDataProvider , + $uibModal , $timeout , $location , egConfirmDialog , ngToast , $interval) { + + $scope.gridControls = {}; + + $scope.wasHandled = {}; + $scope.refreshNeeded = false; + + latestTime = undefined; + var checkRefresh = undefined; + function startRefreshCheck() { + if (!angular.isDefined(checkRefresh)) { + checkRefresh = $interval(function() { + egCurbsideCoreSvc.get_latest_staged().then(function(latest) { + if (angular.isDefined(latest)) { + if (angular.isDefined(latestTime) && latestTime != latest) { + $scope.refreshNeeded = true; + stopRefreshCheck(); + } + latestTime = latest; + } + }); + }, 15000); + } + } + function stopRefreshCheck() { + if (angular.isDefined(checkRefresh)) { + $interval.cancel(checkRefresh); + checkRefresh = undefined; + } + } + this.$onInit = function() { + startRefreshCheck(); + } + this.$onDestroy = function() { + stopRefreshCheck(); + } + + $scope.gridDataProvider = egGridDataProvider.instance({ + get : function(offset, count) { + $scope.wasHandled = {}; + $scope.refreshNeeded = false; + startRefreshCheck(); + return egCurbsideCoreSvc.get_staged(offset, count); + } + }); + + $scope.refresh_staged = function() { + $scope.gridControls.refresh(); + } + + $scope.gridCellHandlers = { }; + $scope.gridCellHandlers.mark_arrived = function(id) { + egCurbsideCoreSvc.mark_arrived(id).then(function(resp) { + if (evt = egCore.evt.parse(resp)) { + ngToast.danger(egCore.strings.$replace( + egCore.strings.FAILED_CURBSIDE_MARK_ARRIVED, + { slot_id : id, evt_code : evt.code } + )); + return; + } + if (!angular.isDefined(resp)) { + ngToast.warning(egCore.strings.$replace( + egCore.strings.NOTFOUND_CURBSIDE_MARK_ARRIVED, + { slot_id : id } + )); + return; + } + ngToast.success(egCore.strings.$replace( + egCore.strings.SUCCESS_CURBSIDE_MARK_ARRIVED, + { slot_id : id } + )); + $scope.wasHandled[id] = true; + $timeout(function() { $scope.refresh_staged() }, 500); + }); + } + $scope.gridCellHandlers.wasHandled = function(id) { + return $scope.wasHandled[id]; + } + +}]}}); diff --git a/Open-ILS/web/js/ui/default/staff/circ/curbside/services/core.js b/Open-ILS/web/js/ui/default/staff/circ/curbside/services/core.js index 87f2bbbcc9..d52b7a3904 100644 --- a/Open-ILS/web/js/ui/default/staff/circ/curbside/services/core.js +++ b/Open-ILS/web/js/ui/default/staff/circ/curbside/services/core.js @@ -28,6 +28,78 @@ function(egCore , orderByFilter , $q , $filter , $uibModal , ngToast , egConfirm }); } + service.get_staged = function(offset, count) { + return egCore.net.request( + 'open-ils.curbside', + 'open-ils.curbside.fetch_staged', + egCore.auth.token(), + egCore.auth.user().ws_ou(), + count, // yep, count first + offset + ); + }; + service.get_latest_staged = function() { + return egCore.net.request( + 'open-ils.curbside', + 'open-ils.curbside.fetch_staged.latest', + egCore.auth.token() + ).then(function(resp) { + if (evt = egCore.evt.parse(resp)) { + return undefined; + } else { + return resp; + } + }); + } + + service.get_arrived = function(offset, count) { + return egCore.net.request( + 'open-ils.curbside', + 'open-ils.curbside.fetch_arrived', + egCore.auth.token(), + egCore.auth.user().ws_ou(), + count, // yep, count first + offset + ); + }; + service.get_latest_arrived = function() { + return egCore.net.request( + 'open-ils.curbside', + 'open-ils.curbside.fetch_arrived.latest', + egCore.auth.token() + ).then(function(resp) { + if (evt = egCore.evt.parse(resp)) { + return undefined; + } else { + return resp; + } + }); + } + + service.get_delivered = function(offset, count) { + return egCore.net.request( + 'open-ils.curbside', + 'open-ils.curbside.fetch_delivered', + egCore.auth.token(), + egCore.auth.user().ws_ou(), + count, // yep, count first + offset + ); + }; + service.get_latest_delivered = function() { + return egCore.net.request( + 'open-ils.curbside', + 'open-ils.curbside.fetch_delivered.latest', + egCore.auth.token() + ).then(function(resp) { + if (evt = egCore.evt.parse(resp)) { + return undefined; + } else { + return resp; + } + }); + } + service.mark_staged = function(slot_id) { return egCore.net.request( 'open-ils.curbside', @@ -36,6 +108,23 @@ function(egCore , orderByFilter , $q , $filter , $uibModal , ngToast , egConfirm slot_id ); } + service.mark_arrived = function(slot_id) { + return egCore.net.request( + 'open-ils.curbside', + 'open-ils.curbside.mark_arrived', + egCore.auth.token(), + slot_id + ); + } + service.mark_delivered = function(slot_id) { + return egCore.net.request( + 'open-ils.curbside', + 'open-ils.curbside.mark_delivered', + egCore.auth.token(), + slot_id + ); + } + return service; }]) -- 2.11.0