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