finish up core functionality of the to be staged tab
authorGalen Charlton <gmc@equinoxinitiative.org>
Wed, 27 May 2020 23:03:40 +0000 (19:03 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Wed, 27 May 2020 23:03:40 +0000 (19:03 -0400)
* checking for refreshes
* implementing the mark as staged action

TODO: figure out why the to-be-staged directive gets initialized
even when switch to a tab that doesn't include it. This is causing
the $interval checking for refreshes to keep going unnecessarily.

Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Open-ILS/src/templates/staff/circ/curbside/index.tt2
Open-ILS/src/templates/staff/circ/curbside/t_to_be_staged_manager.tt2
Open-ILS/web/js/ui/default/staff/circ/curbside/directives/to_be_staged_manager.js
Open-ILS/web/js/ui/default/staff/circ/curbside/services/core.js

index 95b4ea0..4ad4410 100644 (file)
@@ -11,6 +11,9 @@
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/curbside/directives/to_be_staged_manager.js"></script>
 <script>
 angular.module('egCoreMod').run(['egStrings', function(s) {
+    s.SUCCESS_CURBSIDE_MARK_STAGED = "[% l('Marked curbside appointment {{slot_id}} as staged') %]";
+    s.NOTFOUND_CURBSIDE_MARK_STAGED = "[% l('Could not find curbside appointment {{slot_id}} to mark as staged') %]";
+    s.FAILED_CURBSIDE_MARK_STAGED = "[% l('Failed to mark curbside appointment {{slot_id}} as staged: {{evt_code}}') %]";
 }]);
 </script>
 [% END %]
index 5f693d2..8a20764 100644 (file)
@@ -1,4 +1,7 @@
 <div>
+  <div ng-style="{visibility : refreshNeeded ? 'visible' : 'hidden'}" class="alert alert-warning">
+    [% l('Updates to the curbside appointment list are available. Please refresh.') %]
+  </div>
   <eg-grid
     id-field="slot_id"
     features="-sort,-multisort,-picker,-multiselect"
@@ -7,7 +10,7 @@
     dateformat="{{$root.egDateAndTimeFormat}}">
 
     <eg-grid-menu-item handler="refresh_staging" standalone="true"
-        label="[% l('Refresh List') %]"></eg-grid-menu-item>
+        label="[% l('Refresh List')%]"></eg-grid-menu-item>
 
     <eg-grid-field label="[% l('Pickup Date/Time') %]" path="slot.slot" datatype="timestamp"></eg-grid-field>
     <eg-grid-field label="[% l('Patron') %]" path="slot.patron">
     <eg-grid-field label="[% l('Items for Pickup') %]" path="holds" compiled>
       <eg-curbside-holds-list holds="item.holds" bib-data="item.bib_data_by_hold"></eg-curbside-holds-list>
     </eg-grid-field>
-    <eg-grid-field label="[% l('Action') %]">
-      <button class="btn btn-sm btn-primary">[% l('Mark As Staged And Ready') %]</button>
+    <eg-grid-field label="[% l('Action') %]" handlers="gridCellHandlers" compiled>
+      <button class="btn btn-sm btn-primary"
+        ng-disabled="col.handlers.wasHandled(item['slot_id'])"
+        ng-click="col.handlers.mark_staged(item['slot_id'])">
+        [% l('Mark As Staged And Ready') %]
+      </button>
     </eg-grid-field>
   </eg-grid>
 </div>
index 1397e29..ce101dc 100644 (file)
@@ -8,18 +8,72 @@ angular.module('egCurbsideAppDep')
         templateUrl: './circ/curbside/t_to_be_staged_manager',
         controller:
        ['$scope','$q','egCurbsideCoreSvc','egCore','egGridDataProvider',
-        '$uibModal','$timeout','$location','egConfirmDialog','ngToast',
+        '$uibModal','$timeout','$location','egConfirmDialog','ngToast','$interval',
 function($scope , $q , egCurbsideCoreSvc , egCore , egGridDataProvider ,
-         $uibModal , $timeout , $location , egConfirmDialog , ngToast) {
+         $uibModal , $timeout , $location , egConfirmDialog , ngToast , $interval) {
 
-    $scope.gridControls = {
-        activateItem : function (item) {  console.debug('gmc') } // TODO
-    };
+    $scope.gridControls = {};
+
+    $scope.wasHandled = {};
+    $scope.refreshNeeded = false;
+    latestTime = undefined;
+    var checkRefresh;
+    checkRefresh = $interval(function() {
+        egCurbsideCoreSvc.get_latest_to_be_staged().then(function(latest) {
+            if (angular.isDefined(latest)) {
+                if (angular.isDefined(latestTime) && latestTime != latest) {
+                    $scope.refreshNeeded = true;
+                }
+                latestTime = latest;
+            }
+        });
+    }, 10000);
+    $scope.$on('$destroy', function() {
+        if (angular.isDefined(checkRefresh)) {
+            $interval.cancel(checkRefresh);
+            checkRefresh = undefined;
+        };
+    });
 
     $scope.gridDataProvider = egGridDataProvider.instance({
         get : function(offset, count) {
+            $scope.wasHandled = {};
+            $scope.refreshNeeded = false;
             return egCurbsideCoreSvc.get_to_be_staged(offset, count);
         }
     });
 
+    $scope.refresh_staging = function() {
+        $scope.gridControls.refresh();
+    }
+
+    $scope.gridCellHandlers = { };
+    $scope.gridCellHandlers.mark_staged = function(id) {
+        egCurbsideCoreSvc.mark_staged(id).then(function(resp) {
+            if (evt = egCore.evt.parse(resp)) {
+                ngToast.danger(egCore.strings.$replace(
+                    egCore.strings.FAILED_CURBSIDE_MARK_STAGED,
+                    { slot_id : id, evt_code : evt.code }
+                ));
+                return;
+            } 
+            if (typeof resp == 'undefined') {
+                ngToast.warning(egCore.strings.$replace(
+                    egCore.strings.NOTFOUND_CURBSIDE_MARK_STAGED,
+                    { slot_id : id }
+                ));
+                return;
+            }
+            ngToast.success(egCore.strings.$replace(
+                egCore.strings.SUCCESS_CURBSIDE_MARK_STAGED,
+                { slot_id : id }
+            ));
+            $scope.wasHandled[id] = true;
+            $timeout(function() { $scope.refresh_staging() }, 500);
+        });
+    }
+    $scope.gridCellHandlers.wasHandled = function(id) {
+        return $scope.wasHandled[id];
+    }
+
 }]}});
index 49e5ec5..87f2bbb 100644 (file)
@@ -14,6 +14,28 @@ function(egCore , orderByFilter , $q , $filter , $uibModal , ngToast , egConfirm
             offset
         );
     };
+    service.get_latest_to_be_staged = function() {
+        return egCore.net.request(
+            'open-ils.curbside',
+            'open-ils.curbside.fetch_to_be_staged.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',
+            'open-ils.curbside.mark_staged',
+            egCore.auth.token(),
+            slot_id
+        );
+    }
 
     return service;
 }])