Skip to content
Closed
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
lib/
node_modules/
coverage/
npm-debug.log
185 changes: 55 additions & 130 deletions cdn/react-csv-1.0.6.js

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions cdn/react-csv-1.0.6.min.js

Large diffs are not rendered by default.

75 changes: 75 additions & 0 deletions lib/components/Download.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _class, _temp;

var _react = require('react');

var _react2 = _interopRequireDefault(_react);

var _core = require('../core');

var _metaProps = require('../metaProps');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var defaultProps = {
target: '_blank'
};

var CSVDownload = (_temp = _class = function (_React$Component) {
_inherits(CSVDownload, _React$Component);

function CSVDownload(props) {
_classCallCheck(this, CSVDownload);

var _this = _possibleConstructorReturn(this, (CSVDownload.__proto__ || Object.getPrototypeOf(CSVDownload)).call(this, props));

_this.state = {};
return _this;
}

_createClass(CSVDownload, [{
key: 'buildURI',
value: function buildURI() {
return _core.buildURI.apply(undefined, arguments);
}
}, {
key: 'componentDidMount',
value: function componentDidMount() {
var _props = this.props,
data = _props.data,
headers = _props.headers,
separator = _props.separator,
target = _props.target,
specs = _props.specs,
replace = _props.replace;

this.state.page = window.open(this.buildURI(data, headers, separator), target, specs, replace);
}
}, {
key: 'getWindow',
value: function getWindow() {
return this.state.page;
}
}, {
key: 'render',
value: function render() {
return null;
}
}]);

return CSVDownload;
}(_react2.default.Component), _class.defaultProps = Object.assign(_metaProps.defaultProps, defaultProps), _class.propTypes = _metaProps.propTypes, _temp);
exports.default = CSVDownload;
90 changes: 90 additions & 0 deletions lib/components/Link.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

var _class, _temp;

var _react = require('react');

var _react2 = _interopRequireDefault(_react);

var _core = require('../core');

var _metaProps = require('../metaProps');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }

var CSVLink = (_temp = _class = function (_React$Component) {
_inherits(CSVLink, _React$Component);

function CSVLink(props) {
_classCallCheck(this, CSVLink);

var _this = _possibleConstructorReturn(this, (CSVLink.__proto__ || Object.getPrototypeOf(CSVLink)).call(this, props));

_this.buildURI = _this.buildURI.bind(_this);
return _this;
}

_createClass(CSVLink, [{
key: 'buildURI',
value: function buildURI() {
return _core.buildURI.apply(undefined, arguments);
}
}, {
key: 'handleLegacy',
value: function handleLegacy(evt, data, headers, separator, filename) {
if (window.navigator.msSaveOrOpenBlob) {
evt.preventDefault();

var blob = new Blob([(0, _core.toCSV)(data, headers, separator)]);
window.navigator.msSaveBlob(blob, filename);

return false;
}
}
}, {
key: 'render',
value: function render() {
var _this2 = this;

var _props = this.props,
data = _props.data,
headers = _props.headers,
separator = _props.separator,
filename = _props.filename,
children = _props.children,
rest = _objectWithoutProperties(_props, ['data', 'headers', 'separator', 'filename', 'children']);

return _react2.default.createElement(
'a',
_extends({ download: filename }, rest, {
href: this.buildURI(data, headers, separator),
ref: function ref(link) {
return _this2.link = link;
},
onClick: function onClick(evt) {
return _this2.handleLegacy(evt, data, headers, separator, filename);
} }),
children
);
}
}]);

return CSVLink;
}(_react2.default.Component), _class.defaultProps = _metaProps.defaultProps, _class.propTypes = _metaProps.propTypes, _temp);
exports.default = CSVLink;
71 changes: 71 additions & 0 deletions lib/core.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }

var isJsons = exports.isJsons = function isJsons(array) {
return Array.isArray(array) && array.every(function (row) {
return (typeof row === 'undefined' ? 'undefined' : _typeof(row)) === 'object' && !(row instanceof Array);
});
};

var isArrays = exports.isArrays = function isArrays(array) {
return Array.isArray(array) && array.every(function (row) {
return Array.isArray(row);
});
};

var jsonsHeaders = exports.jsonsHeaders = function jsonsHeaders(array) {
return Array.from(array.map(function (json) {
return Object.keys(json);
}).reduce(function (a, b) {
return new Set([].concat(_toConsumableArray(a), _toConsumableArray(b)));
}, []));
};

var jsons2arrays = exports.jsons2arrays = function jsons2arrays(jsons, headers) {
headers = headers || jsonsHeaders(jsons);
var data = jsons.map(function (object) {
return headers.map(function (header) {
return header in object ? object[header] : '';
});
});
return [headers].concat(_toConsumableArray(data));
};

var joiner = exports.joiner = function joiner(data) {
var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ',';
return data.map(function (row, index) {
return row.map(function (element) {
return "\"" + element + "\"";
}).join(separator);
}).join('\n');
};

var arrays2csv = exports.arrays2csv = function arrays2csv(data, headers, separator) {
return joiner(headers ? [headers].concat(_toConsumableArray(data)) : data, separator);
};

var jsons2csv = exports.jsons2csv = function jsons2csv(data, headers, separator) {
return joiner(jsons2arrays(data, headers), separator);
};

var string2csv = exports.string2csv = function string2csv(data, headers, separator) {
return headers ? headers.join(separator) + '\n' + data : data;
};

var toCSV = exports.toCSV = function toCSV(data, headers, separator) {
if (isJsons(data)) return jsons2csv(data, headers, separator);
if (isArrays(data)) return arrays2csv(data, headers, separator);
if (typeof data === 'string') return string2csv(data, headers, separator);
throw new TypeError('Data should be a "String", "Array of arrays" OR "Array of objects" ');
};

var buildURI = exports.buildURI = function buildURI(data, headers, separator) {
return encodeURI('data:text/csv;charset=utf-8,\uFEFF' + toCSV(data, headers, separator));
};
19 changes: 19 additions & 0 deletions lib/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CSVLink = exports.CSVDownload = undefined;

var _Download = require('./components/Download');

var _Download2 = _interopRequireDefault(_Download);

var _Link = require('./components/Link');

var _Link2 = _interopRequireDefault(_Link);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var CSVDownload = exports.CSVDownload = _Download2.default;
var CSVLink = exports.CSVLink = _Link2.default;
29 changes: 29 additions & 0 deletions lib/metaProps.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});
exports.PropsNotForwarded = exports.defaultProps = exports.propTypes = undefined;

var _react = require('react');

var _react2 = _interopRequireDefault(_react);

var _propTypes = require('prop-types');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var propTypes = exports.propTypes = {
data: (0, _propTypes.oneOfType)([_propTypes.string, _propTypes.array]).isRequired,
headers: _propTypes.array,
target: _propTypes.string,
separator: _propTypes.string,
filename: _propTypes.string
};

var defaultProps = exports.defaultProps = {
separator: ',',
filename: 'generatedBy_react-csv.csv'
};

var PropsNotForwarded = exports.PropsNotForwarded = ['data', 'headers'];
Loading