canner
Version:
Build CMS in few lines of code for different data sources
338 lines (289 loc) • 11.8 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/button/style");
var _button = _interopRequireDefault(require("antd/lib/button"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
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/select/style");
var _select = _interopRequireDefault(require("antd/lib/select"));
require("antd/lib/radio/style");
var _radio = _interopRequireDefault(require("antd/lib/radio"));
require("antd/lib/form/style");
var _form = _interopRequireDefault(require("antd/lib/form"));
var _react = _interopRequireDefault(require("react"));
var _antd = require("antd");
var _get = _interopRequireDefault(require("lodash/get"));
var _reactApollo = require("react-apollo");
var _reactIntl = require("react-intl");
var _graphqlTag = _interopRequireDefault(require("graphql-tag"));
var _dec, _class;
function _templateObject() {
var data = (0, _taggedTemplateLiteral2.default)(["", ""]);
_templateObject = function _templateObject() {
return data;
};
return data;
}
var FormItem = _form.default.Item;
var RadioGroup = _radio.default.Group;
var Option = _select.default.Option;
var ALL = 'ALL';
var THIS_PAGE = 'THIS_PAGE';
var SELECTED = 'SElECTED';
var DOWNLOAD = 'DOWNLOAD'; // $FlowFixMe
var ExportModal = (_dec = _form.default.create(), (0, _reactIntl.injectIntl)(_class = (0, _reactApollo.withApollo)(_class = _dec(_class =
/*#__PURE__*/
function (_React$Component) {
(0, _inherits2.default)(ExportModal, _React$Component);
function ExportModal() {
var _getPrototypeOf2;
var _this;
(0, _classCallCheck2.default)(this, ExportModal);
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)(ExportModal)).call.apply(_getPrototypeOf2, [this].concat(args)));
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "state", {
downloading: false
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleSubmit", function (e) {
e.preventDefault();
var _this$props = _this.props,
form = _this$props.form,
value = _this$props.value,
selectedValue = _this$props.selectedValue,
fileName = _this$props.fileName,
triggerModal = _this$props.triggerModal,
fields = _this$props.fields,
client = _this$props.client,
query = _this$props.query,
keyName = _this$props.keyName;
form.validateFields(function (err, values) {
if (!err) {
var exportData = values.exportData,
exportFieldKeys = values.exportFieldKeys,
exportWay = values.exportWay;
var getData = Promise.resolve([]);
if (exportData === ALL) {
// have to fetch data without pagination data
var queries = query.getQueries([keyName]).args;
var variables = query.getVairables();
delete variables[queries.first.substr(1)];
delete variables[queries.after.substr(1)];
delete variables[queries.last.substr(1)];
delete variables[queries.before.substr(1)];
getData = client.query({
query: (0, _graphqlTag.default)(_templateObject(), query.toGQL(keyName)),
// remove pagination field
variables: variables
}).then(function (result) {
return result.data[keyName].edges.map(function (edge) {
return edge.node;
});
});
} else if (exportData === THIS_PAGE) {
getData = Promise.resolve(value);
} else if (exportData === SELECTED) {
getData = Promise.resolve(selectedValue);
}
var fieldsData = fields.filter(function (field) {
return exportFieldKeys.find(function (key) {
return key === field.keyName;
});
});
if (exportWay === DOWNLOAD) {
_this.setState({
downloading: true
});
getData.then(function (data) {
var csv = genCSV(data, fieldsData);
download(fileName, csv);
}).then(function () {
_this.setState({
downloading: false
}, triggerModal);
});
} else {// not support other exportWay for now
}
}
});
});
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)), "handleCancel", function () {
_this.props.triggerModal();
});
return _this;
}
(0, _createClass2.default)(ExportModal, [{
key: "render",
value: function render() {
var _this$props2 = this.props,
selectedValue = _this$props2.selectedValue,
visible = _this$props2.visible,
fields = _this$props2.fields,
getFieldDecorator = _this$props2.form.getFieldDecorator,
title = _this$props2.title,
intl = _this$props2.intl;
var downloading = this.state.downloading;
var formItemLayout = {
labelCol: {
xs: {
span: 24
},
sm: {
span: 5
}
},
wrapperCol: {
xs: {
span: 24
},
sm: {
span: 12
}
}
};
return _react.default.createElement(_modal.default, {
title: _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.export.modal.title"
}),
visible: visible,
footer: null,
closable: true,
maskClosable: true,
onCancel: this.handleCancel
}, _react.default.createElement(_form.default, {
onSubmit: this.handleSubmit
}, _react.default.createElement(FormItem, (0, _extends2.default)({}, formItemLayout, {
label: _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.export.data.label"
})
}), getFieldDecorator('exportData', {
initialValue: selectedValue.length ? 'SELECTED' : 'ALL'
})(_react.default.createElement(RadioGroup, null, _react.default.createElement(_radio.default, {
value: ALL,
"data-testid": "actions-export-data-all"
}, _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.export.data.all"
}), title), _react.default.createElement(_radio.default, {
value: THIS_PAGE,
"data-testid": "actions-export-data-this-page"
}, _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.export.data.thisPage"
})), _react.default.createElement(_radio.default, {
value: "SELECTED",
disabled: !selectedValue.length,
"data-testid": "actions-export-data-selected"
}, _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.export.data.selected",
values: {
length: selectedValue.length,
title: title
}
}))))), _react.default.createElement(FormItem, (0, _extends2.default)({}, formItemLayout, {
label: _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.export.way.label"
})
}), getFieldDecorator('exportWay', {
initialValue: DOWNLOAD
})(_react.default.createElement(RadioGroup, {
disabled: true
}, _react.default.createElement(_radio.default, {
value: DOWNLOAD,
"data-testid": "actions-export-way-csv"
}, _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.export.way.csv"
}))))), _react.default.createElement(FormItem, (0, _extends2.default)({}, formItemLayout, {
label: _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.export.fields.label"
})
}), getFieldDecorator('exportFieldKeys', {
initialValue: fields.map(function (field) {
return field.keyName;
})
})(_react.default.createElement(_select.default, {
mode: "multiple",
placeholder: intl.formatMessage({
id: "actions.export.fields.placeholder"
}),
"data-testid": "actions-export-fields-select"
}, fields.map(function (field, index) {
return _react.default.createElement(Option, {
"data-testid": "actions-export-fields-option-".concat(index),
value: field.keyName,
key: field.keyName
}, field.title || field.keyName);
})))), _react.default.createElement(FormItem, {
wrapperCol: {
span: 12,
offset: 5
}
}, _react.default.createElement(_button.default, {
"data-testid": "actions-export-cancel-button",
htmlType: "button",
onClick: this.handleCancel
}, _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.export.modal.cancelButton"
})), _react.default.createElement(_button.default, {
"data-testid": "actions-export-confirm-button",
loading: downloading,
type: "primary",
htmlType: "submit",
style: {
marginLeft: 24
}
}, _react.default.createElement(_reactIntl.FormattedMessage, {
id: "actions.export.modal.confirmButton"
})))));
}
}]);
return ExportModal;
}(_react.default.Component)) || _class) || _class) || _class);
exports.default = ExportModal;
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, _get.default)(datum, field.keyName);
if (field.render) {
value = field.render(value);
}
if (Array.isArray(value)) {
value = value.join(';');
}
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();
}