prg-editor
Version:
Data Table and Editor for use with Prg-Form
367 lines (317 loc) • 13.4 kB
JavaScript
'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; };
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 _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _prgForm = require('prg-form');
var _Modal = require('./Modal');
var _Modal2 = _interopRequireDefault(_Modal);
var _AjaxErrorMessage = require('./AjaxErrorMessage');
var _AjaxErrorMessage2 = _interopRequireDefault(_AjaxErrorMessage);
var _tablePropTypes = require('./tablePropTypes');
var _AjaxResource = require('../AjaxResource');
var _AjaxResource2 = _interopRequireDefault(_AjaxResource);
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 Editor = function (_Component) {
_inherits(Editor, _Component);
function Editor(props, context) {
_classCallCheck(this, Editor);
var _this = _possibleConstructorReturn(this, (Editor.__proto__ || Object.getPrototypeOf(Editor)).call(this, props, context));
_this.errorHandler = null;
_this.t = props.t || context.t || function (w) {
return w;
};
_this.resource = props.resource || context.resource;
if (!_this.resource) {
throw new Error('');
} else if (typeof _this.resource === 'string') {
_this.resource = new _AjaxResource2.default(_this.resource);
}
var id = props.id || context.editId;
var loadedData = props.data || context.editData;
_this.state = {
id: id,
loadedData: loadedData,
loading: !loadedData && id,
values: id && loadedData ? loadedData : {},
loadingError: null
};
return _this;
}
_createClass(Editor, [{
key: 'componentWillMount',
value: function componentWillMount() {
if (this.state.loading) {
this.loadData(true);
}
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this.resource.abort();
}
}, {
key: 'onDataLoad',
value: function onDataLoad(data) {
this.setState({
loading: false,
id: this.resource.getId(data),
values: data,
loadedData: data,
loadingError: null
});
}
}, {
key: 'onDataLoadError',
value: function onDataLoadError(e) {
this.setState({
loading: false,
loadingError: e
});
}
}, {
key: 'onSubmit',
value: function onSubmit(formData) {
var _this2 = this;
var promise = void 0;
if (this.state.id) {
promise = this.resource.update(this.state.id, formData);
} else {
promise = this.resource.create(formData);
}
promise.then(function (res) {
return _this2.onAjaxSuccess(res);
}).catch(function (err) {
return _this2.onAjaxError(err);
});
}
}, {
key: 'onValidationFailed',
value: function onValidationFailed() {
this.setState({ loading: false });
}
}, {
key: 'onBeforeValidate',
value: function onBeforeValidate(formData) {
this.setState({ loading: true, values: formData });
}
}, {
key: 'onAjaxError',
value: function onAjaxError(error) {
this.setState({ loading: false });
if (this.errorHandler) {
this.errorHandler.showError(error);
}
if (this.props.onSubmitDidFail) {
this.props.onSubmitDidFail(error);
}
}
}, {
key: 'onAjaxSuccess',
value: function onAjaxSuccess(data) {
this.serverRequest = null;
var stay = true;
if (this.context.onEditorDidFinish) {
stay = this.context.onEditorDidFinish(data);
}
if (this.props.onSubmitDidFinish) {
stay = this.props.onSubmitDidFinish(data);
}
var id = this.resource.getId(data);
if (stay) {
this.setState({ loading: false, loadedData: data, values: data, id: id });
}
}
}, {
key: 'onClosed',
value: function onClosed() {
if (this.context.onEditorDidFinish) {
this.context.onEditorDidFinish(null);
}
if (this.props.onClosed) {
this.props.onClosed(null);
}
}
}, {
key: 'getContext',
value: function getContext() {
var context = this.props.context;
if (context && (typeof context === 'undefined' ? 'undefined' : _typeof(context)) === 'object') {
context = this.state.id ? context.update : context.create;
}
return context;
}
}, {
key: 'loadData',
value: function loadData() {
var _this3 = this;
var initial = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
if (!initial) {
this.setState({ loadingError: null, loading: true });
}
this.resource.getById(this.state.id).then(function (data) {
return _this3.onDataLoad(data);
}).catch(function (e) {
return _this3.onDataLoadError(e);
});
}
}, {
key: 'renderError',
value: function renderError() {
var _this4 = this;
return _react2.default.createElement(_AjaxErrorMessage2.default, {
ref: function ref(c) {
_this4.errorHandler = c;
},
message: this.props.updateErrorMessage,
t: this.t
});
}
}, {
key: 'render',
value: function render() {
var _this5 = this;
var content = void 0;
var _state = this.state,
id = _state.id,
loadingError = _state.loadingError;
if (loadingError) {
content = _react2.default.createElement(_AjaxErrorMessage2.default, {
ref: function ref(c) {
_this5.errorHandler = c;
},
message: this.props.loadingErrorMessage,
error: loadingError,
onTryAgain: function onTryAgain() {
return _this5.loadData();
},
t: this.t
});
} else if (this.state.loading) {
content = _react2.default.createElement(_prgForm.Spinner, null);
} else if (this.props.modalTitle || this.context.onEditorDidFinish) {
var title = this.props.modalTitle;
if (!title || typeof title === 'boolean') {
title = id ? this.t('Edit item') : this.t('New item');
}
content = _react2.default.createElement(
_Modal2.default,
{
onClosed: function onClosed() {
return _this5.onClosed();
},
customBody: true,
title: title
},
_react2.default.createElement(
'section',
{ className: 'modal-card-body' },
this.renderError(),
this.props.children
),
_react2.default.createElement(
'footer',
{ className: 'modal-card-foot' },
_react2.default.createElement(
'button',
{
className: 'button is-primary',
formNoValidate: true,
type: 'submit'
},
this.t('Submit')
)
)
);
} else {
content = _react2.default.createElement(
'span',
null,
this.renderError(),
this.props.children,
_react2.default.createElement(
'button',
{
className: 'button is-primary',
formNoValidate: true,
type: 'submit'
},
this.t('Submit')
)
);
}
return _react2.default.createElement(
_prgForm.ValidatorForm,
{
onSubmit: function onSubmit() {
return _this5.onSubmit.apply(_this5, arguments);
},
onBeforeValidate: function onBeforeValidate() {
return _this5.onBeforeValidate.apply(_this5, arguments);
},
onValidationFailed: function onValidationFailed() {
return _this5.onValidationFailed.apply(_this5, arguments);
},
validator: this.props.validator,
className: 'form-editor',
validatorContext: this.getContext(),
t: this.t,
values: this.state.values
},
content
);
}
}]);
return Editor;
}(_react.Component);
Editor.propTypes = {
children: _propTypes2.default.oneOfType([_propTypes2.default.element, _propTypes2.default.arrayOf(_propTypes2.default.any)]),
onSubmitDidFinish: _propTypes2.default.func,
onSubmitDidFail: _propTypes2.default.func,
id: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),
data: _propTypes2.default.objectOf(_propTypes2.default.any),
resource: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.object]),
t: _propTypes2.default.func,
updateErrorMessage: _tablePropTypes.StringOrFunc,
loadingErrorMessage: _tablePropTypes.StringOrFunc,
validator: _propTypes2.default.objectOf(_propTypes2.default.any).isRequired,
modalTitle: _propTypes2.default.string,
onClosed: _propTypes2.default.func,
context: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.shape({
create: _propTypes2.default.string,
update: _propTypes2.default.string
})])
};
Editor.defaultProps = {
children: null,
onSubmitDidFinish: null,
onSubmitDidFail: null,
id: null,
data: null,
loadingErrorMessage: 'Loading failed',
updateErrorMessage: 'Submit failed.',
context: {
create: 'create',
update: 'update'
},
resource: null,
modalTitle: null,
onClosed: function onClosed() {},
t: null
};
Editor.contextTypes = {
resource: _propTypes2.default.object,
onEditorDidFinish: _propTypes2.default.func,
editId: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),
editData: _propTypes2.default.object,
t: _propTypes2.default.func
};
exports.default = Editor;