nfttrace-form-builder
Version:
A complete form builder for react.
741 lines (629 loc) • 25.1 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _reactDom = _interopRequireDefault(require("react-dom"));
var _fbemitter = require("fbemitter");
var _reactIntl = require("react-intl");
var _formValidator = _interopRequireDefault(require("./form-validator"));
var _formElements = _interopRequireDefault(require("./form-elements"));
var _multiColumn = require("./multi-column");
var _fieldset = require("./fieldset");
var _customElement = _interopRequireDefault(require("./form-elements/custom-element"));
var _registry = _interopRequireDefault(require("./stores/registry"));
var _reactstrap = require("reactstrap");
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var Image = _formElements["default"].Image,
Checkboxes = _formElements["default"].Checkboxes,
Signature = _formElements["default"].Signature,
Download = _formElements["default"].Download,
Camera = _formElements["default"].Camera,
FileUpload = _formElements["default"].FileUpload;
var ReactForm = /*#__PURE__*/function (_React$Component) {
(0, _inherits2["default"])(ReactForm, _React$Component);
var _super = _createSuper(ReactForm);
function ReactForm(props) {
var _this;
(0, _classCallCheck2["default"])(this, ReactForm);
_this = _super.call(this, props);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "form", void 0);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "inputs", {});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "answerData", void 0);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleRenderSubmit", function () {
var name = _this.props.action_name || _this.props.actionName;
var actionName = name || "Submit";
var _this$props$submitBut = _this.props.submitButton,
submitButton = _this$props$submitBut === void 0 ? false : _this$props$submitBut;
return submitButton || /*#__PURE__*/_react["default"].createElement("input", {
type: "submit",
className: "btn btn-big",
value: actionName
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleRenderBack", function () {
var name = _this.props.back_name || _this.props.backName;
var backName = name || "Cancel";
var _this$props$backButto = _this.props.backButton,
backButton = _this$props$backButto === void 0 ? false : _this$props$backButto;
return backButton || /*#__PURE__*/_react["default"].createElement("a", {
href: _this.props.back_action,
className: "btn btn-default btn-cancel btn-big"
}, backName);
});
_this.answerData = _this._convert(props.answer_data);
_this.emitter = new _fbemitter.EventEmitter();
_this.getDataById = _this.getDataById.bind((0, _assertThisInitialized2["default"])(_this)); // Bind handleBlur and handleChange methods
_this.handleBlur = _this.handleBlur.bind((0, _assertThisInitialized2["default"])(_this));
_this.handleChange = _this.handleChange.bind((0, _assertThisInitialized2["default"])(_this));
_this.handleSubmit = _this.handleSubmit.bind((0, _assertThisInitialized2["default"])(_this));
return _this;
}
(0, _createClass2["default"])(ReactForm, [{
key: "_convert",
value: function _convert(answers) {
if (Array.isArray(answers)) {
var result = {};
answers.forEach(function (x) {
if (x.name.indexOf("tags_") > -1) {
result[x.name] = x.value.map(function (y) {
return y.value;
});
} else {
result[x.name] = x.value;
}
});
return result;
}
return answers || {};
}
}, {
key: "_getDefaultValue",
value: function _getDefaultValue(item) {
return this.answerData[item.field_name];
}
}, {
key: "_optionsDefaultValue",
value: function _optionsDefaultValue(item) {
var _this2 = this;
var defaultValue = this._getDefaultValue(item);
if (defaultValue) {
return defaultValue;
}
var defaultChecked = [];
item.options.forEach(function (option) {
if (_this2.answerData["option_".concat(option.key)]) {
defaultChecked.push(option.key);
}
});
return defaultChecked;
}
}, {
key: "_getItemValue",
value: function _getItemValue(item, ref) {
var $item = {
element: item.element,
value: ""
};
if (item.element === "Rating") {
$item.value = ref.inputField.current.state.rating;
} else if (item.element === "Tags") {
$item.value = ref.inputField.current.state.value;
} else if (item.element === "DatePicker") {
$item.value = ref.state.value;
} else if (item.element === "Camera") {
$item.value = ref.state.img;
} else if (item.element === "FileUpload") {
$item.value = ref.state.fileUpload;
} else if (item.element === "ProgressBar") {
$item.value = ref.state.percentageValue;
} else if (item.element === "Palette") {
$item.value = ref.state.listData;
} else if (ref && ref.inputField && ref.inputField.current) {
$item = _reactDom["default"].findDOMNode(ref.inputField.current);
if ($item && typeof $item.value === "string") {
$item.value = $item.value.trim();
}
}
return $item;
}
}, {
key: "_isIncorrect",
value: function _isIncorrect(item) {
var incorrect = false;
if (item.canHaveAnswer) {
var ref = this.inputs[item.field_name];
if (item.element === "Checkboxes" || item.element === "RadioButtons") {
item.options.forEach(function (option) {
var $option = _reactDom["default"].findDOMNode(ref.options["child_ref_".concat(option.key)]);
if (option.hasOwnProperty("correct") && !$option.checked || !option.hasOwnProperty("correct") && $option.checked) {
incorrect = true;
}
});
} else {
var $item = this._getItemValue(item, ref);
if (item.element === "Rating") {
if ($item.value.toString() !== item.correct) {
incorrect = true;
}
} else if ($item.value.toLowerCase() !== item.correct.trim().toLowerCase()) {
incorrect = true;
}
}
}
return incorrect;
}
}, {
key: "_isInvalid",
value: function _isInvalid(item) {
var invalid = false;
if (item.required === true) {
var ref = this.inputs[item.field_name];
if (item.element === "Checkboxes" || item.element === "RadioButtons") {
var checked_options = 0;
item.options.forEach(function (option) {
var $option = _reactDom["default"].findDOMNode(ref.options["child_ref_".concat(option.key)]);
if ($option.checked) {
checked_options += 1;
}
});
if (checked_options < 1) {
// errors.push(item.label + ' is required!');
invalid = true;
}
} else if (item.element === "FileUpload") {
var _ref = this.inputs[item.field_name];
var fileValue = this._getItemValue(item, _ref).value;
if (!fileValue) {
invalid = true;
}
} else if (item.element === "Camera") {
var _ref2 = this.inputs[item.field_name];
var cameraValue = this._getItemValue(item, _ref2).value;
if (!cameraValue) {
invalid = true;
}
} else {
var $item = this._getItemValue(item, ref);
if (item.element === "Rating") {
if ($item.value === 0) {
invalid = true;
}
} else if ($item.value === undefined || $item.value.length < 1) {
invalid = true;
}
}
}
return invalid;
}
}, {
key: "_collect",
value: function _collect(item) {
var itemData = {
id: item.id,
name: item.field_name,
custom_name: item.custom_name || item.field_name
};
if (!itemData.name) return null;
var ref = this.inputs[item.field_name];
if (item.element === "Checkboxes" || item.element === "RadioButtons") {
var checked_options = [];
item.options.forEach(function (option) {
var $option = _reactDom["default"].findDOMNode(ref.options["child_ref_".concat(option.key)]);
if ($option.checked) {
checked_options.push(option.key);
}
});
itemData.value = checked_options;
} else if (item.element === "Palette") {
itemData.value = {
list: item.list,
cols: item.cols,
rows: item.rows
};
} else {
if (!ref) return null;
itemData.value = this._getItemValue(item, ref).value;
}
return itemData;
}
}, {
key: "_collectFormData",
value: function _collectFormData(data) {
var _this3 = this;
var formData = [];
data.forEach(function (item) {
var item_data = _this3._collect(item);
if (item_data) {
formData.push(item_data);
}
});
return formData;
}
}, {
key: "_getSignatureImg",
value: function _getSignatureImg(item) {
var ref = this.inputs[item.field_name];
var $canvas_sig = ref.canvas.current;
if ($canvas_sig) {
var base64 = $canvas_sig.toDataURL().replace("data:image/png;base64,", "");
var isEmpty = $canvas_sig.isEmpty();
var $input_sig = _reactDom["default"].findDOMNode(ref.inputField.current);
if (isEmpty) {
$input_sig.value = "";
} else {
$input_sig.value = base64;
}
}
}
}, {
key: "handleSubmit",
value: function handleSubmit(e) {
e.preventDefault();
var errors = [];
if (!this.props.skip_validations) {
errors = this.validateForm(); // Publish errors, if any.
this.emitter.emit("formValidation", errors);
} // Only submit if there are no errors.
if (errors.length < 1) {
var onSubmit = this.props.onSubmit;
if (onSubmit) {
var data = this._collectFormData(this.props.data);
onSubmit(data);
} else {
var $form = _reactDom["default"].findDOMNode(this.form);
$form.submit();
}
}
}
}, {
key: "handleBlur",
value: function handleBlur(event) {
// Call submit function on blur
if (this.props.onBlur) {
var onBlur = this.props.onBlur;
var data = this._collectFormData(this.props.data);
onBlur(data);
}
}
}, {
key: "handleChange",
value: function handleChange(event) {
// Call submit function on change
if (this.props.onChange) {
var onChange = this.props.onChange;
var data = this._collectFormData(this.props.data);
onChange(data);
}
}
}, {
key: "validateForm",
value: function validateForm() {
var _this4 = this;
var errors = [];
var data_items = this.props.data;
var intl = this.props.intl;
if (this.props.display_short) {
data_items = this.props.data.filter(function (i) {
return i.alternateForm === true;
});
}
data_items.forEach(function (item) {
if (item.element === "Signature") {
_this4._getSignatureImg(item);
}
if (_this4._isInvalid(item)) {
errors.push("".concat(item.label, " ").concat(intl.formatMessage({
id: "message.is-required"
}), "!"));
}
if (item.element === "EmailInput") {
var ref = _this4.inputs[item.field_name];
var emailValue = _this4._getItemValue(item, ref).value;
if (emailValue) {
var validateEmail = function validateEmail(email) {
return email.match( // eslint-disable-next-line no-useless-escape
/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/);
};
var checkEmail = validateEmail(emailValue);
if (!checkEmail) {
errors.push("".concat(item.label, " ").concat(intl.formatMessage({
id: "message.invalid-email"
})));
}
}
}
if (item.element === "PhoneNumber") {
var _ref3 = _this4.inputs[item.field_name];
var phoneValue = _this4._getItemValue(item, _ref3).value;
if (phoneValue) {
var validatePhone = function validatePhone(phone) {
return phone.match( // eslint-disable-next-line no-useless-escape
/^[+]?(1\-|1\s|1|\d{3}\-|\d{3}\s|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/g);
};
var checkPhone = validatePhone(phoneValue);
if (!checkPhone) {
errors.push("".concat(item.label, " ").concat(intl.formatMessage({
id: "message.invalid-phone-number"
})));
}
}
}
if (_this4.props.validateForCorrectness && _this4._isIncorrect(item)) {
errors.push("".concat(item.label, " ").concat(intl.formatMessage({
id: "message.was-answered-incorrectly"
}), "!"));
}
});
return errors;
}
}, {
key: "getDataById",
value: function getDataById(id) {
var data = this.props.data;
return data.find(function (x) {
return x.id === id;
});
}
}, {
key: "getInputElement",
value: function getInputElement(item) {
var _this5 = this;
if (item.custom) {
return this.getCustomElement(item);
}
var Input = _formElements["default"][item.element];
return /*#__PURE__*/_react["default"].createElement(Input, {
handleChange: this.handleChange,
ref: function ref(c) {
return _this5.inputs[item.field_name] = c;
},
mutable: true,
key: "form_".concat(item.id),
data: item,
read_only: this.props.read_only,
defaultValue: this._getDefaultValue(item)
});
}
}, {
key: "getContainerElement",
value: function getContainerElement(item, Element) {
var _this6 = this;
var controls = item.childItems.map(function (x) {
return x ? _this6.getInputElement(_this6.getDataById(x)) : /*#__PURE__*/_react["default"].createElement("div", null, "\xA0");
});
return /*#__PURE__*/_react["default"].createElement(Element, {
mutable: true,
key: "form_".concat(item.id),
data: item,
controls: controls
});
}
}, {
key: "getSimpleElement",
value: function getSimpleElement(item) {
var Element = _formElements["default"][item.element];
return /*#__PURE__*/_react["default"].createElement(Element, {
mutable: true,
key: "form_".concat(item.id),
data: item
});
}
}, {
key: "getCustomElement",
value: function getCustomElement(item) {
var _this7 = this;
var intl = this.props.intl;
if (!item.component || typeof item.component !== "function") {
item.component = _registry["default"].get(item.key);
if (!item.component) {
console.error("".concat(item.element, " ").concat(intl.formatMessage({
id: "message.was-not-registered"
})));
}
}
var inputProps = item.forwardRef && {
handleChange: this.handleChange,
defaultValue: this._getDefaultValue(item),
ref: function ref(c) {
return _this7.inputs[item.field_name] = c;
}
};
return /*#__PURE__*/_react["default"].createElement(_customElement["default"], (0, _extends2["default"])({
mutable: true,
read_only: this.props.read_only,
key: "form_".concat(item.id),
data: item
}, inputProps));
}
}, {
key: "render",
value: function render() {
var _this8 = this;
var data_items = this.props.data;
if (this.props.display_short) {
data_items = this.props.data.filter(function (i) {
return i.alternateForm === true;
});
}
data_items.forEach(function (item) {
if (item && item.readOnly && item.variableKey && _this8.props.variables[item.variableKey]) {
_this8.answerData[item.field_name] = _this8.props.variables[item.variableKey];
}
});
var items = data_items.filter(function (x) {
return !x.parentId;
}).map(function (item) {
if (!item) return null;
switch (item.element) {
case "TextInput":
case "EmailInput":
case "PhoneNumber":
case "Paragraph":
case "NumberInput":
case "TextArea":
case "Dropdown":
case "DatePicker":
case "RadioButtons":
case "Rating":
case "Tags":
case "Range":
return _this8.getInputElement(item);
case "ProgressBar":
return _this8.getInputElement(item);
case "CustomElement":
return _this8.getCustomElement(item);
case "MultiColumnRow":
return _this8.getContainerElement(item, _multiColumn.MultiColumnRow);
case "ThreeColumnRow":
return _this8.getContainerElement(item, _multiColumn.ThreeColumnRow);
case "TwoColumnRow":
return _this8.getContainerElement(item, _multiColumn.TwoColumnRow);
case "FieldSet":
return _this8.getContainerElement(item, _fieldset.FieldSet);
case "Signature":
return /*#__PURE__*/_react["default"].createElement(Signature, {
ref: function ref(c) {
return _this8.inputs[item.field_name] = c;
},
read_only: _this8.props.read_only || item.readOnly,
mutable: true,
key: "form_".concat(item.id),
data: item,
defaultValue: _this8._getDefaultValue(item)
});
case "Checkboxes":
return /*#__PURE__*/_react["default"].createElement(Checkboxes, {
ref: function ref(c) {
return _this8.inputs[item.field_name] = c;
},
read_only: _this8.props.read_only,
handleChange: _this8.handleChange,
mutable: true,
key: "form_".concat(item.id),
data: item,
defaultValue: _this8._optionsDefaultValue(item)
});
case "Image":
return /*#__PURE__*/_react["default"].createElement(Image, {
ref: function ref(c) {
return _this8.inputs[item.field_name] = c;
},
handleChange: _this8.handleChange,
mutable: true,
key: "form_".concat(item.id),
data: item,
defaultValue: _this8._getDefaultValue(item)
});
case "Download":
return /*#__PURE__*/_react["default"].createElement(Download, {
download_path: _this8.props.download_path,
mutable: true,
key: "form_".concat(item.id),
data: item
});
case "Camera":
return /*#__PURE__*/_react["default"].createElement(Camera, {
ref: function ref(c) {
return _this8.inputs[item.field_name] = c;
},
read_only: _this8.props.read_only || item.readOnly,
mutable: true,
key: "form_".concat(item.id),
data: item,
defaultValue: _this8._getDefaultValue(item)
});
case "FileUpload":
return /*#__PURE__*/_react["default"].createElement(FileUpload, {
ref: function ref(c) {
return _this8.inputs[item.field_name] = c;
},
read_only: _this8.props.read_only || item.readOnly,
mutable: true,
key: "form_".concat(item.id),
data: item,
defaultValue: _this8._getDefaultValue(item)
});
default:
return _this8.getSimpleElement(item);
}
});
var formTokenStyle = {
display: "none"
};
return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_formValidator["default"], {
emitter: this.emitter
}), /*#__PURE__*/_react["default"].createElement("div", {
className: "react-form-builder-form"
}, /*#__PURE__*/_react["default"].createElement("form", {
encType: "multipart/form-data",
ref: function ref(c) {
return _this8.form = c;
},
action: this.props.form_action,
onBlur: this.handleBlur,
onChange: this.handleChange,
onSubmit: this.handleSubmit,
method: this.props.form_method
}, this.props.authenticity_token && /*#__PURE__*/_react["default"].createElement("div", {
style: formTokenStyle
}, /*#__PURE__*/_react["default"].createElement("input", {
name: "utf8",
type: "hidden",
value: "\u2713"
}), /*#__PURE__*/_react["default"].createElement("input", {
name: "authenticity_token",
type: "hidden",
value: this.props.authenticity_token
}), /*#__PURE__*/_react["default"].createElement("input", {
name: "task_id",
type: "hidden",
value: this.props.task_id
})), items, this.props.show_btns && /*#__PURE__*/_react["default"].createElement("div", {
className: "btn-toolbar action-btns-center",
style: {
display: "flex",
justifyContent: "center",
marginTop: "10px"
}
}, /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
color: "primary",
type: "button",
onClick: this.props._goback,
value: this.props.translate.formBuilder.back,
disabled: this.props.isLoading
}, "Cancel"), this.props.loaderButton ? /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
className: "mx-2",
color: "primary",
type: "submit",
disabled: this.props.isLoading
}, this.props.isLoading ? /*#__PURE__*/_react["default"].createElement(_reactstrap.Spinner, {
size: "sm"
}) : "Submit") : /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
className: "mx-2",
color: "primary",
type: "submit",
disabled: this.props.isLoading
}, this.props.isLoading ? /*#__PURE__*/_react["default"].createElement(_reactstrap.Spinner, {
size: "sm"
}) : "Submit")))));
}
}]);
return ReactForm;
}(_react["default"].Component);
var _default = (0, _reactIntl.injectIntl)(ReactForm);
exports["default"] = _default;
ReactForm.defaultProps = {
validateForCorrectness: false
};