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)

343 lines (289 loc) 11.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _keys = require("babel-runtime/core-js/object/keys"); var _keys2 = _interopRequireDefault(_keys); var _extends2 = require("babel-runtime/helpers/extends"); var _extends3 = _interopRequireDefault(_extends2); 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 _react = require("react"); var _react2 = _interopRequireDefault(_react); var _propTypes = require("prop-types"); var _propTypes2 = _interopRequireDefault(_propTypes); var _ErrorList = require("./ErrorList"); var _ErrorList2 = _interopRequireDefault(_ErrorList); var _utils = require("../utils"); var _validate = require("../validate"); var _validate2 = _interopRequireDefault(_validate); var _semanticUiReact = require("semantic-ui-react"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var Form = function (_Component) { (0, _inherits3.default)(Form, _Component); function Form(props) { (0, _classCallCheck3.default)(this, Form); var _this = (0, _possibleConstructorReturn3.default)(this, (Form.__proto__ || (0, _getPrototypeOf2.default)(Form)).call(this, props)); _this.onChange = function (formData, newErrorSchema) { var mustValidate = !_this.props.noValidate && _this.props.liveValidate; var state = { formData: formData }; if (mustValidate) { var _this$validate = _this.validate(formData), errors = _this$validate.errors, errorSchema = _this$validate.errorSchema; state = (0, _extends3.default)({}, state, { errors: errors, errorSchema: errorSchema }); } else if (!_this.props.noValidate && newErrorSchema) { state = (0, _extends3.default)({}, state, { errorSchema: newErrorSchema, errors: (0, _validate.toErrorList)(newErrorSchema) }); } (0, _utils.setState)(_this, state, function () { if (_this.props.onChange) { _this.props.onChange(_this.state); } }); }; _this.onBlur = function () { if (_this.props.onBlur) { var _this$props; (_this$props = _this.props).onBlur.apply(_this$props, arguments); } }; _this.onFocus = function () { if (_this.props.onFocus) { var _this$props2; (_this$props2 = _this.props).onFocus.apply(_this$props2, arguments); } }; _this.onSubmit = function (event) { event.preventDefault(); if (!_this.props.noValidate) { var _this$validate2 = _this.validate(_this.state.formData), errors = _this$validate2.errors, errorSchema = _this$validate2.errorSchema; if ((0, _keys2.default)(errors).length > 0) { (0, _utils.setState)(_this, { errors: errors, errorSchema: errorSchema }, function () { if (_this.props.onError) { _this.props.onError(errors); } else { console.error("Form validation failed", errors); } }); return; } } (0, _utils.setState)(_this, { errors: [], errorSchema: {} }, function () { if (_this.props.onSubmit) { _this.props.onSubmit((0, _extends3.default)({}, _this.state, { status: "submitted" })); } }); }; _this.state = _this.getStateFromProps(props); return _this; } (0, _createClass3.default)(Form, [{ key: "componentWillReceiveProps", value: function componentWillReceiveProps(nextProps) { this.setState(this.getStateFromProps(nextProps)); } }, { key: "getStateFromProps", value: function getStateFromProps(props) { var state = this.state || {}; var schema = "schema" in props ? props.schema : this.props.schema; var uiSchema = "uiSchema" in props ? props.uiSchema : this.props.uiSchema; var edit = typeof props.formData !== "undefined"; var liveValidate = props.liveValidate || this.props.liveValidate; var mustValidate = edit && !props.noValidate && liveValidate; var definitions = schema.definitions; var formData = (0, _utils.getDefaultFormState)(schema, props.formData, definitions); var retrievedSchema = (0, _utils.retrieveSchema)(schema, definitions, formData); var _ref = mustValidate ? this.validate(formData, schema) : { errors: state.errors || [], errorSchema: state.errorSchema || {} }, errors = _ref.errors, errorSchema = _ref.errorSchema; var idSchema = (0, _utils.toIdSchema)(retrievedSchema, uiSchema["ui:rootFieldId"], definitions, formData, props.idPrefix); return { schema: schema, uiSchema: uiSchema, idSchema: idSchema, formData: formData, edit: edit, errors: errors, errorSchema: errorSchema }; } }, { key: "shouldComponentUpdate", value: function shouldComponentUpdate(nextProps, nextState) { return (0, _utils.shouldRender)(this, nextProps, nextState); } }, { key: "validate", value: function validate(formData) { var schema = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.props.schema; var _props = this.props, validate = _props.validate, transformErrors = _props.transformErrors; var _getRegistry = this.getRegistry(), definitions = _getRegistry.definitions; var resolvedSchema = (0, _utils.retrieveSchema)(schema, definitions, formData); return (0, _validate2.default)(formData, resolvedSchema, validate, transformErrors); } }, { key: "renderErrors", value: function renderErrors() { var _state = this.state, errors = _state.errors, errorSchema = _state.errorSchema, schema = _state.schema, uiSchema = _state.uiSchema; var _props2 = this.props, ErrorList = _props2.ErrorList, showErrorList = _props2.showErrorList, formContext = _props2.formContext; if (errors.length && showErrorList != false) { return _react2.default.createElement(ErrorList, { errors: errors, errorSchema: errorSchema, schema: schema, uiSchema: uiSchema, formContext: formContext }); } return null; } }, { key: "getRegistry", value: function getRegistry() { // For BC, accept passed SchemaField and TitleField props and pass them to // the "fields" registry one. var _getDefaultRegistry = (0, _utils.getDefaultRegistry)(), fields = _getDefaultRegistry.fields, widgets = _getDefaultRegistry.widgets; return { fields: (0, _extends3.default)({}, fields, this.props.fields), widgets: (0, _extends3.default)({}, widgets, this.props.widgets), ArrayFieldTemplate: this.props.ArrayFieldTemplate, ObjectFieldTemplate: this.props.ObjectFieldTemplate, FieldTemplate: this.props.FieldTemplate, definitions: this.props.schema.definitions || {}, formContext: this.props.formContext || {} }; } }, { key: "render", value: function render() { var _props3 = this.props, children = _props3.children, safeRenderCompletion = _props3.safeRenderCompletion, id = _props3.id, idPrefix = _props3.idPrefix, className = _props3.className, name = _props3.name, method = _props3.method, target = _props3.target, action = _props3.action, autocomplete = _props3.autocomplete, enctype = _props3.enctype, acceptcharset = _props3.acceptcharset, noHtml5Validate = _props3.noHtml5Validate; var _state2 = this.state, schema = _state2.schema, uiSchema = _state2.uiSchema, formData = _state2.formData, errorSchema = _state2.errorSchema, idSchema = _state2.idSchema; var registry = this.getRegistry(); var _SchemaField = registry.fields.SchemaField; return _react2.default.createElement( _semanticUiReact.Form, { className: className ? className : "rjsf", id: id, name: name, method: method, target: target, action: action, autoComplete: autocomplete, encType: enctype, acceptCharset: acceptcharset, noValidate: noHtml5Validate, onSubmit: this.onSubmit }, this.renderErrors(), _react2.default.createElement(_SchemaField, { schema: schema, uiSchema: uiSchema, errorSchema: errorSchema, idSchema: idSchema, idPrefix: idPrefix, formData: formData, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, registry: registry, safeRenderCompletion: safeRenderCompletion }), children ? children : _react2.default.createElement( _semanticUiReact.Button, { type: "submit", primary: true }, "Submit" ) ); } }]); return Form; }(_react.Component); Form.defaultProps = { uiSchema: {}, noValidate: false, liveValidate: false, safeRenderCompletion: false, noHtml5Validate: false, ErrorList: _ErrorList2.default }; exports.default = Form; if (process.env.NODE_ENV !== "production") { Form.propTypes = { schema: _propTypes2.default.object.isRequired, uiSchema: _propTypes2.default.object, formData: _propTypes2.default.any, widgets: _propTypes2.default.objectOf(_propTypes2.default.oneOfType([_propTypes2.default.func, _propTypes2.default.object])), fields: _propTypes2.default.objectOf(_propTypes2.default.func), ArrayFieldTemplate: _propTypes2.default.func, ObjectFieldTemplate: _propTypes2.default.func, FieldTemplate: _propTypes2.default.func, ErrorList: _propTypes2.default.func, onChange: _propTypes2.default.func, onError: _propTypes2.default.func, showErrorList: _propTypes2.default.bool, onSubmit: _propTypes2.default.func, id: _propTypes2.default.string, className: _propTypes2.default.string, name: _propTypes2.default.string, method: _propTypes2.default.string, target: _propTypes2.default.string, action: _propTypes2.default.string, autocomplete: _propTypes2.default.string, enctype: _propTypes2.default.string, acceptcharset: _propTypes2.default.string, noValidate: _propTypes2.default.bool, noHtml5Validate: _propTypes2.default.bool, liveValidate: _propTypes2.default.bool, validate: _propTypes2.default.func, transformErrors: _propTypes2.default.func, safeRenderCompletion: _propTypes2.default.bool, formContext: _propTypes2.default.object }; }