cspace-ui
Version:
CollectionSpace user interface for browsers
193 lines (158 loc) • 6.55 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _immutable = _interopRequireDefault(require("immutable"));
var _get = _interopRequireDefault(require("lodash/get"));
var _classnames = _interopRequireDefault(require("classnames"));
var _warning = _interopRequireDefault(require("warning"));
var _recordDataHelpers = require("../../helpers/recordDataHelpers");
var _RecordForm = _interopRequireDefault(require("../../../styles/cspace-ui/RecordForm.css"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
function renderTemplate(component, messages, handlers) {
const overrideProps = {};
const type = (0, _get.default)(component, 'type');
if (type) {
const propTypes = type.propTypes;
if (propTypes) {
Object.keys(handlers).forEach(handlerName => {
if (propTypes[handlerName] && !component.props[handlerName]) {
overrideProps[handlerName] = handlers[handlerName];
}
});
}
return _react.default.cloneElement(component, overrideProps, _react.default.Children.map(component.props.children, child => renderTemplate(child, messages, handlers)));
}
return component;
}
const propTypes = {
config: _propTypes.default.object,
recordTypeConfig: _propTypes.default.object,
recordType: _propTypes.default.string.isRequired,
vocabulary: _propTypes.default.string,
csid: _propTypes.default.string,
data: _propTypes.default.instanceOf(_immutable.default.Map),
formName: _propTypes.default.string,
readOnly: _propTypes.default.bool,
onAddInstance: _propTypes.default.func,
onCommit: _propTypes.default.func,
onMoveInstance: _propTypes.default.func,
onRemoveInstance: _propTypes.default.func,
onSortInstances: _propTypes.default.func
};
const defaultProps = {
data: _immutable.default.Map()
};
const childContextTypes = {
config: _propTypes.default.object,
recordData: _propTypes.default.instanceOf(_immutable.default.Map),
recordType: _propTypes.default.string,
recordTypeConfig: _propTypes.default.object,
vocabulary: _propTypes.default.string,
csid: _propTypes.default.string,
readOnly: _propTypes.default.bool
};
class RecordForm extends _react.Component {
getChildContext() {
const {
config,
csid,
data,
recordType,
recordTypeConfig,
vocabulary,
readOnly
} = this.props; // Get the csid from the data. This may differ from the csid in props, for example if a
// urn-style csid was entered in the address bar. We always want to supply the guid-style csid
// in the context.
const dataCsid = (0, _recordDataHelpers.getCsid)(data);
return {
config,
recordType,
recordTypeConfig,
vocabulary,
readOnly,
csid: dataCsid || csid,
recordData: data
};
}
render() {
const {
config,
data,
formName,
readOnly,
recordType,
recordTypeConfig,
onAddInstance,
onCommit,
onMoveInstance,
onRemoveInstance,
onSortInstances
} = this.props;
if (!recordTypeConfig) {
return null;
}
const {
fields,
forms,
messages
} = recordTypeConfig;
const handlers = {
onAddInstance,
onCommit,
onSortInstances,
onMoveInstance,
onRemoveInstance
};
let formTemplate;
if (formName) {
formTemplate = (0, _get.default)(forms, [formName, 'template']);
}
if (!formTemplate) {
// Try to get the configured default form.
const defaultFormName = recordTypeConfig.defaultForm || 'default';
if (defaultFormName) {
formTemplate = (0, _get.default)(forms, [defaultFormName, 'template']);
}
process.env.NODE_ENV !== "production" ? (0, _warning.default)(formTemplate, "No form template found for form name ".concat(formName, " or default form name ").concat(defaultFormName, " in record type ").concat(recordType, ". Check the record type plugin configuration.")) : void 0;
}
if (typeof formTemplate === 'function') {
const result = formTemplate(data, config);
if (!result) {
return null;
}
if (typeof result === 'string') {
// The form template function returned a string. This will be the name of another form
// template to use.
formTemplate = (0, _get.default)(forms, [result, 'template']);
process.env.NODE_ENV !== "production" ? (0, _warning.default)(formTemplate, "No form template found for computed form name ".concat(result, " for form name ").concat(formName, " in record type ").concat(recordType, ". Check the record type plugin configuration.")) : void 0;
} else {
if ((0, _react.isValidElement)(result)) {
// The form template function returned a React element to use.
formTemplate = result;
}
process.env.NODE_ENV !== "production" ? (0, _warning.default)(formTemplate, "The computed form template for form name ".concat(formName, " in record type ").concat(recordType, " did not return a string or a React element. Check the record type plugin configuration.")) : void 0;
}
}
const rootPropertyName = Object.keys(fields)[0];
const formContent = _react.default.cloneElement(formTemplate, {
readOnly,
name: rootPropertyName,
value: data.get(rootPropertyName),
children: _react.default.Children.map(formTemplate.props.children, child => renderTemplate(child, messages, handlers))
});
const className = (0, _classnames.default)(_RecordForm.default.common, "cspace-ui-RecordForm--".concat(recordType));
return _react.default.createElement("div", {
className: className
}, formContent);
}
}
exports.default = RecordForm;
RecordForm.propTypes = propTypes;
RecordForm.defaultProps = defaultProps;
RecordForm.childContextTypes = childContextTypes;