@novin-dev/formalite
Version:
Generate MUI form with few line of code
178 lines (175 loc) • 10.5 kB
JavaScript
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