@ovh-ux/ng-ovh-export-csv
Version:
Export data as CSV file.
218 lines (208 loc) • 8.11 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('angular'), require('moment')) :
typeof define === 'function' && define.amd ? define(['angular', 'moment'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global["ng-ovh-export-csv"] = factory(global.angular, global.moment));
})(this, (function (angular, moment) { 'use strict';
function ___$insertStyle(css) {
if (!css || typeof window === 'undefined') {
return;
}
const style = document.createElement('style');
style.setAttribute('type', 'text/css');
style.innerHTML = css;
document.head.appendChild(style);
return css;
}
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var angular__default = /*#__PURE__*/_interopDefaultLegacy(angular);
var moment__default = /*#__PURE__*/_interopDefaultLegacy(moment);
_ngInjectExport$1.$inject = ["$location"];
function _ngInjectExport$1($location) {
var self = this;
var internalCache = {};
var internalStatus = {
notFound: 'NOT_FOUND',
doing: 'DOING',
error: 'ERROR'
};
this.exportData = function exportData(opts) {
var csvContent = '';
var lines = [];
var filename;
var seperator = opts.separator || ',';
var dataString;
if (!opts.fileName) {
filename = $location.path().replace(/\//, '');
filename = filename.replace(/\//g, '-');
if ($location.search().TAB) {
filename += $location.search().TAB;
}
} else {
filename = opts.fileName;
}
filename += "-".concat(moment__default["default"]().format('YYYY-MM-DD_HH:mm:ss'), ".csv");
if (typeof opts.datas === 'string') {
csvContent = opts.datas;
} else if (Object.prototype.toString.call(opts.datas) === '[object Array]') {
angular__default["default"].forEach(opts.datas, function (line) {
lines.push(line.join(seperator));
});
csvContent += lines.join('\n');
} else {
csvContent += opts.datas.join('\n');
}
if (navigator.platform.toUpperCase().indexOf('WIN') > -1) {
dataString = "data:text/csv;charset=windows-1252;base64,".concat(btoa(unescape(encodeURIComponent(csvContent))));
} else {
dataString = "data:text/csv;charset=utf-8;base64,".concat(btoa(unescape(encodeURIComponent(csvContent))));
}
var link = document.createElement('a');
if (link.download !== undefined) {
link.setAttribute('href', dataString);
link.setAttribute('download', filename);
link.setAttribute('style', 'visibility:hidden');
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
} else {
window.open(dataString);
}
return dataString;
};
function saveDataSnapshot(options) {
if (!options.instanceName) {
throw new Error('[wroughtDataForCsv()]: missing options');
}
var instanceName = options.instanceName.toString();
if (!internalCache[instanceName]) {
internalCache[instanceName] = {};
}
internalCache[instanceName].data = options.internalData;
}
function setDataStatus(options, status, error) {
if (!options.instanceName) {
throw new Error('missing instanceName');
}
if (!internalStatus[status]) {
throw new Error('invalide status');
}
internalCache[options.instanceName.toString()].status = internalStatus[status];
if (status === 'error') {
if (error) {
internalCache[options.instanceName.toString()].error = error;
} else {
internalCache[options.instanceName.toString()].error = null;
}
}
}
function wroughtDataForCsvError(options, error) {
if (options.notify) {
options.notify(options.internalData);
}
setDataStatus(options, 'error', error);
if (options.error) {
options.error(error, options.internalData);
}
}
/*
* prepare data needed to export of CSV
* @param {object} object of options: \{
* `` MANDATORY ``
* instanceName {string} arbitrary string to identify the process
* iterator {function} the function called until the job is done (must return a promise)
* keepGoing {function} the function called at each iteration loop to known if the job is
* done or if we have to call the iterator again
* `` OPTIONAL ``
* notify {function} function called after each iteration
* done {function} function called when the job is done
* \}
*
* @return undefined
* */
this.wroughtDataForCsv = function wroughtDataForCsv(options, callHimself) {
if (!options || !options.instanceName || !options.iterator || !options.keepGoing) {
throw new Error('[wroughtDataForCsv()]: missing options');
}
if (!callHimself && self.getExportCsvStatus === internalStatus.doing) {
wroughtDataForCsvError(options, new Error("the process ".concat(options.instanceName, " is already in progress")));
}
saveDataSnapshot(options);
setDataStatus(options, 'doing');
options.iterator(options.internalData).then(function () {
if (options.notify) {
options.notify(options.internalData);
}
options.keepGoing(options.internalData).then(function (keepGoing) {
if (keepGoing) {
self.wroughtDataForCsv(options, true);
} else {
if (options.done) {
options.done(options.internalData);
}
delete internalCache[options.instanceName.toString()];
}
}, function (err) {
wroughtDataForCsvError(options, err);
});
}, function (err) {
wroughtDataForCsvError(options, err);
});
};
this.getExportCsvStatus = function getExportCsvStatus(instanceName) {
if (!instanceName) {
throw new Error('[getExportCsvStatus()]: missing instance name');
}
return internalCache[instanceName] ? internalCache[instanceName].status : internalStatus.notFound;
};
this.getExportCsvError = function getExportCsvError(instanceName) {
if (!instanceName) {
throw new Error('[getExportCsvError()]: missing instance name');
}
return internalCache[instanceName] && internalCache[instanceName].error ? internalCache[instanceName].error : null;
};
Object.defineProperty(self, 'statusEnum', {
enumerable: true,
configurable: false,
get: function get() {
return angular__default["default"].copy(internalStatus);
},
set: function set() {
throw new Error("'statusEnum' is a read only property");
}
});
}
_ngInjectExport.$inject = ["$parse", "$q", "exportCsv"];
function _ngInjectExport($parse, $q, exportCsv) {
return {
scope: {
exportCsv: '&',
name: '@exportCsvFileName',
separator: '@exportCsvSeparator'
},
replace: false,
compile: function compile() {
var exp = $parse('exportToCSV();');
return function ($scope, $elm) {
$scope.exportToCSV = function () {
$q.when($scope.exportCsv()).then(function (dataToExport) {
if (dataToExport) {
exportCsv.exportData({
fileName: $scope.name,
separator: $scope.separator,
datas: dataToExport
});
}
});
};
$elm.bind('click', function () {
exp($scope);
});
};
}
};
}
var moduleName = 'ngOvhExportCsv';
angular__default["default"].module(moduleName, []).service('exportCsv', _ngInjectExport$1).directive('exportCsv', _ngInjectExport);
return moduleName;
}));
//# sourceMappingURL=ng-ovh-export-csv.js.map