UNPKG

@novin-dev/formalite

Version:

Generate MUI form with few line of code

178 lines (175 loc) 10.5 kB
import { __rest, __spreadArray, __assign } from 'tslib'; import { Grid, alpha, InputAdornment, IconButton, FormControl, FormHelperText } from '@mui/material'; import { TextFieldBase } from '../../Bases/TextFieldBase.js'; import React, { useState, useCallback, useEffect } from 'react'; import { baseMemo } from '../../Bases/functions/memo.js'; import AttachFileIcon from '@mui/icons-material/AttachFile'; import { getData } from '../../../config/utils.js'; import { useDropzone } from 'react-dropzone'; import RejectionFiles from '../Components/RejectionFiles.js'; import MultiFilePreview from '../Components/MultiFilePreview.js'; import { fixDropZoneDefaultValue } from '../utils.js'; import { getNameFromUrl } from '../../../../../config/utils.js'; var TextDropZoneView = function (props // eslint-disable-next-line sonarjs/cognitive-complexity ) { var _a, _b; var allData = props.allData, name = props.name, formik = props.formik, loading = props.loading, validationSchema = props.validationSchema, translator = props.translator, formMustRegex = props.formMustRegex; var _c = allData.inputProps; _c.onChange; var helperText = _c.helperText, _d = _c.dropZoneOptions, dropZoneOptions = _d === void 0 ? {} : _d, inputProps = __rest(_c, ["onChange", "helperText", "dropZoneOptions"]); var onDelete = allData.onDelete, imageDownloader = allData.imageDownloader, onUpload = allData.onUpload, _e = allData.showPreview, showPreview = _e === void 0 ? false : _e; var _f = useState(fixDropZoneDefaultValue(((_a = getData({ source: formik.values, key: name })) === null || _a === void 0 ? void 0 : _a.files) || [])), file = _f[0], setFile = _f[1]; var uploadController = new AbortController(); var handleSetFile = function (item, newData) { setFile(function (pre) { var temp = __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 = useCallback(function (item) { onUpload(item, function (progress) { setFile(function (pre) { var tempArray = __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 = __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("".concat(String(name), ".files"), tempArray); return tempArray; }); }) .catch(function (e) { setFile(function (pre) { var tempArray = __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; }); }); }, []); 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: getNameFromUrl(item.preview), size: 0, errorText: "", controller: controller, }); handleSetFile(item, newData); } } }); }, [(_b = getData({ source: formik.values, key: name })) === null || _b === void 0 ? void 0 : _b.files]); var _g = useDropzone(__assign(__assign({ multiple: true, noClick: true, noKeyboard: 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: "", }); }); setFile(function (pre) { return __spreadArray(__spreadArray([], pre, true), tempFile, true); }); tempFile.forEach(function (item) { return uploadFunction(item); }); } })), getRootProps = _g.getRootProps, getInputProps = _g.getInputProps, fileRejections = _g.fileRejections, open = _g.open, isDragActive = _g.isDragActive; _g.isDragReject; var inputRef = _g.inputRef; return (React.createElement(Grid, __assign({ item: true }, allData.layoutProps, getRootProps(), { id: String(name) }), React.createElement(TextFieldBase, __assign({ formik: formik, loading: loading, validationSchema: validationSchema, translator: translator, name: "".concat(String(name), ".text"), mustRegex: [allData.mustRegex, formMustRegex] }, inputProps, { sx: function (theme) { return (__assign({ background: isDragActive ? alpha(theme.palette.grey[500], 0.2) : undefined }, (typeof inputProps.sx === "function" ? inputProps.sx(theme) : {}))); }, InputProps: __assign(__assign({}, (inputProps.InputProps || {})), { endAdornment: (React.createElement(InputAdornment, { position: "end" }, React.createElement("input", __assign({}, getInputProps(), { ref: inputRef, "data-testid": "drop-input" })), React.createElement(IconButton, { sx: allData.inputProps.multiline ? { position: "absolute", top: "8px", right: "8px", } : {}, color: getData({ source: formik.touched, key: name }) && getData({ source: formik.errors, key: "".concat(String(name), ".files"), }) ? "error" : "default", onClick: open, onMouseDown: function (e) { return e.stopPropagation(); } }, React.createElement(AttachFileIcon, null)))) }) })), !loading ? (React.createElement(React.Fragment, null, fileRejections.length > 0 || (file.length && file.some(function (item) { return item.status === "error"; })) ? (React.createElement(RejectionFiles, { fileRejections: fileRejections, fileState: file.find(function (item) { return item.status === "error"; }) })) : null, React.createElement(MultiFilePreview, { files: file, showPreview: showPreview, onRemove: onDelete, setFile: setFile, setToFormik: function (newValue) { formik.setFieldValue("".concat(String(name), ".files"), newValue); }, uploadFunction: uploadFunction, uploadController: uploadController }))) : null, helperText || (getData({ source: formik.touched, key: name }) && Boolean(getData({ source: formik.errors, key: name }))) ? (React.createElement(FormControl, null, React.createElement(FormHelperText, { error: !!getData({ source: formik.touched, key: name }) && !!getData({ source: formik.errors, key: "".concat(String(name), ".files") }) }, getData({ source: formik.touched, key: name }) && getData({ source: formik.errors, key: "".concat(String(name), ".files") }) ? translator(getData({ source: formik.errors, key: "".concat(String(name), ".files"), })) : helperText))) : null)); }; var TextDropZoneView$1 = React.memo(TextDropZoneView, function (prevProps, nextProps) { return baseMemo(prevProps, nextProps); }); export { TextDropZoneView$1 as default }; //# sourceMappingURL=TextDropZoneView.js.map