v5gl-form-builder
Version:
Customise form builder from ecsite
521 lines (443 loc) • 22.3 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CustomModal = CustomModal;
exports.MUIEditor = MUIEditor;
exports.EditorConvertToHTML = exports["default"] = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
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 = _interopRequireWildcard(require("react"));
var _muiRte = _interopRequireDefault(require("mui-rte"));
var _componentHeader = _interopRequireDefault(require("../form-elements/component-header"));
var _Modal = _interopRequireDefault(require("@material-ui/core/Modal"));
var _core = require("@material-ui/core");
var _styles = require("@material-ui/core/styles");
var _Done = _interopRequireDefault(require("@material-ui/icons/Done"));
var _reactDraftWysiwyg = require("react-draft-wysiwyg");
var _draftjsToHtml = _interopRequireDefault(require("draftjs-to-html"));
var _AspectRatioRounded = _interopRequireDefault(require("@material-ui/icons/AspectRatioRounded"));
var _materialElementLabel = _interopRequireDefault(require("./material-element-label"));
var _draftJs = require("draft-js");
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; } }
// import "react-draft-wysiwyg/dist/react-draft-wysiwyg.css";
var Long_Text = /*#__PURE__*/function (_React$Component) {
(0, _inherits2["default"])(Long_Text, _React$Component);
var _super = _createSuper(Long_Text);
function Long_Text(props) {
var _this;
(0, _classCallCheck2["default"])(this, Long_Text);
_this = _super.call(this, props);
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "textChange", function (event) {
var value = event.target.value;
if (!value && _this.props.data.customOptions.required) {
_this.setState({
inputText: "",
error: true,
requiredMessage: "Please fill out mandatory field"
});
return;
}
if (_this.props.data.isCharLimit) if (value.length > _this.props.data.charLimit) return;
_this.setState({
requiredMessage: ""
});
var status = _this.validate(event);
var fieldResult = _this.state.fieldResult;
fieldResult.value = status.inputText;
fieldResult.error = status.error;
_this.setState(status);
_this.props.collectFieldResults(fieldResult);
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "fullScreen", function () {
var isFullScreen = _this.state.isFullScreen;
_this.setState({
isFullScreen: !isFullScreen
});
});
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "validate", function (e) {
var value = e.target.value;
var customOptions = _this.props.data.customOptions;
if (customOptions.required && value === '') {
return {
inputText: value,
error: true
};
}
if (customOptions.limitType.toLowerCase() === 'characters' && customOptions.isLimitEntry) {
if (value.length < customOptions.min || value.length > customOptions.max) {
return {
inputText: value,
error: true
};
}
}
if (customOptions.isLimitEntry && customOptions.limitType.toLowerCase() === 'words') {
if (value.split(' ').length - 1 < customOptions.min || value.split(' ').length - 1 >= customOptions.max) {
return {
inputText: value,
error: true
};
}
} // if ( customOptions.isLimitEntry && customOptions.limitType.toLowerCase() === 'words' && value.split(' ').length < customOptions.min || value.split(' ').length > customOptions.max) {
// return { inputText: value, error: true };
// }
// if ( customOptions.isLimitEntry && customOptions.limitType.toLowerCase() === 'characters' && value.length < customOptions.min || value.length > customOptions.max ){
// return { inputText: value, error:true};
// }
if (value !== '') {
switch (customOptions.validationType) {
case 'Alphabetic':
var alphabeticRegex = /^[A-Za-z ]+$/;
if (!value.match(alphabeticRegex)) {
return {
inputText: value,
error: true
};
}
break;
case 'AlphaNumeric':
var alphaNumericRegex = /^[0-9a-zA-Z ]+$/;
if (!value.match(alphaNumericRegex)) {
return {
inputText: value,
error: true
};
}
break;
// case 'Currency':
// const currencyRegex = /^\$?[0-9][0-9,]*[0-9]\.?[0-9]{0,2}$/i;
// if (!value.match(currencyRegex)) {
// return { inputText: value, error: true };
// }
// break;
// case 'Cyrillic':
// const cyrillicRegex = /[\wа-я]+/ig;
// if (!value.match(cyrillicRegex)) {
// return { inputText: value, error: true };
// }
// break;
// case 'Email':
// const emailRegex = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
// if (!emailRegex.test(value)) {
// return { inputText: value, error: true };
// }
// break;
// case 'Numeric':
// const numericRegex = /^\d+$/;
// if (!value.match(numericRegex)) {
// return { inputText: value, error: true };
// }
// break;
// case 'URL':
// const urlRegex = /[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)?/gi;
// if (!value.match(urlRegex)) {
// return { inputText: value, error: true };
// }
// break;
default:
break;
}
}
return {
inputText: value,
error: false
};
});
_this.state = {
inputText: props.result ? props.result.value : '',
isFullScreen: false,
error: false,
fieldResult: {
questionId: props.data.id,
value: '',
error: false
},
requiredMessage: ''
};
return _this;
}
(0, _createClass2["default"])(Long_Text, [{
key: "validationMessage",
value: function validationMessage(type) {
switch (type) {
case 'Alphabetic':
return "Please enter alphabets only";
break;
case 'AlphaNumeric':
return "Please enter alphanumeric characters only";
break;
// case 'Currency': return "Enter value in the currency format xx.xx";
// break;
// case 'Cyrillic':
// break;
// case 'Email': return "Please enter a valid Email";
// break;
// case 'Numeric': return "Please enter only numeric values";
// break;
// case 'URL': return "Invalid URL. Please enter a Valid URL"
// break;
default:
break;
}
}
}, {
key: "render",
value: function render() {
var _React$createElement,
_React$createElement2,
_this2 = this;
var fieldVariant = "";
var propsData = this.props.data;
var customOptions = this.props.data.customOptions;
console.log(customOptions);
var inputProps = {};
if (this.props.globalStyles) {
fieldVariant = !this.props.globalStyles.formDefault && propsData.hasOwnProperty("fieldVariant") ? propsData.fieldVariant : this.props.globalStyles.globalFieldVariant;
} else {
if (propsData.fieldVariant) fieldVariant = propsData.fieldVariant;
}
var validation = " (Validation: " + customOptions.validationType + ")";
var inputWidth = "100%"; // if (this.props.data.inputFieldSize == 'large') {
// inputWidth = "100%";
// } else if (this.props.data.inputFieldSize == 'medium') {
// inputWidth = "50%";
// } else if (this.props.data.inputFieldSize == 'small') {
// inputWidth = "25%";
// }
var disabled = this.props.read_only || false;
return /*#__PURE__*/_react["default"].createElement("div", {
className: "SortableItem rfb-item"
}, /*#__PURE__*/_react["default"].createElement(_componentHeader["default"], this.props), /*#__PURE__*/_react["default"].createElement("div", {
className: "form-group"
}, customOptions.editorMode.toLowerCase() === 'plain_text' && /*#__PURE__*/_react["default"].createElement(_core.TextField, (_React$createElement = {
size: "small",
style: {
width: inputWidth
},
rows: 1,
multiline: true,
variant: "outlined",
id: this.props.id,
onBlur: this.textChange
}, (0, _defineProperty2["default"])(_React$createElement, "variant", fieldVariant), (0, _defineProperty2["default"])(_React$createElement, "label", propsData.label), (0, _defineProperty2["default"])(_React$createElement, "inputProps", inputProps), (0, _defineProperty2["default"])(_React$createElement, "placeholder", propsData.label), (0, _defineProperty2["default"])(_React$createElement, "error", this.state.error), (0, _defineProperty2["default"])(_React$createElement, "value", this.state.inputText), (0, _defineProperty2["default"])(_React$createElement, "name", this.props.data.fieldName), (0, _defineProperty2["default"])(_React$createElement, "onChange", this.textChange), (0, _defineProperty2["default"])(_React$createElement, "required", propsData.customOptions.required), (0, _defineProperty2["default"])(_React$createElement, "disabled", disabled), (0, _defineProperty2["default"])(_React$createElement, "InputLabelProps", {
shrink: true,
classes: {
asterisk: 'text-error'
}
}), (0, _defineProperty2["default"])(_React$createElement, "helperText", this.state.error && this.state.requiredMessage && propsData.customOptions.required ? this.state.requiredMessage : this.state.error && customOptions.isLimitEntry && customOptions.limitType.toLowerCase() === 'characters' && this.state.inputText.length < customOptions.min ? "Minimun ".concat(customOptions.limitType, " limit is ").concat(customOptions.min) : this.state.error && customOptions.isLimitEntry && customOptions.limitType.toLowerCase() === 'characters' && this.state.inputText.length > customOptions.max ? "Maximum ".concat(customOptions.limitType, " limit is ").concat(customOptions.max) : this.state.error && customOptions.isLimitEntry && customOptions.limitType.toLowerCase() === 'words' && this.state.inputText.split(' ').length - 1 < customOptions.min ? "Minimun ".concat(customOptions.limitType, " limit is ").concat(customOptions.min) : this.state.error && customOptions.isLimitEntry && customOptions.limitType.toLowerCase() === 'words' && this.state.inputText.split(' ').length - 1 >= customOptions.max ? "Maximum ".concat(customOptions.limitType, " limit is ").concat(customOptions.max) : this.state.error ? this.validationMessage(customOptions.validationType) : validation), _React$createElement)), customOptions.editorMode.toLowerCase() === 'rich_text' && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(EditorConvertToHTML, {
required: propsData.customOptions.required
})), customOptions.editorMode.toLowerCase() === 'full_screen' && (!this.state.isFullScreen ? /*#__PURE__*/_react["default"].createElement("div", {
style: {
position: 'relative'
}
}, /*#__PURE__*/_react["default"].createElement(_core.IconButton, {
style: {
position: 'absolute',
right: '0',
zIndex: '10'
},
onClick: this.fullScreen
}, /*#__PURE__*/_react["default"].createElement(_AspectRatioRounded["default"], null)), /*#__PURE__*/_react["default"].createElement(_core.TextField, (_React$createElement2 = {
fullWidth: true,
rows: 4,
multiline: true,
variant: "outlined",
id: this.props.id
}, (0, _defineProperty2["default"])(_React$createElement2, "variant", fieldVariant), (0, _defineProperty2["default"])(_React$createElement2, "onBlur", this.textChange), (0, _defineProperty2["default"])(_React$createElement2, "label", propsData.label), (0, _defineProperty2["default"])(_React$createElement2, "inputProps", inputProps), (0, _defineProperty2["default"])(_React$createElement2, "value", this.state.inputText), (0, _defineProperty2["default"])(_React$createElement2, "error", this.state.error), (0, _defineProperty2["default"])(_React$createElement2, "name", this.props.data.fieldName), (0, _defineProperty2["default"])(_React$createElement2, "onChange", this.textChange), (0, _defineProperty2["default"])(_React$createElement2, "placeholder", "(Full Screen) Type here.."), (0, _defineProperty2["default"])(_React$createElement2, "required", propsData.customOptions.required), (0, _defineProperty2["default"])(_React$createElement2, "helperText", this.state.error ? this.validationMessage(customOptions.validationType) : validation), _React$createElement2))) : /*#__PURE__*/_react["default"].createElement(CustomModal, (0, _extends2["default"])({}, this.props, {
fieldVariant: fieldVariant,
propsData: propsData,
customOptions: customOptions,
value: this.state.inputText,
error: this.state.error,
onBlur: this.textChange.bind(this),
onChange: this.textChange.bind(this),
fullScreen: function fullScreen() {
return _this2.fullScreen.bind(_this2);
}
})))));
}
}]);
return Long_Text;
}(_react["default"].Component);
exports["default"] = Long_Text;
function getModalStyle() {
var top = 50;
var left = 50;
return {
top: "".concat(top, "%"),
left: "".concat(left, "%"),
display: 'flex',
flexDirection: 'column',
transform: "translate(-".concat(top, "%, -").concat(left, "%)")
};
}
var useStyles = (0, _styles.makeStyles)(function (theme) {
return {
paper: {
position: "absolute",
width: '90%',
height: 'fit-content',
backgroundColor: theme.palette.background.paper,
boxShadow: theme.shadows[5],
padding: theme.spacing(4),
outline: "none"
},
closeButton: {
padding: '5px',
width: 'fit-content',
marginTop: '20px',
alignSelf: 'center'
}
};
});
function CustomModal(props) {
var _React$createElement3;
var classes = useStyles();
var _useState = (0, _react.useState)(getModalStyle),
_useState2 = (0, _slicedToArray2["default"])(_useState, 1),
modalStyle = _useState2[0];
var validation = " (Validation: " + props.customOptions.validationType + ")";
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_Modal["default"], {
"aria-labelledby": "simple-modal-title",
"aria-describedby": "simple-modal-description",
open: true,
disableBackdropClick: true,
disableEscapeKeyDown: true
}, /*#__PURE__*/_react["default"].createElement("div", {
style: modalStyle,
className: classes.paper
}, /*#__PURE__*/_react["default"].createElement(_core.TextField, (_React$createElement3 = {
fullWidth: true,
rows: 15,
multiline: true,
id: props.id,
variant: "outlined",
value: props.value,
error: props.error,
name: props.data.fieldName
}, (0, _defineProperty2["default"])(_React$createElement3, "variant", props.fieldVariant), (0, _defineProperty2["default"])(_React$createElement3, "label", props.propsData.label), (0, _defineProperty2["default"])(_React$createElement3, "inputProps", props.inputProps), (0, _defineProperty2["default"])(_React$createElement3, "onBlur", function onBlur(e) {
return props.onBlur(e);
}), (0, _defineProperty2["default"])(_React$createElement3, "placeholder", "(Full Screen) Type here.."), (0, _defineProperty2["default"])(_React$createElement3, "onChange", function onChange(e) {
return props.onChange(e);
}), (0, _defineProperty2["default"])(_React$createElement3, "required", props.propsData.customOptions.required), (0, _defineProperty2["default"])(_React$createElement3, "helperText", props.customOptions.isLimitEntry ? "Enter " + props.customOptions.limitType + " between " + props.customOptions.min + " and " + props.customOptions.max + validation : "" + validation), (0, _defineProperty2["default"])(_React$createElement3, "rowsMax", 22), _React$createElement3)), /*#__PURE__*/_react["default"].createElement(_core.Button, {
variant: "contained",
color: "primary",
onClick: props.fullScreen(),
className: classes.closeButton
}, "Close"))));
}
var toolbar = {
options: ['inline', 'list', 'textAlign', 'fontSize', 'link', 'history'],
inline: {
inDropdown: false,
className: undefined,
options: ['bold', 'italic', 'underline', 'superscript', 'subscript']
}
};
var EditorConvertToHTML = /*#__PURE__*/function (_React$Component2) {
(0, _inherits2["default"])(EditorConvertToHTML, _React$Component2);
var _super2 = _createSuper(EditorConvertToHTML);
function EditorConvertToHTML(props) {
var _this3;
(0, _classCallCheck2["default"])(this, EditorConvertToHTML);
_this3 = _super2.call(this, props);
_this3.state = {
content: ''
};
return _this3;
}
(0, _createClass2["default"])(EditorConvertToHTML, [{
key: "convertFromHTML",
value: function convertFromHTML(content) {
var newContent = (0, _draftJs.convertFromHTML)(content);
if (!newContent.contentBlocks || !newContent.contentBlocks.length) {
// to prevent crash when no contents in editor
return _draftJs.EditorState.createEmpty();
}
var contentState = _draftJs.ContentState.createFromBlockArray(newContent);
return _draftJs.EditorState.createWithContent(contentState);
}
}, {
key: "onEditorStateChange",
value: function onEditorStateChange(index, property, editorContent) {
var html = (0, _draftjsToHtml["default"])((0, _draftJs.convertToRaw)(editorContent.getCurrentContent())).replace(/<p>/g, '').replace(/<\/p>/g, '').replace(/ /g, ' ').replace(/(?:\r\n|\r|\n)/g, ' ');
this.setState({
content: html
});
}
}, {
key: "render",
value: function render() {
var editorState = this.convertFromHTML(this.state.content);
return /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(_reactDraftWysiwyg.Editor, {
toolbar: toolbar,
placeholder: "Type here..",
toolbarClassName: "toolbarClassName",
wrapperClassName: "wrapperClassName",
editorClassName: "editorClassName",
defaultEditorState: editorState,
onEditorStateChange: this.onEditorStateChange.bind(this, 0, 'content'),
stripPastedStyles: true
}));
}
}]);
return EditorConvertToHTML;
}(_react["default"].Component); // NOT USING THE MUI EDITOR
exports.EditorConvertToHTML = EditorConvertToHTML;
var defaultTheme = (0, _styles.createMuiTheme)();
Object.assign(defaultTheme, {
overrides: {
MUIRichTextEditor: {
root: {
marginTop: 20,
width: "80%"
},
editor: {
borderBottom: "1px solid gray"
}
}
}
});
var MyBlock = function MyBlock(props) {
return /*#__PURE__*/_react["default"].createElement("div", {
style: {
padding: 10,
backgroundColor: "#ebebeb"
}
}, "My Block content is:", props.children);
};
function MUIEditor() {
return /*#__PURE__*/_react["default"].createElement("div", {
style: {
paddingTop: '0px',
paddingBottom: '50px',
paddingLeft: '10px',
border: '1px solid #cecece',
borderRadius: '5px'
}
}, /*#__PURE__*/_react["default"].createElement(_styles.MuiThemeProvider, {
theme: defaultTheme
}, /*#__PURE__*/_react["default"].createElement(_muiRte["default"], {
controls: ["my-callback"],
customControls: [{
name: "my-callback",
icon: /*#__PURE__*/_react["default"].createElement(_Done["default"], null),
type: "callback",
onClick: function onClick(editorState, name, anchor) {
// console.log(`Clicked ${name} control`)
return _draftJs.EditorState.createEmpty();
}
}]
})));
}