browser staff : initial print/store service
authorBill Erickson <berick@esilibrary.com>
Tue, 8 Apr 2014 19:06:21 +0000 (15:06 -0400)
committerBill Erickson <berick@esilibrary.com>
Tue, 8 Apr 2014 19:06:21 +0000 (15:06 -0400)
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/src/templates/staff/parts/t_autogrid.tt2
Open-ILS/src/templates/staff/t_base_js.tt2
Open-ILS/web/js/ui/default/staff/services/grid.js
Open-ILS/web/js/ui/default/staff/services/printstore.js [new file with mode: 0644]

index d343921..959d79a 100644 (file)
         <span class="glyphicon glyphicon-download"></span>
         [% l('Download CSV') %]
       </a></li>
+      <li><a href='' ng-click="grid.printCSV()">
+        <span class="glyphicon glyphicon-print"></span>
+        [% l('Print CSV') %]
+      </a></li>
       <li role="presentation" class="divider"></li>
       <li ng-repeat="col in grid.columnsProvider.columns">
         <a href='' ng-click="grid.columnsProvider.visible[col.name] = 
index 94cb445..ab243c3 100644 (file)
@@ -33,6 +33,7 @@
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/env.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/org.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/startup.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/printstore.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/ui.js"></script>
 
 <!-- navbar driver -->
index 1d1dbb0..1f4b118 100644 (file)
@@ -56,9 +56,9 @@ angular.module('egGridMod',
 
         controller : [
                     '$scope','egIDL','egAuth','egNet', 'egGridFlatDataProvider',
-                    'egGridColumnsProvider', '$filter','$window',
+                    'egGridColumnsProvider','$filter','$window','egPrintStore',
             function($scope,  egIDL,  egAuth,  egNet,  egGridFlatDataProvider,  
-                egGridColumnsProvider, $filter,  $window) {
+                     egGridColumnsProvider , $filter , $window , egPrintStore) {
 
             var grid = this;
 
@@ -428,6 +428,11 @@ angular.module('egGridMod',
                     ($window.URL || $window.webkitURL).createObjectURL(blob);
             }
 
+            grid.printCSV = function() {
+                egPrintStore.print('text/csv', grid.generateCSV())
+                .then(function() { console.debug('print complete') });
+            }
+
             // generates CSV for the currently visible grid contents
             grid.generateCSV = function() {
                 var csvStr = '';
diff --git a/Open-ILS/web/js/ui/default/staff/services/printstore.js b/Open-ILS/web/js/ui/default/staff/services/printstore.js
new file mode 100644 (file)
index 0000000..a2166a7
--- /dev/null
@@ -0,0 +1,109 @@
+/**
+ * Core Service - egPrint
+ *
+ */
+
+angular.module('egCoreMod')
+
+
+.factory('egPrintStore', ['$q', '$window', function($q, $window) {
+
+    var service = {};
+    service.msgId = 0;
+    service.messages = {};
+    service.pending = [];
+    service.socket = null;
+    service.hatchAvailable = null;
+    service.hatchURL = 'ws://localhost:8080/hatch/'; // TODO: configuration/ssl
+
+    service.hatchSend = function(msg) {
+
+        msg.msgid = '' + (service.msgId++);
+        msg.deferred = $q.defer();
+
+        service.messages[msg.msgid] = msg;
+
+        if (service.hatchAvailable === true) {
+            service.socket.send(JSON.stringify(msg));
+        } else {
+            service.pending.push(msg);
+            service.hatchConnect();
+        }
+
+        return msg.deferred.promise;
+    }
+
+    service.hatchConnect = function() {
+        service.socket = new WebSocket(service.hatchURL);
+
+        service.socket.onopen = function() {
+            console.debug('connected to Hatch');
+            service.hatchAvailable = true;
+            angular.forEach(service.pending, function(msg) {
+                service.socket.send(JSON.stringify(msg));
+            });
+        }
+
+        service.socket.onclose = function() {
+            console.debug("disconnected from Hatch");
+            service.socket = null;
+        }
+
+        service.socket.onerror = function() {
+            console.log(
+                "unable to connect to Hatch server at " + service.hatchURL);
+            service.hatchAvailable = false;
+            service.socket = null;
+        }
+
+        service.socket.onmessage = function(evt) {
+            var msgStr = evt.data;
+
+            if (!msgStr) {
+                console.error("Hatch returned empty message");
+                return;
+            }
+
+            console.debug('Hatch says ' + msgStr);
+            var msgObj = JSON.parse(msgStr);
+
+            if (msgObj.success) {
+                console.debug("hatch command succeeded : " + msgObj.success);
+            } else {
+                console.error("hatch command failed : " + msgObj.error);
+            }
+
+            var srcMsg = service.messages[msgObj.msgid];
+            delete service.messages[msgObj.msgid];
+            srcMsg.deferred.resolve(msgObj);
+        }
+    }
+
+    service.browserPrinter = function(mime, data) {
+        switch (mime) {
+            case 'text/csv':
+            case 'text/plain':
+                $window.print(data);
+                break;
+            case 'text/html':
+                // TODO: generate the document and print it
+        }
+    }
+
+    service.print = function(mime, data) {
+        if (service.hatchAvailable === false) {
+            service.browserPrint(mime, data);
+            return $q.when();
+        } 
+        
+        return service.hatchSend({
+            key : 'no-op', 
+            action : 'print',
+            mime : mime, 
+            value : data, 
+            //printer : printer // TODO: prefs, etc.
+        });
+    }
+
+    return service;
+}]);