UNPKG

react-jsonschema-form-semantic

Version:

A simple React component capable of building HTML forms out of a JSON schema. Uses React Semantic UI (css not bundled)

373 lines (312 loc) 11.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of"); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); 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 _extends2 = require("babel-runtime/helpers/extends"); var _extends3 = _interopRequireDefault(_extends2); var _objectWithoutProperties2 = require("babel-runtime/helpers/objectWithoutProperties"); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); var _keys = require("babel-runtime/core-js/object/keys"); var _keys2 = _interopRequireDefault(_keys); var _react = require("react"); var _react2 = _interopRequireDefault(_react); var _propTypes = require("prop-types"); var _propTypes2 = _interopRequireDefault(_propTypes); var _utils = require("../../utils"); var _UnsupportedField = require("./UnsupportedField"); var _UnsupportedField2 = _interopRequireDefault(_UnsupportedField); var _semanticUiReact = require("semantic-ui-react"); var _StringField = require("./StringField"); var _StringField2 = _interopRequireDefault(_StringField); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var REQUIRED_FIELD_SYMBOL = "*"; var COMPONENT_TYPES = { array: "ArrayField", boolean: "BooleanField", integer: "NumberField", number: "NumberField", object: "ObjectField", string: "StringField" }; function getFieldComponent(schema, uiSchema, idSchema, fields) { var field = uiSchema["ui:field"]; if (typeof field === "function") { return field; } if (typeof field === "string" && field in fields) { return fields[field]; } var componentName = COMPONENT_TYPES[(0, _utils.getSchemaType)(schema)]; return componentName in fields ? fields[componentName] : function () { return _react2.default.createElement(_UnsupportedField2.default, { schema: schema, idSchema: idSchema, reason: "Unknown field type " + schema.type }); }; } function Label(props) { var label = props.label, required = props.required, id = props.id; if (!label) { // See #312: Ensure compatibility with old versions of React. return _react2.default.createElement("div", null); } return _react2.default.createElement( "div", null, _react2.default.createElement( _semanticUiReact.Header, { subheader: true, as: "h5", className: "control-label", htmlFor: id }, label, required && _react2.default.createElement( "span", { className: "required" }, REQUIRED_FIELD_SYMBOL ) ) ); } function Help(props) { var help = props.help; if (!help) { // See #312: Ensure compatibility with old versions of React. return _react2.default.createElement("div", null); } if (typeof help === "string") { return _react2.default.createElement( "p", { className: "help-block" }, help ); } return _react2.default.createElement( "div", { className: "help-block" }, help ); } function ErrorList(props) { var _props$errors = props.errors, errors = _props$errors === undefined ? [] : _props$errors; if (errors.length === 0) { return _react2.default.createElement("div", null); } return _react2.default.createElement( _semanticUiReact.Message, { error: true }, _react2.default.createElement( _semanticUiReact.Message.List, { className: "error-detail bs-callout bs-callout-info" }, errors.map(function (error, index) { return _react2.default.createElement( _semanticUiReact.Message.Item, { key: index }, error ); }) ) ); } function DefaultTemplate(props) { var id = props.id, classNames = props.classNames, label = props.label, children = props.children, errors = props.errors, help = props.help, description = props.description, hidden = props.hidden, required = props.required, displayLabel = props.displayLabel; if (hidden) { return children; } return _react2.default.createElement( _semanticUiReact.Form.Group, { grouped: true, className: classNames }, displayLabel && children.type !== _StringField2.default && _react2.default.createElement(Label, { label: label, required: required, id: id }), displayLabel && description ? description : null, children, errors, help ); } if (process.env.NODE_ENV !== "production") { DefaultTemplate.propTypes = { id: _propTypes2.default.string, classNames: _propTypes2.default.string, label: _propTypes2.default.string, children: _propTypes2.default.node.isRequired, errors: _propTypes2.default.element, rawErrors: _propTypes2.default.arrayOf(_propTypes2.default.string), help: _propTypes2.default.element, rawHelp: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.element]), description: _propTypes2.default.element, rawDescription: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.element]), hidden: _propTypes2.default.bool, required: _propTypes2.default.bool, readonly: _propTypes2.default.bool, displayLabel: _propTypes2.default.bool, fields: _propTypes2.default.object, formContext: _propTypes2.default.object }; } DefaultTemplate.defaultProps = { hidden: false, readonly: false, required: false, displayLabel: true }; function SchemaFieldRender(props) { var uiSchema = props.uiSchema, formData = props.formData, errorSchema = props.errorSchema, idPrefix = props.idPrefix, name = props.name, required = props.required, _props$registry = props.registry, registry = _props$registry === undefined ? (0, _utils.getDefaultRegistry)() : _props$registry; var definitions = registry.definitions, fields = registry.fields, formContext = registry.formContext, _registry$FieldTempla = registry.FieldTemplate, FieldTemplate = _registry$FieldTempla === undefined ? DefaultTemplate : _registry$FieldTempla; var idSchema = props.idSchema; var schema = (0, _utils.retrieveSchema)(props.schema, definitions, formData); idSchema = (0, _utils.mergeObjects)((0, _utils.toIdSchema)(schema, null, definitions, formData, idPrefix), idSchema); var FieldComponent = getFieldComponent(schema, uiSchema, idSchema, fields); var DescriptionField = fields.DescriptionField; var disabled = Boolean(props.disabled || uiSchema["ui:disabled"]); var readonly = Boolean(props.readonly || uiSchema["ui:readonly"]); var autofocus = Boolean(props.autofocus || uiSchema["ui:autofocus"]); if ((0, _keys2.default)(schema).length === 0) { // See #312: Ensure compatibility with old versions of React. return _react2.default.createElement("div", null); } var uiOptions = (0, _utils.getUiOptions)(uiSchema); var _uiOptions$label = uiOptions.label, displayLabel = _uiOptions$label === undefined ? true : _uiOptions$label; if (schema.type === "array") { displayLabel = (0, _utils.isMultiSelect)(schema, definitions) || (0, _utils.isFilesArray)(schema, uiSchema, definitions); } if (schema.type === "object") { displayLabel = false; } if (schema.type === "boolean" && !uiSchema["ui:widget"]) { displayLabel = false; } if (uiSchema["ui:field"]) { displayLabel = false; } var __errors = errorSchema.__errors, fieldErrorSchema = (0, _objectWithoutProperties3.default)(errorSchema, ["__errors"]); // See #439: uiSchema: Don't pass consumed class names to child components var field = _react2.default.createElement(FieldComponent, (0, _extends3.default)({}, props, { idSchema: idSchema, schema: schema, uiSchema: (0, _extends3.default)({}, uiSchema, { classNames: undefined }), disabled: disabled, readonly: readonly, autofocus: autofocus, errorSchema: fieldErrorSchema, formContext: formContext, rawErrors: __errors })); var type = schema.type; var id = idSchema.$id; var label = uiSchema["ui:title"] || props.schema.title || schema.title || name; var description = uiSchema["ui:description"] || props.schema.description || schema.description; var errors = __errors; var help = uiSchema["ui:help"]; var hidden = uiSchema["ui:widget"] === "hidden"; var classNames = ["form-group", "field", "field-" + type, errors && errors.length > 0 ? "field-error has-error has-danger" : "", uiSchema.classNames].join(" ").trim(); var fieldProps = { description: _react2.default.createElement(DescriptionField, { id: id + "__description", description: description, formContext: formContext }), rawDescription: description, help: _react2.default.createElement(Help, { help: help }), rawHelp: typeof help === "string" ? help : undefined, errors: _react2.default.createElement(ErrorList, { errors: errors }), rawErrors: errors, id: id, label: label, hidden: hidden, required: required, disabled: disabled, readonly: readonly, displayLabel: displayLabel, classNames: classNames, formContext: formContext, fields: fields, schema: schema, uiSchema: uiSchema }; return _react2.default.createElement( FieldTemplate, fieldProps, field ); } var SchemaField = function (_React$Component) { (0, _inherits3.default)(SchemaField, _React$Component); function SchemaField() { (0, _classCallCheck3.default)(this, SchemaField); return (0, _possibleConstructorReturn3.default)(this, (SchemaField.__proto__ || (0, _getPrototypeOf2.default)(SchemaField)).apply(this, arguments)); } (0, _createClass3.default)(SchemaField, [{ key: "shouldComponentUpdate", value: function shouldComponentUpdate(nextProps, nextState) { // if schemas are equal idSchemas will be equal as well, // so it is not necessary to compare return !(0, _utils.deepEquals)((0, _extends3.default)({}, this.props, { idSchema: undefined }), (0, _extends3.default)({}, nextProps, { idSchema: undefined })); } }, { key: "render", value: function render() { return SchemaFieldRender(this.props); } }]); return SchemaField; }(_react2.default.Component); SchemaField.defaultProps = { uiSchema: {}, errorSchema: {}, idSchema: {}, disabled: false, readonly: false, autofocus: false }; if (process.env.NODE_ENV !== "production") { SchemaField.propTypes = { schema: _propTypes2.default.object.isRequired, uiSchema: _propTypes2.default.object, idSchema: _propTypes2.default.object, formData: _propTypes2.default.any, errorSchema: _propTypes2.default.object, registry: _propTypes2.default.shape({ widgets: _propTypes2.default.objectOf(_propTypes2.default.oneOfType([_propTypes2.default.func, _propTypes2.default.object])).isRequired, fields: _propTypes2.default.objectOf(_propTypes2.default.func).isRequired, definitions: _propTypes2.default.object.isRequired, ArrayFieldTemplate: _propTypes2.default.func, ObjectFieldTemplate: _propTypes2.default.func, FieldTemplate: _propTypes2.default.func, formContext: _propTypes2.default.object.isRequired }) }; } exports.default = SchemaField;