v5gl-form-builder
Version:
Customise form builder from ecsite
780 lines (691 loc) • 27 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 _formValidator = _interopRequireDefault(require("./form-validator"));
var _formElements = _interopRequireDefault(require("./form-elements"));
var _multiColumn = require("./multi-column");
var _tabs = _interopRequireDefault(require("./meterial-form-elements/tabs"));
var _customElement = _interopRequireDefault(require("./form-elements/custom-element"));
var _registry = _interopRequireDefault(require("./stores/registry"));
var _meterialFormElements = _interopRequireDefault(require("./meterial-form-elements"));
var _generateJson = _interopRequireDefault(require("./generateJson"));
var _core = require("@material-ui/core");
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 { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }
var Image = _formElements["default"].Image,
Checkboxes = _formElements["default"].Checkboxes,
Download = _formElements["default"].Download,
Camera = _formElements["default"].Camera;
var Dropdown = _meterialFormElements["default"].Dropdown,
Email = _meterialFormElements["default"].Email,
Header = _meterialFormElements["default"].Header,
Number = _meterialFormElements["default"].Number,
Phone = _meterialFormElements["default"].Phone,
Photo_PrePost = _meterialFormElements["default"].Photo_PrePost,
PhotoCaptureUploadModal = _meterialFormElements["default"].PhotoCaptureUploadModal,
Short_Text = _meterialFormElements["default"].Short_Text,
Signature = _meterialFormElements["default"].Signature,
Single_Choice = _meterialFormElements["default"].Single_Choice,
Input_Table = _meterialFormElements["default"].Input_Table,
Photo = _meterialFormElements["default"].Photo;
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);
_this.state = {
data: props.data,
fieldResults: [],
fieldMedia: [],
submitError: false
};
_this.answerData = _this._convert(props.answer_data);
_this.emitter = new _fbemitter.EventEmitter();
_this.getDataById = _this.getDataById.bind((0, _assertThisInitialized2["default"])(_this));
_this.FormElements = props.isBootstrapItems ? _formElements["default"] : _meterialFormElements["default"];
return _this;
}
(0, _createClass2["default"])(ReactForm, [{
key: "bindFieldResults",
value: function bindFieldResults(item) {
if (!this.props.fieldResult) return null;
if (!this.props.fieldResult.length) return null;
var fieldResult = this.props.fieldResult;
var result = fieldResult.filter(function (resultItem) {
return item.id == resultItem.questionId;
});
return result[0];
}
}, {
key: "bindFieldMedia",
value: function bindFieldMedia(item) {
if (!this.props.fieldMedia) return null;
if (!this.props.fieldMedia.length) return null;
var fieldMedia = this.props.fieldMedia;
var media = fieldMedia.filter(function (resultItem) {
return item.id == resultItem.questionId;
});
return media;
}
}, {
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.fieldName];
}
}, {
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 ? ref.state.img.replace('data:image/png;base64,', '') : '';
} 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.fieldName];
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.fieldName];
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 {
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 = {
name: item.fieldName
};
var ref = this.inputs[item.fieldName];
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 (!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.fieldName];
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 = [];
var fieldResultsWithoutError = [];
if (!this.props.skip_validations) {
var fieldResults = this.state.fieldResults;
fieldResultsWithoutError = fieldResults.map(function (item) {
if (item.error == true) {
errors.push(item);
}
delete item.error;
return item;
}); // errors = fieldResults.map(item => {return item.error == true});
} // Only submit if there are no errors.
if (errors.length < 1) {
// console.log(fieldResultsWithoutError);
// console.log(this.state.fieldResults);
// console.log(this.state.fieldMedia);
this.props.collectFormData(fieldResultsWithoutError, this.state.fieldMedia);
} else {
this.setState({
submitError: true
});
console.log("Error in the form submission");
}
}
}, {
key: "collectFieldResults",
value: function collectFieldResults(elementResultObj) {
var fieldResults = this.state.fieldResults;
var elementStateData = fieldResults.filter(function (element) {
return element.questionId !== elementResultObj.questionId;
});
elementStateData.push(elementResultObj);
this.setState({
fieldResults: elementStateData,
submitError: false
});
}
}, {
key: "collectFieldMedia",
value: function collectFieldMedia(elementMediaArray) {
var fieldMedia = this.state.fieldMedia;
var filteredArray = fieldMedia;
elementMediaArray.forEach(function (elementMediaObj) {
var arr = filteredArray.filter(function (item) {
return item.questionId !== elementMediaObj.questionId;
});
filteredArray = arr;
});
filteredArray = filteredArray.concat(elementMediaArray);
this.setState({
fieldMedia: filteredArray,
submitError: false
});
}
}, {
key: "getDataById",
value: function getDataById(id) {
var data = this.props.data;
return data.find(function (x) {
return x.id === id;
});
}
}, {
key: "getDataByArrayId",
value: function getDataByArrayId(idList) {
var data = this.props.data;
var dataArray = [];
idList.map(function (id) {
dataArray.push(data.find(function (x) {
return x && x.id === id;
}));
});
return dataArray;
}
}, {
key: "getMaterialInputElement",
value: function getMaterialInputElement(item, items) {
var _this4 = this;
// console.log(item.element);
var Input = this.FormElements[item.element];
return /*#__PURE__*/_react["default"].createElement(Input, {
isFromMastersScreen: this.props.isFromMastersScreen,
data: item,
mutable: true,
totalItems: items,
isFormPreview: true,
key: "form_".concat(item.id),
handleChange: this.handleChange,
globalStyles: item.globalStyles,
media: this.bindFieldMedia(item),
result: this.bindFieldResults(item),
read_only: this.props.isFormReadOnly,
defaultValue: this._getDefaultValue(item),
ref: function ref(c) {
return _this4.inputs[item.fieldName] = c;
},
photoPreview: this.props.hasOwnProperty('photoPreview') ? this.props.photoPreview : null,
collectFieldMedia: this.props.isFormReadOnly ? null : this.collectFieldMedia.bind(this),
collectFieldResults: this.props.isFormReadOnly ? null : this.collectFieldResults.bind(this),
imageUploadCallback: this.props.imageUploadCallback ? this.props.imageUploadCallback : null
});
}
}, {
key: "getMaterialInputArrayElement",
value: function getMaterialInputArrayElement(itemList, items) {
var _this5 = this;
var materialArrElement = [];
itemList.map(function (item) {
var Input = _this5.FormElements[item.element];
materialArrElement.push( /*#__PURE__*/_react["default"].createElement(Input, {
handleChange: _this5.handleChange,
ref: function ref(c) {
return _this5.inputs[item.fieldName] = c;
},
mutable: true,
key: "form_".concat(item.id),
data: item,
totalItems: items,
isFormPreview: true,
result: _this5.bindFieldResults(item),
media: _this5.bindFieldMedia(item),
globalStyles: item.globalStyles,
read_only: _this5.props.isFormReadOnly,
defaultValue: _this5._getDefaultValue(item)
}));
});
return materialArrElement;
}
}, {
key: "getMaterialDropdownElement",
value: function getMaterialDropdownElement(item) {
var _this6 = this;
var Dropdown = this.FormElements[item.element];
return /*#__PURE__*/_react["default"].createElement(Dropdown, {
handleChange: this.handleChange,
ref: function ref(c) {
return _this6.inputs[item.fieldName] = c;
},
mutable: true,
key: "form_".concat(item.elementId),
data: item,
isFormPreview: true,
globalStyles: item.globalStyles,
read_only: this.props.isFormReadOnly,
defaultValue: this._getDefaultValue(item)
});
}
}, {
key: "getInputElement",
value: function getInputElement(item) {
var _this7 = this;
if (item.element.toLowerCase().includes("material")) {
return this.getMaterialInputElement(item);
}
if (item.custom) {
return this.getCustomElement(item);
}
var Input = this.FormElements[item.element];
return /*#__PURE__*/_react["default"].createElement(Input, {
handleChange: this.handleChange,
ref: function ref(c) {
return _this7.inputs[item.fieldName] = c;
},
mutable: true,
key: "form_".concat(item.id),
data: item,
read_only: this.props.isFormReadOnly,
defaultValue: this._getDefaultValue(item)
});
}
}, {
key: "getTabsContainerElement",
value: function getTabsContainerElement(item, Element) {
var _this8 = this;
var controls = item.childItems.map(function (x) {
return x ? _this8.getMaterialInputArrayElement(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: "getContainerElement",
value: function getContainerElement(item, Element) {
var _this9 = this;
var controls = item.childItems.map(function (x) {
return x ? _this9.getInputElement(_this9.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, workFlowData) {
var Element = this.FormElements[item.element];
return /*#__PURE__*/_react["default"].createElement(Element, {
read_only: this.props.isFormReadOnly,
mutable: true,
key: "form_".concat(item.id),
data: item,
workFlowData: workFlowData
});
}
}, {
key: "getCustomElement",
value: function getCustomElement(item) {
var _this10 = this;
if (!item.component || typeof item.component !== 'function') {
item.component = _registry["default"].get(item.key);
if (!item.component) {
console.error("".concat(item.element, " was not registered"));
}
}
var inputProps = item.forwardRef && {
handleChange: this.handleChange,
defaultValue: this._getDefaultValue(item),
ref: function ref(c) {
return _this10.inputs[item.fieldName] = c;
}
};
return /*#__PURE__*/_react["default"].createElement(_customElement["default"], (0, _extends2["default"])({
mutable: true,
read_only: this.props.isFormReadOnly,
key: "form_".concat(item.id),
data: item
}, inputProps));
}
}, {
key: "render",
value: function render() {
var _this11 = this;
var data_items = this.props.data;
if (this.props.display_short) {
data_items = this.props.data.filter(function (i) {
return i.alternateForm === true;
});
}
var items = data_items.filter(function (x) {
return !x.parentId;
}).map(function (item) {
if (!item) return null;
switch (item.element) {
case 'Email':
case 'Text':
case 'Phone':
case 'Number':
case 'Section_Header':
case 'Input_Table':
case 'Single_Choice':
case 'Header':
case 'Short_Text':
case 'Page_Break':
case 'Photo':
case 'Dropdown':
case 'Check_List':
case 'Photo_PrePost':
case 'Barcode_Scanner':
case 'Long_Text':
case 'Configurable_List':
case 'Date_Picker':
case 'Button_Radios':
case 'Tiles':
case 'Time':
case 'Attachment':
case 'Video':
return _this11.getMaterialInputElement(item, data_items);
case 'TextInput':
case 'NumberInput':
case 'TextArea':
case 'RadioButtons':
case 'Rating':
case 'Tags':
case 'Range':
// case 'Dropdown':
return _this11.getInputElement(item);
case 'CustomElement':
return _this11.getCustomElement(item);
case 'Tab_Break':
return _this11.getTabsContainerElement(item, _tabs["default"]);
case 'Four_Column_Row':
return _this11.getContainerElement(item, _multiColumn.Four_Column_Row);
case 'Three_Column_Row':
return _this11.getContainerElement(item, _multiColumn.Three_Column_Row);
case 'Two_Column_Row':
return _this11.getContainerElement(item, _multiColumn.Two_Column_Row);
case 'Signature':
return /*#__PURE__*/_react["default"].createElement(Signature, {
isFromPreview: true,
ref: function ref(c) {
return _this11.inputs[item.fieldName] = c;
},
read_only: _this11.props.isFormReadOnly || item.readOnly,
mutable: true,
key: "form_".concat(item.id),
data: item,
defaultValue: _this11._getDefaultValue(item)
});
case 'Checkboxes':
return /*#__PURE__*/_react["default"].createElement(Checkboxes, {
ref: function ref(c) {
return _this11.inputs[item.fieldName] = c;
},
read_only: _this11.props.isFormReadOnly,
handleChange: _this11.handleChange,
mutable: true,
key: "form_".concat(item.id),
data: item,
defaultValue: _this11._optionsDefaultValue(item)
});
case 'Image':
return /*#__PURE__*/_react["default"].createElement(Image, {
ref: function ref(c) {
return _this11.inputs[item.fieldName] = c;
},
handleChange: _this11.handleChange,
mutable: true,
key: "form_".concat(item.id),
data: item,
defaultValue: _this11._getDefaultValue(item)
});
case 'Download':
return /*#__PURE__*/_react["default"].createElement(Download, {
download_path: _this11.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 _this11.inputs[item.fieldName] = c;
},
read_only: _this11.props.isFormReadOnly || item.readOnly,
mutable: true,
key: "form_".concat(item.id),
data: item,
defaultValue: _this11._getDefaultValue(item)
});
default:
return _this11.getSimpleElement(item, _this11.props.workFlowData);
}
});
var formTokenStyle = {
display: 'none'
};
var actionName = this.props.action_name ? this.props.action_name : 'Submit';
var backName = this.props.back_name ? this.props.back_name : 'Cancel';
var classes = 'react-form-builder-form'; // if(this.props.isFormReadOnly) classes += ' readable-form-preview';
return /*#__PURE__*/_react["default"].createElement("div", {
className: "scrollable-preview",
style: {
minHeight: "323px"
}
}, /*#__PURE__*/_react["default"].createElement(_formValidator["default"], {
emitter: this.emitter
}), /*#__PURE__*/_react["default"].createElement("div", {
className: classes
}, /*#__PURE__*/_react["default"].createElement("form", {
encType: "multipart/form-data",
ref: function ref(c) {
return _this11.form = c;
},
action: this.props.form_action,
onSubmit: this.handleSubmit.bind(this),
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.internalScreensChecked && this.props.workFlowData.displayIndex !== this.props.masterScreensWorkflowData.length - 1 ? /*#__PURE__*/_react["default"].createElement(_core.Button, {
style: {
width: "100%",
border: "1px solid #2C3E93",
color: "#2C3E93"
}
}, "NEXT") : this.props.internalScreensChecked ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_core.Button, {
style: {
width: "45%",
border: "1px solid #2C3E93",
color: "#2C3E93"
}
}, "APPROVE"), /*#__PURE__*/_react["default"].createElement(_core.Button, {
style: {
width: "45%",
border: "1px solid #B00020",
marginLeft: "1rem",
color: "#B00020"
}
}, "REJECT")) : null, /*#__PURE__*/_react["default"].createElement("div", {
className: "btn-toolbar",
style: {
display: 'flex',
flexDirection: 'column',
width: "100%"
}
}, this.state.submitError && /*#__PURE__*/_react["default"].createElement("div", {
style: {
marginBottom: '10px',
fontSize: '13px',
color: '#f4493c'
}
}, /*#__PURE__*/_react["default"].createElement("span", null, "Error! Please check the form data.")), /*#__PURE__*/_react["default"].createElement("div", {
className: "mt-3 ".concat(this.props.isFromMastersScreen && "mb-3")
})))));
}
}]);
return ReactForm;
}(_react["default"].Component);
exports["default"] = ReactForm;
ReactForm.defaultProps = {
validateForCorrectness: false
};