UNPKG

@formio/react

Version:

React renderer for form.io forms.

128 lines (99 loc) 4.42 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _formiojs = require('formiojs'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var FormBuilder = function FormBuilder(props) { var _props$options = props.options, options = _props$options === undefined ? {} : _props$options, _props$Builder = props.Builder, Builder = _props$Builder === undefined ? _formiojs.FormBuilder : _props$Builder, form = props.form; var builderRef = (0, _react.useRef)(); var element = void 0; var emit = function emit(funcName) { return function () { // eslint-disable-next-line no-prototype-builtins if (props.hasOwnProperty(funcName) && typeof props[funcName] === 'function') { props[funcName].apply(props, arguments); } }; }; var onChange = function onChange() { var onChange = props.onChange; if (onChange && typeof onChange === 'function') { var schema = _extends({}, builderRef.current.instance.form); Object.defineProperty(schema, 'components', { get: function get() { return builderRef.current.instance.schema.components; } }); onChange(builderRef.current.instance.form, schema); } }; var builderEvents = [{ name: 'saveComponent', action: emit('onSaveComponent') }, { name: 'updateComponent', action: emit('onUpdateComponent') }, { name: 'removeComponent', action: emit('onDeleteComponent') }, { name: 'cancelComponent', action: emit('onUpdateComponent') }, { name: 'editComponent', action: emit('onEditComponent') }, { name: 'addComponent', action: onChange }, { name: 'saveComponent', action: onChange }, { name: 'updateComponent', action: onChange }, { name: 'removeComponent', action: onChange }, { name: 'deleteComponent', action: onChange }, { name: 'pdfUploaded', action: onChange }]; var initializeBuilder = function initializeBuilder(builderProps) { var options = builderProps.options, form = builderProps.form; var Builder = builderProps.Builder; options = Object.assign({}, options); form = Object.assign({}, form); builderRef.current = new Builder(element, form, options); builderRef.current.ready.then(function () { onChange(); builderEvents.forEach(function (_ref) { var name = _ref.name, action = _ref.action; builderRef.current.instance.off(name, action); builderRef.current.instance.on(name, action); }); }); }; (0, _react.useEffect)(function () { initializeBuilder({ options: options, Builder: Builder, form: form }); return function () { return builderRef.current ? builderRef.current.instance.destroy(true) : null; }; }, [builderRef]); (0, _react.useEffect)(function () { if (!builderRef.current && form) { initializeBuilder({ options: options, Builder: Builder, form: form }); } }, [form, builderRef]); var elementDidMount = (0, _react.useCallback)(function (el) { return element = el; }); (0, _react.useLayoutEffect)(function () { if (builderRef.current && form && form.display) { builderRef.current.setDisplay(form.display); } }, [form.display]); (0, _react.useLayoutEffect)(function () { if (builderRef.current && form && form.components) { builderRef.current.setForm(form); } }, [form]); return _react2.default.createElement( 'div', null, _react2.default.createElement('div', { ref: elementDidMount }) ); }; FormBuilder.propTypes = { form: _propTypes2.default.object, options: _propTypes2.default.object, onChange: _propTypes2.default.func, onSaveComponent: _propTypes2.default.func, onUpdateComponent: _propTypes2.default.func, onDeleteComponent: _propTypes2.default.func, onCancelComponent: _propTypes2.default.func, onEditComponent: _propTypes2.default.func, Builder: _propTypes2.default.any }; exports.default = FormBuilder;