canner
Version:
Build CMS in few lines of code for different data sources
336 lines (280 loc) • 11 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
require("antd/lib/modal/style");
var _modal = _interopRequireDefault(require("antd/lib/modal"));
require("antd/lib/alert/style");
var _alert = _interopRequireDefault(require("antd/lib/alert"));
require("antd/lib/button/style");
var _button = _interopRequireDefault(require("antd/lib/button"));
require("antd/lib/icon/style");
var _icon = _interopRequireDefault(require("antd/lib/icon"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf3 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
require("antd/lib/form/style");
var _form = _interopRequireDefault(require("antd/lib/form"));
require("antd/lib/upload/style");
var _upload = _interopRequireDefault(require("antd/lib/upload"));
var _react = _interopRequireDefault(require("react"));
var _cannerHelpers = require("canner-helpers");
var _antd = require("antd");
var _lodash = require("lodash");
var _reactApollo = require("react-apollo");
var _reactIntl = require("react-intl");
var _dec, _class;
var Dragger = _upload.default.Dragger;
var ImportModal = ( // $FlowFixMe
_dec = _form.default.create(), (0, _reactIntl.injectIntl)(_class = (0, _reactApollo.withApollo)(_class = _dec(_class =
/*#__PURE__*/
function (_React$Component) {
(0, _inherits2.default)(ImportModal, _React$Component);
function ImportModal() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2.default)(this, ImportModal);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = (0, _possibleConstructorReturn2.default)(this, (_getPrototypeOf2 = (0, _getPrototypeOf3.default)(ImportModal)).call.apply(_getPrototypeOf2, [this].concat(args)));
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "state", {
success: false,
error: false,
errorMessage: '',
list: []
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "download", function (e) {
e.preventDefault();
var _this$props = _this.props,
fileName = _this$props.fileName,
triggerModal = _this$props.triggerModal,
fields = _this$props.fields;
var csv = genCSV([], fields);
download(fileName, csv);
triggerModal();
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleCancel", function () {
_this.props.triggerModal();
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "customRequest", function (_ref) {
var onSuccess = _ref.onSuccess,
onError = _ref.onError,
file = _ref.file;
var _this$props2 = _this.props,
deploy = _this$props2.deploy,
keyName = _this$props2.keyName;
var reader = new FileReader();
reader.readAsText(file);
reader.onload = function (e) {
var csv = parseCSV(e.target.result, '\n', ',');
_this.setState({
list: csv.slice(1)
});
_this.request(csv).then(function () {
return deploy(keyName);
}).then(function () {
onSuccess('done');
}).catch(function (e) {
onError(e);
});
};
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "request", function (csv) {
var _this$props3 = _this.props,
request = _this$props3.request,
fields = _this$props3.fields,
keyName = _this$props3.keyName,
items = _this$props3.items,
intl = _this$props3.intl;
var fieldsLength = fields.length;
return new Promise(function (resolve, reject) {
try {
csv.slice(1).reduce(function (preRequest, values) {
var payload = fields.reduce(function (result, field, index) {
var value = values[index];
if (field.type === 'number') {
value = Number(value);
} else if (field.type === 'boolean') {
value = Boolean(value);
}
(0, _lodash.set)(result, field.keyName, value);
return result;
}, {});
if (values.length !== fieldsLength) {
throw new Error(intl.formatMessage({
id: 'actions.import.error.invalidFormat'
}));
}
var tmpId = Math.random().toString(36).substr(2, 12);
return preRequest.then(function () {
return request({
type: 'CREATE_ARRAY',
payload: {
key: keyName,
id: tmpId,
value: (0, _objectSpread2.default)({}, (0, _cannerHelpers.createEmptyData)(items), payload, {
id: tmpId,
__typename: null
})
}
}).catch(function (e) {
return e;
});
});
}, Promise.resolve()).then(resolve);
} catch (e) {
reject(e);
}
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "uploadChange", function (info) {
var file = info.file;
if (file.status === 'done') {
_this.setState({
success: true
});
} else if (file.status === 'error') {
_this.setState({
success: false,
error: true,
errorMessage: file.error.message
});
} else {
_this.setState({
success: false,
error: false
});
}
});
return _this;
}
(0, _createClass2.default)(ImportModal, [{
key: "render",
value: function render() {
var _this$props4 = this.props,
visible = _this$props4.visible,
title = _this$props4.title,
keyName = _this$props4.keyName;
var _this$state = this.state,
success = _this$state.success,
list = _this$state.list,
error = _this$state.error,
errorMessage = _this$state.errorMessage;
return _react.default.createElement(_modal.default, {
title: _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.import.modal.title"
}),
visible: visible,
footer: null,
closable: true,
maskClosable: true,
onCancel: this.handleCancel
}, _react.default.createElement(_react.default.Fragment, null, _react.default.createElement("div", {
style: {
marginBottom: 24
}
}, _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.import.step1",
tagName: "div"
}), _react.default.createElement(_button.default, {
onClick: this.download,
"data-testid": "actions-import-download-button"
}, _react.default.createElement(_icon.default, {
type: "download"
}), _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.import.download"
}))), _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.import.step2",
tagName: "div"
}), _react.default.createElement(Dragger, {
name: "file",
"data-testid": "actions-import-dragger",
customRequest: this.customRequest,
accept: "text/csv",
onChange: this.uploadChange
}, _react.default.createElement("p", {
className: "ant-upload-drag-icon"
}, _react.default.createElement(_icon.default, {
type: "inbox"
})), _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.import.upload.hint"
}, function (text) {
return _react.default.createElement("p", {
className: "ant-upload-text"
}, text);
})), success && _react.default.createElement(_alert.default, {
message: _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.import.upload.success",
values: {
length: list.length,
title: title || keyName
}
}),
type: "success"
}), error && _react.default.createElement(_alert.default, {
message: errorMessage,
type: "error"
})));
}
}]);
return ImportModal;
}(_react.default.Component)) || _class) || _class) || _class);
exports.default = ImportModal;
function parseCSV(text, lineTerminator, cellTerminator) {
var rows = []; //break the lines apart
var lines = text.split(lineTerminator);
for (var j = 0; j < lines.length; j++) {
var values = [];
if (lines[j] != "") {
//create a table row
//split the rows at the cellTerminator character
var information = lines[j].split(cellTerminator);
for (var k = 0; k < information.length; k++) {
//append the cell to the row
values.push(information[k]);
}
}
rows.push(values);
}
return rows;
}
function genCSV(data, fields) {
var fieldNames = fields.map(function (field) {
return field.title || field.keyName;
});
var rows = [fieldNames];
data.forEach(function (datum) {
var values = [];
fields.forEach(function (field) {
var value = (0, _lodash.get)(datum, field.keyName);
if (field.render) {
value = field.render(value);
}
values.push(value);
});
rows.push(values);
});
var csvContent = 'data:text/csv;charset=utf-8,';
rows.forEach(function (rowArray) {
var row = rowArray.join(',');
csvContent += "".concat(row, "\r\n");
});
return csvContent;
}
function download(fileName, csvContent) {
var encodedUri = encodeURI(csvContent);
var link = document.createElement('a');
link.setAttribute('href', encodedUri);
link.setAttribute('download', "".concat(fileName, ".csv"));
link.innerHTML = '';
document.body && document.body.appendChild(link); // Required for FF
link.click();
}