LP#1768947 Offline xact presence is cached; show date
authorBill Erickson <berickxx@gmail.com>
Fri, 22 Jun 2018 14:56:02 +0000 (10:56 -0400)
committerKathy Lussier <klussier@masslnc.org>
Wed, 8 Aug 2018 14:31:15 +0000 (10:31 -0400)
Maintain an entry to the object date cache table indicating the time of
the most recent offline transaction entry.  This data is used on the
login page to determine if offline transactions exist, so the staff
logging in can be notified.  We do this in lieu of checking the offline
transaction table, since that table only exists in the offline UI.

As a bonus, since we know the last transaction add time, display this
information in the login page offline xact alert panel.

Signed-off-by: Bill Erickson <berickxx@gmail.com>
Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
Signed-off-by: Kathy Lussier <klussier@masslnc.org>
Open-ILS/src/templates/staff/t_login.tt2
Open-ILS/web/js/ui/default/staff/offline-db-worker.js
Open-ILS/web/js/ui/default/staff/services/lovefield.js

index e4d42cb..0f58cea 100644 (file)
               </div>
             </div>
 
-            <div class="form-group">
-              <div class="col-md-offset-4 col-md-6">
-                <span ng-show="pendingXacts" class="label label-warning">[% l('Unprocessed offline transactions waiting for upload') %]</span>
+            <div class="form-group" ng-if="pendingXacts">
+              <div class="col-md-offset-4 col-md-8">
+                <div class="alert alert-warning">
+                  [% | l('{{pendingXacts | date:"short"}}') %]
+                  Unprocessed offline transactions waiting for upload.  
+                  Last transaction added at [_1].
+                  [% END %]
+                </div>
               </div>
             </div>
 
index 0107dfd..6c2e1ad 100644 (file)
@@ -181,6 +181,15 @@ function deleteAll(schemaName, tableName) {
     return info.schema.db.delete().from(info.table).exec();
 }
 
+// Delete rows from selected table where field equals value
+function deleteWhereEqual(schemaName, tableName, field, value) {
+    var info = getTableInfo(schemaName, tableName);
+    if (info.error) { return Promise.reject(info.error); }
+
+    return info.schema.db.delete().from(info.table)
+        .where(info.table[field].eq(value)).exec();
+}
+
 // Resolves to true if the selected table contains any rows.
 function hasRows(schemaName, tableName) {
 
@@ -370,6 +379,11 @@ function dispatchRequest(port, data) {
             deleteAll(data.schema, data.table).then(replySuccess, replyError);
             break;
 
+        case 'deleteWhereEqual':
+            deleteWhereEqual(data.schema, data.table, data.field, data.value)
+                .then(replySuccess, replyError);
+            break;
+
         case 'hasRows':
             hasRows(data.schema, data.table).then(replySuccess, replyError);
             break;
index b78d316..cfd787f 100644 (file)
@@ -83,6 +83,8 @@ angular.module('egCoreMod')
 
     // Connects if necessary to the active schemas then relays the request.
     service.request = function(args) {
+        // useful, but very chatty, leaving commented out.
+        // console.debug('egLovfield sending request: ', args);
         return service.connectToSchemas().then(
             function() {
                 return service.relayRequest(args);
@@ -154,19 +156,34 @@ angular.module('egCoreMod')
         );
     }
 
+    // Remove all pending offline transactions and delete the cached
+    // offline transactions date to indicate no transactions remain.
     service.destroyPendingOfflineXacts = function () {
         return service.request({
             schema: 'offline',
             table: 'OfflineXact',
             action: 'deleteAll'
+        }).then(function() {
+            return service.request({
+                schema: 'cache',
+                table: 'CacheDate',
+                action: 'deleteWhereEqual',
+                field: 'type',
+                value: '_offlineXact'
+            });
         });
     }
 
+    // Returns the cache date when xacts exit, null otherwise.
     service.havePendingOfflineXacts = function () {
         return service.request({
-            schema: 'offline',
-            table: 'OfflineXact',
-            action: 'hasRows'
+            schema: 'cache',
+            table: 'CacheDate',
+            action: 'selectWhereEqual',
+            field: 'type',
+            value: '_offlineXact'
+        }).then(function(results) {
+            return results[0] ? results[0].cachedate : null;
         });
     }
 
@@ -180,6 +197,24 @@ angular.module('egCoreMod')
         });
     }
 
+    // Add an offline transaction and update the cache indicating
+    // now() as the most recent addition of an offline xact.
+    service.addOfflineXact = function (obj) {
+        return service.request({
+            schema: 'offline',
+            table: 'OfflineXact',
+            action: 'insertOrReplace',
+            rows: [{value: obj}]
+        }).then(function() {
+            return service.request({
+                schema: 'cache',
+                table: 'CacheDate',
+                action: 'insertOrReplace',
+                rows: [{type: '_offlineXact', cachedate : new Date()}]
+            });
+        });
+    }
+
     service.populateBlockList = function() {
         return service.request({
             action: 'populateBlockList',
@@ -201,15 +236,6 @@ angular.module('egCoreMod')
         });
     }
 
-    service.addOfflineXact = function (obj) {
-        return service.request({
-            schema: 'offline',
-            table: 'OfflineXact',
-            action: 'insertOrReplace',
-            rows: [{value: obj}]
-        });
-    }
-
     service.setStatCatsCache = function (statcats) {
         if (lf.isOffline || !statcats || statcats.length === 0) 
             return $q.when();