You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sirona.apache.org by ol...@apache.org on 2014/08/22 09:07:15 UTC

svn commit: r1619691 - /incubator/sirona/trunk/server/reporting/reporting-ui/src/main/webapp/js/app/controllers/controllers-report.js

Author: olamy
Date: Fri Aug 22 07:07:15 2014
New Revision: 1619691

URL: http://svn.apache.org/r1619691
Log:
csv export and paging

Modified:
    incubator/sirona/trunk/server/reporting/reporting-ui/src/main/webapp/js/app/controllers/controllers-report.js

Modified: incubator/sirona/trunk/server/reporting/reporting-ui/src/main/webapp/js/app/controllers/controllers-report.js
URL: http://svn.apache.org/viewvc/incubator/sirona/trunk/server/reporting/reporting-ui/src/main/webapp/js/app/controllers/controllers-report.js?rev=1619691&r1=1619690&r2=1619691&view=diff
==============================================================================
--- incubator/sirona/trunk/server/reporting/reporting-ui/src/main/webapp/js/app/controllers/controllers-report.js (original)
+++ incubator/sirona/trunk/server/reporting/reporting-ui/src/main/webapp/js/app/controllers/controllers-report.js Fri Aug 22 07:07:15 2014
@@ -41,14 +41,22 @@ define(['jquery','angular','bootstrap','
         {field: 'maxConcurrency', displayName: 'MaxConcurrency'},
       ];
 
+      var csvOpts = {fileName: "counters.csv"};
+
+      $scope.pagingOptions= {
+        pageSizes: [25, 50, 1000],
+        pageSize: 25,
+        currentPage: 1
+      };
 
       $scope.gridOptions={
         enablePaging: true,
-        showFooter: false,
+        pagingOptions: $scope.pagingOptions,
+        showFooter: true,
         showGroupPanel: true,
-        jqueryUITheme: true,
+        jqueryUITheme: false,
         columnDefs: 'colDefs',
-        plugins: [new ngGridFlexibleHeightPlugin()]
+        plugins: [new ngGridFlexibleHeightPlugin(), new ngGridCsvExportPlugin(csvOpts)]
       };
 
       $http.get('restServices/sironaServices/counters')
@@ -58,16 +66,6 @@ define(['jquery','angular','bootstrap','
 
       $scope.gridOptions.data='counters';
 
-
-
-      $scope.getTableStyle= function() {
-        var rowHeight=80;
-        var headerHeight=50;
-        return {
-          height: ($scope.gridOptions.data.length * rowHeight + headerHeight) + "px"
-        };
-      };
-
   }]);
 
 
@@ -115,6 +113,107 @@ define(['jquery','angular','bootstrap','
     };
   };
 
+  function ngGridCsvExportPlugin (opts) {
+    var self = this;
+    self.grid = null;
+    self.scope = null;
+    self.services = null;
+
+    opts = opts || {};
+    opts.containerPanel = opts.containerPanel || '.ngFooterPanel';
+    opts.linkClass = opts.linkCss || 'csv-data-link-span';
+    opts.linkLabel = opts.linkLabel || 'CSV Export';
+    opts.fileName = opts.fileName || 'Export.csv';
+
+    self.init = function(scope, grid, services) {
+      self.grid = grid;
+      self.scope = scope;
+      self.services = services;
+
+      function showDs() {
+        function csvStringify(str) {
+          if (str == null) { // we want to catch anything null-ish, hence just == not ===
+            return '';
+          }
+          if (typeof(str) === 'number') {
+            return '' + str;
+          }
+          if (typeof(str) === 'boolean') {
+            return (str ? 'TRUE' : 'FALSE') ;
+          }
+          if (typeof(str) === 'string') {
+            return str.replace(/"/g,'""');
+          }
+
+          return JSON.stringify(str).replace(/"/g,'""');
+        }
+
+        var keys = [];
+        var csvData = '';
+        for (var f in grid.config.columnDefs) {
+          if (grid.config.columnDefs.hasOwnProperty(f))
+          {
+            keys.push(grid.config.columnDefs[f].field);
+            csvData += '"' ;
+            if(typeof grid.config.columnDefs[f].displayName !== 'undefined'){/** moved to reduce looping and capture the display name if it exists**/
+            csvData += csvStringify(grid.config.columnDefs[f].displayName);
+            }
+            else{
+              csvData += csvStringify(grid.config.columnDefs[f].field);
+            }
+            csvData +=  '",';
+          }
+        }
+
+        function swapLastCommaForNewline(str) {
+          var newStr = str.substr(0,str.length - 1);
+          return newStr + "\n";
+        }
+
+        csvData = swapLastCommaForNewline(csvData);
+        var gridData = grid.data;
+        for (var gridRow in gridData) {
+          var rowData = '';
+          for ( var k in keys) {
+            var curCellRaw;
+
+            if (opts != null && opts.columnOverrides != null && opts.columnOverrides[keys[k]] != null) {
+              curCellRaw = opts.columnOverrides[keys[k]](
+                  self.services.UtilityService.evalProperty(gridData[gridRow], keys[k]));
+            } else {
+              curCellRaw = self.services.UtilityService.evalProperty(gridData[gridRow], keys[k]);
+            }
+
+            rowData += '"' + csvStringify(curCellRaw) + '",';
+          }
+          csvData += swapLastCommaForNewline(rowData);
+        }
+        var fp = grid.$root.find(opts.containerPanel);
+        var csvDataLinkPrevious = grid.$root.find(opts.containerPanel + ' .' + opts.linkClass);
+        if (csvDataLinkPrevious != null) {csvDataLinkPrevious.remove() ; }
+        var csvDataLinkHtml = '<span class="' + opts.linkClass + '">';
+        csvDataLinkHtml += '<br><a href="data:text/csv;charset=UTF-8,';
+        csvDataLinkHtml += encodeURIComponent(csvData);
+        csvDataLinkHtml += '" download="' + opts.fileName + '">' + opts.linkLabel + '</a></br></span>' ;
+        fp.append(csvDataLinkHtml);
+
+
+      }
+      setTimeout(showDs, 0);
+      scope.catHashKeys = function() {
+        var hash = '';
+        for (var idx in scope.renderedRows) {
+          hash += scope.renderedRows[idx].$$hashKey;
+        }
+        return hash;
+      };
+      if (opts && opts.customDataWatcher) {
+        scope.$watch(opts.customDataWatcher, showDs);
+      } else {
+        scope.$watch(scope.catHashKeys, showDs);
+      }
+    };
+  };
 
 });