Skip to content

Instantly share code, notes, and snippets.

@fathermerry
Last active March 25, 2016 20:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fathermerry/06a71007dabb1a5e921a to your computer and use it in GitHub Desktop.
Save fathermerry/06a71007dabb1a5e921a to your computer and use it in GitHub Desktop.
Directive for Exporting to CSV with Angular
angular
.module('export.csv', [])
.directive('export', function() {
return {
restrict: 'AE',
scope: {
data: '=data',
title: '=title',
keys: '=keys',
headers: '=headers'
},
link: function(scope, el, attrs) {
el.bind('click', function() {
var data = scope.data;
var title = scope.title;
var keys = scope.keys;
var headers = scope.headers;
if (data && !Array.isArray(data)) throw new Error("Data must be a valid javascript array");
if (keys && !Array.isArray(keys)) throw new Error("Keys must be a valid javascript array");
if (!data.length) throw new Error("No data available to export");
if (keys && keys.length) {
data = filterArrayKeys(data, keys);
} else {
var sample_data = data[0];
keys = Object.keys(sample_data);
}
if (!headers) headers = convertToUppercase(keys);
//////////////////////////
//// Export Functions ////
//////////////////////////
var csv = '';
if (title) csv += title + '\r\n\n';
csv += headers.join(",") + '\r\n';
for (var i = 0; i < data.length; i++) {
var row = "";
for (var index in data[i]) {
row += '"' + data[i][index] + '",';
}
row.slice(0, row.length - 1);
csv += row + '\r\n';
}
if (csv == '') {
throw "Invalid data";
return;
}
var title = title || ("Export " + getDate());
var filename = title.replace(/ /g, "_");
var uri = 'data:text/csv;charset=utf-8,' + escape(csv);
var link = document.createElement("a");
link.href = uri;
link.style = "visibility:hidden";
link.download = filename + ".csv";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
/////////////////////////
/// Utility Functions ///
/////////////////////////
function filterArrayKeys(array, keys) {
var result = [];
if (!array.length || !keys.length) return result;
for (var i = 0; i < array.length; i++) {
var array_object = array[i];
var new_object = {};
for (var j = 0; j < keys.length; j++) {
var key = keys[j];
var value = array_object[key];
new_object[key] = value;
}
result.push(new_object);
}
return result;
};
function convertToUppercase(array) {
var result = [];
for (var i = 0; i < array.length; i++) {
var key = array[i];
result.push(key.charAt(0).toUpperCase() + key.slice(1));
}
return result;
}
function getDate() {
var monthNames = [
"January", "February", "March",
"April", "May", "June", "July",
"August", "September", "October",
"November", "December"
];
var date = new Date();
var day = date.getDate();
var monthIndex = date.getMonth();
var year = date.getFullYear();
return day + ' ' + monthNames[monthIndex] + ' ' + year;
}
});
}
};
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment