UNPKG

@novin-dev/formalite

Version:

Generate MUI form with few line of code

214 lines (207 loc) 11.9 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var tslib = require('tslib'); var React = require('react'); var material = require('@mui/material'); var utils$1 = require('../../../config/utils.js'); var styles = require('@mui/material/styles'); var reactDropzone = require('react-dropzone'); var BlockContent = require('../Components/BlockContent.js'); var RejectionFiles = require('../Components/RejectionFiles.js'); var SkeletonBase = require('../../Bases/SkeletonBase.js'); var memo = require('../../Bases/functions/memo.js'); var MultiFilePreview = require('../Components/MultiFilePreview.js'); var SmallBlockContent = require('../Components/SmallBlockContent.js'); var utils = require('../utils.js'); var utils$2 = require('../../../../../config/utils.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var React__default = /*#__PURE__*/_interopDefaultLegacy(React); var DropZoneStyle = styles.styled("div")(function (_a) { var theme = _a.theme; return ({ outline: "none", overflow: "hidden", position: "relative", padding: theme.spacing(4, 1), borderRadius: theme.shape.borderRadius, transition: theme.transitions.create("padding"), backgroundColor: theme.palette.grey[theme.palette.mode === "light" ? 200 : 800], border: "1px dashed ".concat(styles.alpha(theme.palette.grey[500], 0.32)), "&:hover": { background: styles.alpha(theme.palette.grey[theme.palette.mode === "light" ? 200 : 800], 0.72), cursor: "pointer", }, }); }); var MultiDropZoneView = function (props // eslint-disable-next-line sonarjs/cognitive-complexity ) { var allData = props.allData, name = props.name, formik = props.formik, loading = props.loading, validationSchema = props.validationSchema, translator = props.translator; var onUpload = allData.onUpload, inputProps = allData.inputProps, layoutProps = allData.layoutProps, onDelete = allData.onDelete, imageDownloader = allData.imageDownloader, showPreview = allData.showPreview, _a = allData.isSmallView, isSmallView = _a === void 0 ? false : _a; var _b = inputProps.dropZoneOptions, dropZoneOptions = _b === void 0 ? {} : _b, helperText = inputProps.helperText; var _c = React.useState(utils.fixDropZoneDefaultValue(utils$1.getData({ source: formik.values, key: name }) || [])), file = _c[0], setFile = _c[1]; var ref = React.useRef(null); var theme = material.useTheme(); var _d = React.useState(false), isLessMd = _d[0], setIsLessMd = _d[1]; React.useLayoutEffect(function () { var _a; setIsLessMd((((_a = ref.current) === null || _a === void 0 ? void 0 : _a.offsetWidth) || 0) < theme.breakpoints.values.sm); }, []); var isRequired = utils$1.checkIsMin({ schema: validationSchema, formikValues: formik.values, key: String(name), }); var uploadController = new AbortController(); var handleSetFile = function (item, newData) { setFile(function (pre) { var temp = tslib.__spreadArray([], pre, true); if (item.original === "default") { var index = pre.findIndex(function (i) { return i.uid === item.uid; }); if (index > -1) { temp[index] = newData; } } return temp; }); }; var uploadFunction = React.useCallback(function (item) { onUpload(item, function (progress) { setFile(function (pre) { var tempArray = tslib.__spreadArray([], pre, true); var index = pre.findIndex(function (i) { return i.uid === item.uid; }); if (tempArray[index].original === "selected") { tempArray[index].progress = progress; tempArray[index].status = "uploading"; } return tempArray; }); }, uploadController) .then(function (resId) { setFile(function (pre) { var tempArray = tslib.__spreadArray([], pre, true); var index = pre.findIndex(function (i) { return i.uid === item.uid; }); if (tempArray[index].original === "selected") { tempArray[index].uid = resId || "".concat(Date.now(), "*").concat(tempArray[index].uid); tempArray[index].status = "done"; tempArray[index].progress = 100; } formik.setFieldValue(String(name), tempArray); return tempArray; }); }) .catch(function (e) { setFile(function (pre) { var tempArray = tslib.__spreadArray([], pre, true); var index = pre.findIndex(function (i) { return i.uid === item.uid; }); if (tempArray[index].original === "selected") { tempArray[index].status = "error"; tempArray[index].errorText = e.message; } return tempArray; }); }); }, []); React.useEffect(function () { file.forEach(function (item) { var controller = new AbortController(); if (item.original === "default" && item.status === "not_downloaded") { if (imageDownloader) { var newDataForDefaults = Object.assign(item, { status: "downloading", }); handleSetFile(item, newDataForDefaults); imageDownloader(item.preview, item.controller) .then(function (res) { var newData = Object.assign(item, { original: "default", status: "done", base64: res.base64, preview: res.base64, originalName: res.originalName, size: res.size, errorText: "", controller: controller, }); handleSetFile(item, newData); }) .catch(function (e) { var newData = Object.assign(item, { original: "default", status: "error", errorText: e.message, }); handleSetFile(item, newData); }); } else { var newData = Object.assign(item, { original: "default", status: "done", base64: item.preview, preview: item.preview, originalName: utils$2.getNameFromUrl(item.preview), size: 0, errorText: "", controller: controller, }); handleSetFile(item, newData); } } }); }, [formik.values[name]]); var _e = reactDropzone.useDropzone(tslib.__assign(tslib.__assign({ multiple: true }, dropZoneOptions), { onDrop: function (acceptedFiles) { var tempFile = acceptedFiles.map(function (item) { return Object.assign(item, { original: "selected", status: "uploading", progress: 0, uid: new Date().getTime().toString(), preview: URL.createObjectURL(item), errorText: "", controller: new AbortController(), }); }); setFile(function (pre) { return tslib.__spreadArray(tslib.__spreadArray([], pre, true), tempFile, true); }); tempFile.forEach(function (item) { return uploadFunction(item); }); } })), inputRef = _e.inputRef, getRootProps = _e.getRootProps, getInputProps = _e.getInputProps, isDragActive = _e.isDragActive, isDragReject = _e.isDragReject, fileRejections = _e.fileRejections; if (loading) { return (React__default["default"].createElement(material.Grid, tslib.__assign({ item: true }, allData.layoutProps), React__default["default"].createElement(SkeletonBase.TextViewSkeleton, { height: isSmallView ? 126 : 253, hasHelper: !!helperText }))); } return (React__default["default"].createElement(material.Grid, tslib.__assign({ item: true }, layoutProps, { id: String(name), ref: ref }), inputProps.label && (React__default["default"].createElement(material.FormLabel, { component: "legend", required: utils$1.checkIsMin({ schema: validationSchema, formikValues: formik.values, key: String(name), }) }, inputProps.label)), React__default["default"].createElement(DropZoneStyle, tslib.__assign({}, getRootProps(), { sx: function () { return (tslib.__assign(tslib.__assign({}, (isDragActive && { opacity: 0.72 })), ((isDragReject || (utils$1.getData({ source: formik.errors, key: name }) && utils$1.getData({ source: formik.touched, key: name }))) && { color: "error.main", borderColor: "error.light", bgcolor: "error.lighter", padding: theme.spacing(isSmallView ? 3 : 5, 1), }))); } }), React__default["default"].createElement("input", tslib.__assign({}, getInputProps(), { ref: inputRef, "data-testid": "drop-input" })), isSmallView ? (React__default["default"].createElement(SmallBlockContent["default"], { required: isRequired })) : (React__default["default"].createElement(BlockContent["default"], { uploadController: new AbortController(), file: null, required: isRequired, uploadFunction: uploadFunction, isLessMd: isLessMd }))), fileRejections.length > 0 || (file.length && file.some(function (item) { return item.status === "error"; })) ? (React__default["default"].createElement(RejectionFiles["default"], { fileRejections: fileRejections, fileState: file.find(function (item) { return item.status === "error"; }) })) : null, React__default["default"].createElement(MultiFilePreview["default"], { files: file, showPreview: !!showPreview, onRemove: onDelete, setFile: setFile, setToFormik: function (newValue) { formik.setFieldValue(String(name), newValue); }, uploadFunction: uploadFunction, uploadController: uploadController }), helperText || (utils$1.getData({ source: formik.touched, key: name }) && Boolean(utils$1.getData({ source: formik.errors, key: name }))) ? (React__default["default"].createElement(material.FormControl, null, React__default["default"].createElement(material.FormHelperText, { error: utils$1.getData({ source: formik.touched, key: name }) && Boolean(utils$1.getData({ source: formik.errors, key: name })) }, utils$1.getData({ source: formik.touched, key: name }) && utils$1.getData({ source: formik.errors, key: name }) ? translator(utils$1.getData({ source: formik.errors, key: name })) : helperText))) : null)); }; var MultiDropZoneView$1 = React__default["default"].memo(MultiDropZoneView, function (prevProps, nextProps) { return memo.baseMemo(prevProps, nextProps); }); exports["default"] = MultiDropZoneView$1; //# sourceMappingURL=MultiDropZoneView.js.map