cspace-ui
Version:
CollectionSpace user interface for browsers
204 lines (198 loc) • 8.2 kB
JavaScript
;
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 _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function renderTemplate(component, messages, handlers) {
const overrideProps = {};
const type = (0, _get.default)(component, 'type');
if (type) {
// FIXME: Do this without looking at propTypes, so that propTypes may be removed in the
// production build.
// eslint-disable-next-line react/forbid-foreign-prop-types
const {
propTypes
} = type;
if (propTypes) {
Object.keys(handlers).forEach(handlerName => {
if (propTypes[handlerName] && !component.props[handlerName]) {
overrideProps[handlerName] = handlers[handlerName];
}
});
}
return /*#__PURE__*/_react.default.cloneElement(component, overrideProps, _react.default.Children.map(component.props.children, child => renderTemplate(child, messages, handlers)));
}
return component;
}
const propTypes = {
config: _propTypes.default.shape({
recordTypes: _propTypes.default.object
}),
recordTypeConfig: _propTypes.default.shape({
defaultForm: _propTypes.default.string,
fields: _propTypes.default.object,
forms: _propTypes.default.object,
messages: _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,
roleNames: _propTypes.default.instanceOf(_immutable.default.List),
subrecordData: _propTypes.default.instanceOf(_immutable.default.Map),
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.shape({
recordTypes: _propTypes.default.object
}),
formName: _propTypes.default.string,
recordData: _propTypes.default.instanceOf(_immutable.default.Map),
recordType: _propTypes.default.string,
recordTypeConfig: _propTypes.default.PropTypes.shape({
fields: _propTypes.default.object
}),
roleNames: _propTypes.default.instanceOf(_immutable.default.List),
subrecordData: _propTypes.default.instanceOf(_immutable.default.Map),
vocabulary: _propTypes.default.string,
csid: _propTypes.default.string,
readOnly: _propTypes.default.bool
};
class RecordForm extends _react.PureComponent {
getChildContext() {
const {
config,
csid,
data,
formName,
recordType,
recordTypeConfig,
roleNames,
subrecordData,
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,
formName,
readOnly,
recordType,
recordTypeConfig,
roleNames,
subrecordData,
vocabulary,
csid: dataCsid || csid,
recordData: data
};
}
render() {
const {
config,
csid,
data,
formName,
readOnly,
recordType,
recordTypeConfig,
onAddInstance,
onCommit,
onMoveInstance,
onRemoveInstance,
onSortInstances
} = this.props;
if (!recordTypeConfig) {
return null;
}
const {
fields,
forms,
messages
} = recordTypeConfig;
const handlers = {
onAddInstance: (path, position) => {
onAddInstance(recordTypeConfig, csid, path, position);
},
onCommit: (path, value) => {
onCommit(recordTypeConfig, csid, path, value);
},
onSortInstances: (path, byField) => {
onSortInstances(config, recordTypeConfig, csid, path, byField);
},
onMoveInstance: (path, newPosition) => {
onMoveInstance(recordTypeConfig, csid, path, newPosition);
},
onRemoveInstance: path => {
onRemoveInstance(recordTypeConfig, csid, path);
}
};
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 ${formName} or default form name ${defaultFormName} in record type ${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 ${result} for form name ${formName} in record type ${recordType}. Check the record type plugin configuration.`) : void 0;
} else {
if ( /*#__PURE__*/(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 ${formName} in record type ${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 = /*#__PURE__*/_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--${recordType}`);
return /*#__PURE__*/_react.default.createElement("div", {
className: className
}, formContent);
}
}
exports.default = RecordForm;
RecordForm.propTypes = propTypes;
RecordForm.defaultProps = defaultProps;
RecordForm.childContextTypes = childContextTypes;