complete validation and make validation for between type on numeric and date inputs

This commit is contained in:
2024-06-15 14:28:24 +03:30
parent c599ae74ae
commit fd727b9cff
5 changed files with 35 additions and 26 deletions

View File

@@ -63,24 +63,25 @@ function FilterBody({columns, drawerState, setDrawerState}) {
const validationSchema = Yup.object().shape( const validationSchema = Yup.object().shape(
columns.reduce((acc, column) => { columns.reduce((acc, column) => {
if (column._filterFn === "between" && column.datatype === "numeric") { if (column._filterFn === "between") {
acc[column.id] = Yup.array().of(Yup.string()).test({ acc[column.id] = Yup.object().shape({
test(value, ctx) { value: Yup.array()
console.log("vavavava", value) .of(Yup.string().nullable())
const [start, end] = value.value || ["", ""]; .test({
const startInt = parseInt(start, 10); test(value, ctx) {
const endInt = parseInt(end, 10); const [start, end] = value || ["", ""];
if (start && end && endInt <= startInt) { if (column.datatype === "numeric" && start && end && parseInt(end, 10) <= parseInt(start, 10)) {
return ctx.createError({ return ctx.createError({
message: `مقدار وارده باید بیشتر از (${start}) باشد` message: `مقدار وارده باید بیشتر از (${start}) باشد`,
}); });
} else if ((start && !end) || (!start && end)) { } else if ((start && !end) || (!start && end)) {
return ctx.createError({ return ctx.createError({
message: "این بخش را تکمیل نمایید" message: "این بخش را تکمیل نمایید",
}); });
} }
return true; return true;
} },
}),
}); });
} }
return acc; return acc;

View File

@@ -70,6 +70,8 @@ function FilterBodyField({
setFieldValue={setFieldValue} setFieldValue={setFieldValue}
defaultFilterTranslation={defaultFilterTranslation} defaultFilterTranslation={defaultFilterTranslation}
handleOpenFilterBox={handleOpenFilterBox} handleOpenFilterBox={handleOpenFilterBox}
errors={errors}
touched={touched}
/> />
) : column.datatype === "array" && filterParameters.filterFn === "equals" ? ( ) : column.datatype === "array" && filterParameters.filterFn === "equals" ? (
<CustomSelectMultiple <CustomSelectMultiple

View File

@@ -4,8 +4,7 @@ import React from "react";
import {Box, Typography} from "@mui/material"; import {Box, Typography} from "@mui/material";
import MuiDatePicker from "@/core/components/DataTable/filter/fieldsType/CustomDate/MuiDatePicker"; import MuiDatePicker from "@/core/components/DataTable/filter/fieldsType/CustomDate/MuiDatePicker";
function CustomDatePickerRange({column, filterParameters, defaultFilterTranslation, setFieldValue}) { function CustomDatePickerRange({column, filterParameters, defaultFilterTranslation, setFieldValue, errors, touched}) {
return ( return (
<Box sx={{display: "flex", gap: 1}}> <Box sx={{display: "flex", gap: 1}}>
<MuiDatePicker <MuiDatePicker
@@ -26,6 +25,8 @@ function CustomDatePickerRange({column, filterParameters, defaultFilterTranslati
setFieldValue={setFieldValue} setFieldValue={setFieldValue}
minDate={filterParameters.value[0]} minDate={filterParameters.value[0]}
placeholder={`تا تاریخ`} placeholder={`تا تاریخ`}
helperText={errors?.[`${column.id}`]?.value ? errors?.[`${column.id}`]?.value : null}
error={Boolean(errors?.[`${column.id}`]?.value)}
/> />
</Box> </Box>
); );

View File

@@ -6,7 +6,12 @@ import {Box, FormHelperText, IconButton, InputAdornment} from "@mui/material";
import ClearIcon from "@mui/icons-material/Clear"; import ClearIcon from "@mui/icons-material/Clear";
import moment from "jalali-moment"; import moment from "jalali-moment";
function MuiDatePicker({value, setFieldValue, name, minDate, maxDate, helperText, placeholder}) { function MuiDatePicker({value, setFieldValue, name, minDate, maxDate, helperText, placeholder, error}) {
// console.log("error", error);
//
// console.log("helperText", helperText)
return ( return (
<Box sx={{display: "flex", flexDirection: "column", my: 1}}> <Box sx={{display: "flex", flexDirection: "column", my: 1}}>
<LocalizationProvider dateAdapter={AdapterDateFnsJalali} <LocalizationProvider dateAdapter={AdapterDateFnsJalali}
@@ -19,7 +24,6 @@ function MuiDatePicker({value, setFieldValue, name, minDate, maxDate, helperText
name={name} name={name}
aria-describedby="component-helper-text" aria-describedby="component-helper-text"
onChange={(value) => { onChange={(value) => {
console.log(value)
const date = new Date(value); const date = new Date(value);
const formattedDate = moment(date) const formattedDate = moment(date)
.locale("en") .locale("en")
@@ -30,6 +34,7 @@ function MuiDatePicker({value, setFieldValue, name, minDate, maxDate, helperText
maxDate={maxDate ? new Date(maxDate) : null} maxDate={maxDate ? new Date(maxDate) : null}
slotProps={{ slotProps={{
textField: { textField: {
error: error,
placeholder: placeholder, placeholder: placeholder,
InputProps: { InputProps: {
endAdornment: ( endAdornment: (
@@ -56,7 +61,7 @@ function MuiDatePicker({value, setFieldValue, name, minDate, maxDate, helperText
}, },
}} }}
/> />
<FormHelperText id="component-helper-text" sx={{ml: 2}}> <FormHelperText id="component-helper-text" sx={{ml: 2, color: error ? '#d32f2f' : "unset"}}>
{helperText ? helperText : ""} {helperText ? helperText : ""}
</FormHelperText> </FormHelperText>
</LocalizationProvider> </LocalizationProvider>

View File

@@ -21,7 +21,7 @@ function CustomTextFieldRange({
label={<Typography>از {column.header}</Typography>} label={<Typography>از {column.header}</Typography>}
value={filterParameters.value[0]} value={filterParameters.value[0]}
fullWidth fullWidth
error={touched?.[column.id] && Boolean(errors?.[column.id])} error={touched?.[`${column.id}`]?.value && Boolean(errors?.[`${column.id}`]?.value)}
helperText={<Typography variant="button" sx={{color: "#16534a"}}>نوع helperText={<Typography variant="button" sx={{color: "#16534a"}}>نوع
فیلتر: {defaultFilterTranslation}</Typography>} فیلتر: {defaultFilterTranslation}</Typography>}
variant="outlined" variant="outlined"
@@ -33,8 +33,8 @@ function CustomTextFieldRange({
name={`${column.id}.value[1]`} name={`${column.id}.value[1]`}
onChange={handleChange} onChange={handleChange}
onBlur={handleBlur} onBlur={handleBlur}
error={touched?.[column.id] && Boolean(errors?.[column.id])} error={touched?.[`${column.id}`]?.value && Boolean(errors?.[`${column.id}`]?.value)}
helperText={touched?.[column.id] ? errors?.[column.id] : null} helperText={touched?.[`${column.id}`]?.value ? errors?.[`${column.id}`]?.value : null}
label={<Typography>تا {column.header}</Typography>} label={<Typography>تا {column.header}</Typography>}
value={filterParameters.value[1]} value={filterParameters.value[1]}
fullWidth fullWidth