prg-editor
Version:
Data Table and Editor for use with Prg-Form
447 lines (383 loc) • 16.1 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 _Table = require('./Table');
var _Table2 = _interopRequireDefault(_Table);
var _DeleteConfirmator = require('./DeleteConfirmator');
var _DeleteConfirmator2 = _interopRequireDefault(_DeleteConfirmator);
var _AjaxResource = require('../AjaxResource');
var _AjaxResource2 = _interopRequireDefault(_AjaxResource);
var _AjaxErrorMessage = require('./AjaxErrorMessage');
var _AjaxErrorMessage2 = _interopRequireDefault(_AjaxErrorMessage);
var _tablePropTypes = require('./tablePropTypes');
var _Paginator = require('./Paginator');
var _Paginator2 = _interopRequireDefault(_Paginator);
var _TableEditorHeader = require('./TableEditorHeader');
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 TableEditor = function (_Component) {
_inherits(TableEditor, _Component);
function TableEditor(props) {
_classCallCheck(this, TableEditor);
var _this = _possibleConstructorReturn(this, (TableEditor.__proto__ || Object.getPrototypeOf(TableEditor)).call(this, props));
_this.serverRequest = null;
_this.headerForm = null;
_this.errorHandler = null;
_this.state = {
editorOpened: false,
confirmingRemove: false,
loading: true,
data: [],
params: {
offset: 0,
order: 1,
orderBy: null,
limit: props.limit
},
nextOffset: 0,
editData: null,
editId: null,
deleteId: null,
filterChanged: false
};
var defaultOrder = {};
props.colsConfig.some(function (col) {
if (col.orderByDefault && col.orderBy) {
defaultOrder = {
order: col.order,
orderBy: col.orderBy
};
return true;
}
return false;
});
if (typeof props.resource === 'string') {
_this.resource = new _AjaxResource2.default(props.resource);
} else {
_this.resource = props.resource;
}
if (_typeof(props.params) === 'object') {
Object.assign(_this.state.params, defaultOrder, props.params);
} else {
Object.assign(_this.state.params, defaultOrder);
}
return _this;
}
_createClass(TableEditor, [{
key: 'getChildContext',
value: function getChildContext() {
var _this2 = this;
return {
resource: this.resource,
onEditorDidFinish: function onEditorDidFinish(data) {
return _this2.onEditorDidFinish(data);
},
editId: this.state.editId,
editData: this.state.editData,
t: this.props.t
};
}
}, {
key: 'componentDidMount',
value: function componentDidMount() {
this.loadData(this.state.params, true);
}
}, {
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(props) {
if (this.props.params !== props.params) {
this.loadData(props.params);
}
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this.resource.abort();
}
}, {
key: 'onAjaxError',
value: function onAjaxError(error) {
if (error && '' + error.statusText === 'abort') {
return;
}
console.error(error);
this.setState({ loading: false, error: error });
this.errorHandler.showError(error);
}
}, {
key: 'onAjaxSuccess',
value: function onAjaxSuccess(data) {
var params = Object.assign({}, this.state.params, {
offset: data.offset || this.state.params.offset
});
this.setState({
loading: false,
data: data.data,
nextOffset: data.nextOffset,
params: params
});
}
}, {
key: 'onAddButtonClick',
value: function onAddButtonClick() {
this.setState({ editId: null, editData: null, editorOpened: true });
}
}, {
key: 'onEditorDidFinish',
value: function onEditorDidFinish() {
var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
this.setState({ editorOpened: false });
if (data !== null) {
this.requestDataLoad();
}
}
}, {
key: 'onDeleteConfirmationFinished',
value: function onDeleteConfirmationFinished(data) {
this.setState({ confirmingRemove: false });
if (data !== null) {
this.requestDataLoad();
}
}
}, {
key: 'onDeleteConfirmationClosed',
value: function onDeleteConfirmationClosed() {
this.setState({ confirmingRemove: false });
}
}, {
key: 'onHeaderSubmit',
value: function onHeaderSubmit(params) {
this.setState({ filterChanged: true });
this.requestDataLoad(Object.assign({}, params, { page: 0 }));
}
}, {
key: 'requestDataLoad',
value: function requestDataLoad() {
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var overrideParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
var newParams = void 0;
if (overrideParams) {
newParams = params;
} else {
newParams = Object.assign({}, this.state.params, params);
}
if (this.props.onParamsChange !== null) {
this.props.onParamsChange(newParams);
} else {
this.loadData(newParams);
}
}
}, {
key: 'loadData',
value: function loadData() {
var _this3 = this;
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var initial = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
if (!initial) {
this.setState({
loading: true,
params: params,
data: [],
nextOffset: 0
});
}
var getByParams = params;
if (this.props.noPagination) {
getByParams = Object.assign({}, params);
delete getByParams.limit;
delete getByParams.offset;
}
this.resource.getAll(getByParams).then(function (data) {
return _this3.onAjaxSuccess(data);
}).catch(function (err) {
return _this3.onAjaxError(err);
});
}
}, {
key: 'resetHeaderForm',
value: function resetHeaderForm() {
var _state$params = this.state.params,
order = _state$params.order,
orderBy = _state$params.orderBy;
this.setState({ filterChanged: false });
this.requestDataLoad({ offset: 0, order: order, orderBy: orderBy, limit: this.props.limit }, true);
}
}, {
key: 'edit',
value: function edit(idOrData) {
var editId = void 0;
var editData = null;
if ((typeof idOrData === 'undefined' ? 'undefined' : _typeof(idOrData)) === 'object') {
editId = this.resource.getId(idOrData);
editData = idOrData;
} else {
editId = idOrData;
}
this.setState({ editId: editId, editData: editData, editorOpened: true });
}
}, {
key: 'delete',
value: function _delete(idOrData) {
var deleteId = (typeof idOrData === 'undefined' ? 'undefined' : _typeof(idOrData)) === 'object' ? this.resource.getId(idOrData) : idOrData;
this.setState({ deleteId: deleteId, confirmingRemove: true });
}
}, {
key: 'renderEditor',
value: function renderEditor() {
return (0, _TableEditorHeader.getFormChildren)(this.props.children);
}
}, {
key: 'renderRemovalConfirmation',
value: function renderRemovalConfirmation() {
var _this4 = this;
return _react2.default.createElement(_DeleteConfirmator2.default, {
id: this.state.deleteId,
resource: this.props.resource,
t: this.props.t,
onDeleteDidFinish: function onDeleteDidFinish(data) {
return _this4.onDeleteConfirmationFinished(data);
},
deleteErrorMessage: this.props.deleteErrorMessage
});
}
}, {
key: 'renderError',
value: function renderError() {
var _this5 = this;
return _react2.default.createElement(_AjaxErrorMessage2.default, {
ref: function ref(c) {
_this5.errorHandler = c;
},
message: this.props.loadingErrorMessage,
t: this.props.t,
onTryAgain: function onTryAgain() {
return _this5.requestDataLoad();
}
});
}
}, {
key: 'renderPaginator',
value: function renderPaginator() {
var _this6 = this;
if (this.props.noPagination) {
return null;
}
var _state$params2 = this.state.params,
offset = _state$params2.offset,
limit = _state$params2.limit;
var page = offset / limit;
return _react2.default.createElement(_Paginator2.default, {
page: page,
nextPage: this.state.nextOffset ? page + 1 : 0,
onPageChange: function onPageChange(p) {
return _this6.requestDataLoad({ offset: p >= 0 ? p * limit : -1 });
}
});
}
}, {
key: 'renderTable',
value: function renderTable() {
var _this7 = this;
var _props = this.props,
t = _props.t,
disableAdd = _props.disableAdd,
colsConfig = _props.colsConfig;
var _state = this.state,
filterChanged = _state.filterChanged,
params = _state.params,
loading = _state.loading,
data = _state.data;
return _react2.default.createElement(
'div',
null,
_react2.default.createElement(
_TableEditorHeader.TableEditorHeader,
{
t: t,
disableAdd: disableAdd,
filterChanged: filterChanged,
onAddButtonClick: function onAddButtonClick() {
return _this7.onAddButtonClick();
},
onResetHeaderForm: function onResetHeaderForm() {
return _this7.resetHeaderForm();
},
onHeaderSubmit: function onHeaderSubmit() {
return _this7.onHeaderSubmit.apply(_this7, arguments);
},
params: params
},
this.props.children
),
this.renderPaginator(),
_react2.default.createElement(_Table2.default, {
data: data,
colsConfig: colsConfig,
loading: loading,
order: params.order,
orderBy: params.orderBy,
onOrderChange: function onOrderChange(orderBy, order) {
return _this7.requestDataLoad({ order: order, orderBy: orderBy });
}
}),
this.renderPaginator()
);
}
}, {
key: 'render',
value: function render() {
return _react2.default.createElement(
'div',
{ className: 'container is-fluid is-fullwidth is-self-top' },
this.renderError(),
this.renderTable(),
this.state.editorOpened ? this.renderEditor() : null,
this.state.confirmingRemove ? this.renderRemovalConfirmation() : null
);
}
}]);
return TableEditor;
}(_react.Component);
TableEditor.propTypes = {
children: _propTypes2.default.oneOfType([_propTypes2.default.any]),
colsConfig: _tablePropTypes.ColsConfig.isRequired,
params: _propTypes2.default.objectOf(_propTypes2.default.any),
resource: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.object]).isRequired,
t: _propTypes2.default.func,
loadingErrorMessage: _tablePropTypes.StringOrFunc,
deleteErrorMessage: _tablePropTypes.StringOrFunc,
limit: _propTypes2.default.number,
disableAdd: _propTypes2.default.bool,
onParamsChange: _propTypes2.default.func,
noPagination: _propTypes2.default.bool
};
TableEditor.childContextTypes = {
resource: _propTypes2.default.object,
onEditorDidFinish: _propTypes2.default.func.isRequired,
editId: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),
editData: _propTypes2.default.object,
t: _propTypes2.default.func
};
TableEditor.defaultProps = {
children: null,
params: null,
t: function t(a) {
return a;
},
loadingErrorMessage: 'Loading failed',
deleteErrorMessage: 'Delete failed',
disableAdd: false,
limit: 20,
onParamsChange: null,
noPagination: false
};
exports.default = TableEditor;