From 4bbfdfb8fa247d8a7ed9ffb7d5a99976f6c706e8 Mon Sep 17 00:00:00 2001 From: Dan Irwin Date: Wed, 28 Mar 2018 10:25:44 -0400 Subject: [PATCH 1/2] fix for chrome65 --- build/ng-csv.js | 69 ++++++++++++++++++++------------- build/ng-csv.min.js | 4 +- src/ng-csv/directives/ng-csv.js | 54 ++++++++++++++------------ 3 files changed, 72 insertions(+), 55 deletions(-) diff --git a/build/ng-csv.js b/build/ng-csv.js index 80432ec..d425a7a 100644 --- a/build/ng-csv.js +++ b/build/ng-csv.js @@ -135,8 +135,11 @@ angular.module('ngCsv.services'). var labelArray, labelString; labelArray = []; - angular.forEach(arrData[0], function(value, label) { - this.push(that.stringifyField(label, options)); + + var iterator = !!options.columnOrder ? options.columnOrder : arrData[0]; + angular.forEach(iterator, function(value, label) { + var val = !!options.columnOrder ? value : label; + this.push(that.stringifyField(val, options)); }, labelArray); labelString = labelArray.join(options.fieldSep ? options.fieldSep : ","); csvContent += labelString + EOL; @@ -268,10 +271,16 @@ angular.module('ngCsv.directives'). */ $scope.buildCSV = function () { var deferred = $q.defer(); + var data = null; $element.addClass($attrs.ngCsvLoadingClass || 'ng-csv-loading'); - CSV.stringify($scope.data(), getBuildCsvOptions()).then(function (csv) { + data = $scope.data(); + if(angular.isFunction(data)){ + data = data(); + } + + CSV.stringify(data, getBuildCsvOptions()).then(function (csv) { $scope.csv = csv; $element.removeClass($attrs.ngCsvLoadingClass || 'ng-csv-loading'); deferred.resolve(csv); @@ -283,33 +292,37 @@ angular.module('ngCsv.directives'). } ], link: function (scope, element, attrs) { - function doClick() { - var charset = scope.charset || "utf-8"; - var blob = new Blob([scope.csv], { - type: "text/csv;charset="+ charset + ";" - }); - - if (window.navigator.msSaveOrOpenBlob) { - navigator.msSaveBlob(blob, scope.getFilename()); - } else { - - var downloadContainer = angular.element('
'); - var downloadLink = angular.element(downloadContainer.children()[0]); - downloadLink.attr('href', window.URL.createObjectURL(blob)); - downloadLink.attr('download', scope.getFilename()); - downloadLink.attr('target', '_blank'); - - $document.find('body').append(downloadContainer); - $timeout(function () { - downloadLink[0].click(); - downloadLink.remove(); - }, null); - } - } - element.bind('click', function (e) { scope.buildCSV().then(function (csv) { - doClick(); + + var csvData = new Blob([csv], {type: 'text/csv;charset=utf-8;'}); + var csvURL = null; + if (navigator.msSaveBlob) { + navigator.msSaveBlob(csvData, scope.getFilename()); + } else { + if(navigator.userAgent.toLowerCase().indexOf('chrome') === -1 ) { + var downloadContainer = angular.element('
'); + var downloadLink = angular.element(downloadContainer.children()[0]); + downloadLink.attr('href', window.URL.createObjectURL(csvData)); + downloadLink.attr('download', scope.getFilename()); + downloadLink.attr('target', '_blank'); + + $document.find('body').append(downloadContainer); + $timeout(function () { + downloadLink[0].click(); + downloadLink.remove(); + }, null); + } else { + csvURL = window.URL.createObjectURL(csvData); + + var tempLink = document.createElement('a'); + tempLink.href = csvURL; + tempLink.setAttribute('download', scope.getFilename()); + tempLink.click(); + } + + } + }); scope.$apply(); }); diff --git a/build/ng-csv.min.js b/build/ng-csv.min.js index 94dcd7f..22bed4e 100644 --- a/build/ng-csv.min.js +++ b/build/ng-csv.min.js @@ -1,2 +1,2 @@ -/*! ng-csv 10-10-2015 */ -!function(a){angular.module("ngCsv.config",[]).value("ngCsv.config",{debug:!0}).config(["$compileProvider",function(a){angular.isDefined(a.urlSanitizationWhitelist)?a.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/):a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/)}]),angular.module("ngCsv.directives",["ngCsv.services"]),angular.module("ngCsv.services",[]),angular.module("ngCsv",["ngCsv.config","ngCsv.services","ngCsv.directives","ngSanitize"]),"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ngCsv"),angular.module("ngCsv.services").service("CSV",["$q",function(a){var b="\r\n",c="",d={"\\t":" ","\\b":"\b","\\v":" ","\\f":"\f","\\r":"\r"};this.stringifyField=function(a,b){return"locale"===b.decimalSep&&this.isFloat(a)?a.toLocaleString():"."!==b.decimalSep&&this.isFloat(a)?a.toString().replace(".",b.decimalSep):"string"==typeof a?(a=a.replace(/"/g,'""'),(b.quoteStrings||a.indexOf(",")>-1||a.indexOf("\n")>-1||a.indexOf("\r")>-1)&&(a=b.txtDelim+a+b.txtDelim),a):"boolean"==typeof a?a?"TRUE":"FALSE":a},this.isFloat=function(a){return+a===a&&(!isFinite(a)||Boolean(a%1))},this.stringify=function(d,e){var f=a.defer(),g=this,h="",i="",j=a.when(d).then(function(a){if(angular.isDefined(e.header)&&e.header){var d,j;d=[],angular.forEach(e.header,function(a){this.push(g.stringifyField(a,e))},d),j=d.join(e.fieldSep?e.fieldSep:","),i+=j+b}var k=[];if(angular.isArray(a)?k=a:angular.isFunction(a)&&(k=a()),angular.isDefined(e.label)&&e.label&&"boolean"==typeof e.label){var l,m;l=[],angular.forEach(k[0],function(a,b){this.push(g.stringifyField(b,e))},l),m=l.join(e.fieldSep?e.fieldSep:","),i+=m+b}angular.forEach(k,function(a,c){var d,f,h=angular.copy(k[c]);f=[];var j=e.columnOrder?e.columnOrder:h;angular.forEach(j,function(a){var b=e.columnOrder?h[a]:a;this.push(g.stringifyField(b,e))},f),d=f.join(e.fieldSep?e.fieldSep:","),i+=c'),h=angular.element(g.children()[0]);h.attr("href",a.URL.createObjectURL(d)),h.attr("download",b.getFilename()),h.attr("target","_blank"),e.find("body").append(g),f(function(){h[0].click(),h.remove()},null)}}c.bind("click",function(){b.buildCSV().then(function(){d()}),b.$apply()})}}}])}(window,document); \ No newline at end of file +/*! ng-csv 28-03-2018 */ +!function(a,b){angular.module("ngCsv.config",[]).value("ngCsv.config",{debug:!0}).config(["$compileProvider",function(a){angular.isDefined(a.urlSanitizationWhitelist)?a.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/):a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/)}]),angular.module("ngCsv.directives",["ngCsv.services"]),angular.module("ngCsv.services",[]),angular.module("ngCsv",["ngCsv.config","ngCsv.services","ngCsv.directives","ngSanitize"]),"undefined"!=typeof module&&"undefined"!=typeof exports&&module.exports===exports&&(module.exports="ngCsv"),angular.module("ngCsv.services").service("CSV",["$q",function(a){var b="\r\n",c="\ufeff",d={"\\t":" ","\\b":"\b","\\v":" ","\\f":"\f","\\r":"\r"};this.stringifyField=function(a,b){return"locale"===b.decimalSep&&this.isFloat(a)?a.toLocaleString():"."!==b.decimalSep&&this.isFloat(a)?a.toString().replace(".",b.decimalSep):"string"==typeof a?(a=a.replace(/"/g,'""'),(b.quoteStrings||a.indexOf(",")>-1||a.indexOf("\n")>-1||a.indexOf("\r")>-1)&&(a=b.txtDelim+a+b.txtDelim),a):"boolean"==typeof a?a?"TRUE":"FALSE":a},this.isFloat=function(a){return+a===a&&(!isFinite(a)||Boolean(a%1))},this.stringify=function(d,e){var f=a.defer(),g=this,h="",i="",j=a.when(d).then(function(a){if(angular.isDefined(e.header)&&e.header){var d,j;d=[],angular.forEach(e.header,function(a,b){this.push(g.stringifyField(a,e))},d),j=d.join(e.fieldSep?e.fieldSep:","),i+=j+b}var k=[];if(angular.isArray(a)?k=a:angular.isFunction(a)&&(k=a()),angular.isDefined(e.label)&&e.label&&"boolean"==typeof e.label){var l,m;l=[];var n=e.columnOrder?e.columnOrder:k[0];angular.forEach(n,function(a,b){var c=e.columnOrder?a:b;this.push(g.stringifyField(c,e))},l),m=l.join(e.fieldSep?e.fieldSep:","),i+=m+b}angular.forEach(k,function(a,c){var d,f,h=angular.copy(k[c]);f=[];var j=e.columnOrder?e.columnOrder:h;angular.forEach(j,function(a,b){var c=e.columnOrder?h[a]:a;this.push(g.stringifyField(c,e))},f),d=f.join(e.fieldSep?e.fieldSep:","),i+=c'),j=angular.element(i.children()[0]);j.attr("href",a.URL.createObjectURL(e)),j.attr("download",c.getFilename()),j.attr("target","_blank"),f.find("body").append(i),g(function(){j[0].click(),j.remove()},null)}else{h=a.URL.createObjectURL(e);var k=b.createElement("a");k.href=h,k.setAttribute("download",c.getFilename()),k.click()}}),c.$apply()})}}}])}(window,document); \ No newline at end of file diff --git a/src/ng-csv/directives/ng-csv.js b/src/ng-csv/directives/ng-csv.js index bb8b4b8..f5908ab 100644 --- a/src/ng-csv/directives/ng-csv.js +++ b/src/ng-csv/directives/ng-csv.js @@ -89,33 +89,37 @@ angular.module('ngCsv.directives'). } ], link: function (scope, element, attrs) { - function doClick() { - var charset = scope.charset || "utf-8"; - var blob = new Blob([scope.csv], { - type: "text/csv;charset="+ charset + ";" - }); - - if (window.navigator.msSaveOrOpenBlob) { - navigator.msSaveBlob(blob, scope.getFilename()); - } else { - - var downloadContainer = angular.element('
'); - var downloadLink = angular.element(downloadContainer.children()[0]); - downloadLink.attr('href', window.URL.createObjectURL(blob)); - downloadLink.attr('download', scope.getFilename()); - downloadLink.attr('target', '_blank'); - - $document.find('body').append(downloadContainer); - $timeout(function () { - downloadLink[0].click(); - downloadLink.remove(); - }, null); - } - } - element.bind('click', function (e) { scope.buildCSV().then(function (csv) { - doClick(); + + var csvData = new Blob([csv], {type: 'text/csv;charset=utf-8;'}); + var csvURL = null; + if (navigator.msSaveBlob) { + navigator.msSaveBlob(csvData, scope.getFilename()); + } else { + if(navigator.userAgent.toLowerCase().indexOf('chrome') === -1 ) { + var downloadContainer = angular.element('
'); + var downloadLink = angular.element(downloadContainer.children()[0]); + downloadLink.attr('href', window.URL.createObjectURL(csvData)); + downloadLink.attr('download', scope.getFilename()); + downloadLink.attr('target', '_blank'); + + $document.find('body').append(downloadContainer); + $timeout(function () { + downloadLink[0].click(); + downloadLink.remove(); + }, null); + } else { + csvURL = window.URL.createObjectURL(csvData); + + var tempLink = document.createElement('a'); + tempLink.href = csvURL; + tempLink.setAttribute('download', scope.getFilename()); + tempLink.click(); + } + + } + }); scope.$apply(); }); From 4d95d5c83bcc9378eb671a0f4fffdc6305e1aa1b Mon Sep 17 00:00:00 2001 From: Dan Irwin Date: Wed, 28 Mar 2018 10:38:47 -0400 Subject: [PATCH 2/2] should use something a little newer than nodejs 0.10, upping to 6 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c54c557..269f606 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - 0.10 + - "6" before_script: - npm install -g grunt-cli bower - bower install \ No newline at end of file