admin-on-rest-fr05t1k
Version:
A frontend Framework for building admin applications on top of REST services, using ES6, React and Material UI
237 lines (190 loc) • 8.39 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Edit = undefined;
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactRedux = require('react-redux');
var _Card = require('material-ui/Card');
var _compose = require('recompose/compose');
var _compose2 = _interopRequireDefault(_compose);
var _inflection = require('inflection');
var _inflection2 = _interopRequireDefault(_inflection);
var _ViewTitle = require('../layout/ViewTitle');
var _ViewTitle2 = _interopRequireDefault(_ViewTitle);
var _Title = require('../layout/Title');
var _Title2 = _interopRequireDefault(_Title);
var _dataActions = require('../../actions/dataActions');
var _EditActions = require('./EditActions');
var _EditActions2 = _interopRequireDefault(_EditActions);
var _translate = require('../../i18n/translate');
var _translate2 = _interopRequireDefault(_translate);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Turns a children data structure (either single child or array of children) into an array.
* We can't use React.Children.toArray as it loses references.
*/
var arrayizeChildren = function arrayizeChildren(children) {
return Array.isArray(children) ? children : [children];
};
var Edit = exports.Edit = function (_Component) {
(0, _inherits3.default)(Edit, _Component);
function Edit(props) {
(0, _classCallCheck3.default)(this, Edit);
var _this = (0, _possibleConstructorReturn3.default)(this, (Edit.__proto__ || Object.getPrototypeOf(Edit)).call(this, props));
_this.refresh = function (event) {
event.stopPropagation();
_this.fullRefresh = true;
_this.updateData();
};
_this.state = {
key: 0,
record: props.data
};
_this.handleSubmit = _this.handleSubmit.bind(_this);
return _this;
}
(0, _createClass3.default)(Edit, [{
key: 'componentDidMount',
value: function componentDidMount() {
this.updateData();
}
}, {
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
if (this.props.data !== nextProps.data) {
this.setState({ record: nextProps.data }); // FIXME: erases user entry when fetch response arrives late
if (this.fullRefresh) {
this.fullRefresh = false;
this.setState({ key: this.state.key + 1 });
}
}
if (this.props.id !== nextProps.id) {
this.updateData(nextProps.resource, nextProps.id);
}
}
// FIXME Seems that the cloneElement in CrudRoute slices the children array, which makes this necessary to avoid rerenders
}, {
key: 'shouldComponentUpdate',
value: function shouldComponentUpdate(nextProps) {
if (nextProps.isLoading !== this.props.isLoading) {
return true;
}
var currentChildren = arrayizeChildren(this.props.children);
var newChildren = arrayizeChildren(nextProps.children);
return newChildren.every(function (child, index) {
return child === currentChildren[index];
});
}
}, {
key: 'getBasePath',
value: function getBasePath() {
var location = this.props.location;
return location.pathname.split('/').slice(0, -1).join('/');
}
}, {
key: 'updateData',
value: function updateData() {
var resource = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props.resource;
var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.props.id;
this.props.crudGetOne(resource, id, this.getBasePath());
}
}, {
key: 'handleSubmit',
value: function handleSubmit(record) {
this.props.crudUpdate(this.props.resource, this.props.id, record, this.props.data, this.getBasePath());
}
}, {
key: 'render',
value: function render() {
var _props = this.props,
_props$actions = _props.actions,
actions = _props$actions === undefined ? _react2.default.createElement(_EditActions2.default, null) : _props$actions,
children = _props.children,
data = _props.data,
hasDelete = _props.hasDelete,
hasShow = _props.hasShow,
id = _props.id,
isLoading = _props.isLoading,
resource = _props.resource,
title = _props.title,
translate = _props.translate;
var key = this.state.key;
var basePath = this.getBasePath();
var resourceName = translate('resources.' + resource + '.name', {
smart_count: 1,
_: _inflection2.default.humanize(_inflection2.default.singularize(resource))
});
var defaultTitle = translate('aor.page.edit', {
name: '' + resourceName,
id: id,
data: data
});
var titleElement = data ? _react2.default.createElement(_Title2.default, { title: title, record: data, defaultTitle: defaultTitle }) : '';
return _react2.default.createElement(
'div',
{ className: 'edit-page' },
_react2.default.createElement(
_Card.Card,
{ style: { opacity: isLoading ? 0.8 : 1 }, key: key },
actions && _react2.default.cloneElement(actions, {
basePath: basePath,
data: data,
hasDelete: hasDelete,
hasShow: hasShow,
refresh: this.refresh,
resource: resource
}),
_react2.default.createElement(_ViewTitle2.default, { title: titleElement }),
data && _react2.default.cloneElement(children, {
onSubmit: this.handleSubmit,
resource: resource,
basePath: basePath,
record: data,
translate: translate
}),
!data && _react2.default.createElement(
_Card.CardText,
null,
'\xA0'
)
)
);
}
}]);
return Edit;
}(_react.Component);
Edit.propTypes = {
actions: _react.PropTypes.element,
children: _react.PropTypes.element.isRequired,
crudGetOne: _react.PropTypes.func.isRequired,
crudUpdate: _react.PropTypes.func.isRequired,
data: _react.PropTypes.object,
hasDelete: _react.PropTypes.bool,
hasShow: _react.PropTypes.bool,
id: _react.PropTypes.string.isRequired,
isLoading: _react.PropTypes.bool.isRequired,
location: _react.PropTypes.object.isRequired,
match: _react.PropTypes.object.isRequired,
resource: _react.PropTypes.string.isRequired,
title: _react.PropTypes.any,
translate: _react.PropTypes.func
};
function mapStateToProps(state, props) {
return {
id: props.match.params.id,
data: state.admin[props.resource].data[props.match.params.id],
isLoading: state.admin.loading > 0
};
}
var enhance = (0, _compose2.default)((0, _reactRedux.connect)(mapStateToProps, { crudGetOne: _dataActions.crudGetOne, crudUpdate: _dataActions.crudUpdate }), _translate2.default);
exports.default = enhance(Edit);