build and format

This commit is contained in:
2025-12-17 14:53:19 +03:30
parent 633da895c2
commit f78ee620cd
244 changed files with 16542 additions and 16551 deletions

View File

@@ -1,57 +1,57 @@
import LtrTextField from "@/core/components/LtrTextField";
import { useState } from "react";
import { useWatch } from "react-hook-form";
const LocationInputs = ({ control, setValue, errors }) => {
const StartPoint = useWatch({ control, name: "start_point" });
const [coords, setCoords] = useState(StartPoint ? `${StartPoint.lat},${StartPoint.lng}` : "");
const [error, setError] = useState(false);
return (
<LtrTextField
autoComplete="off"
size="small"
label="عرض و طول جغرافیایی (Latitude, Longitude)"
placeholder="مثال: 35.7219, 51.3347"
fullWidth
helperText={
error
? "فرمت یا محدوده مقادیر معتبر نیست (ابتدا عرض جغرافیایی + , + انتها طول جغرافیایی)"
: errors.start_point
? errors.start_point.message
: "ابتدا عرض جغرافیایی + , + انتها طول جغرافیایی"
}
error={error || errors.start_point}
value={coords}
onChange={(e) => {
const value = e.target.value.trim();
setCoords(value);
if (value === "") {
setValue("start_point", null);
setError(false);
return;
}
const parts = value.split(",").map((p) => p.trim());
if (parts.length !== 2) {
setError(true);
return;
}
const lat = Number(parts[0]);
const lng = Number(parts[1]);
if (!isNaN(lat) && !isNaN(lng) && lat >= 25 && lat <= 40 && lng >= 44 && lng <= 64) {
setValue("start_point", { lat: lat, lng: lng });
setError(false);
} else {
setValue("start_point", null);
setError(true);
}
}}
InputLabelProps={{ shrink: true }}
/>
);
};
export default LocationInputs;
import LtrTextField from "@/core/components/LtrTextField";
import { useState } from "react";
import { useWatch } from "react-hook-form";
const LocationInputs = ({ control, setValue, errors }) => {
const StartPoint = useWatch({ control, name: "start_point" });
const [coords, setCoords] = useState(StartPoint ? `${StartPoint.lat},${StartPoint.lng}` : "");
const [error, setError] = useState(false);
return (
<LtrTextField
autoComplete="off"
size="small"
label="عرض و طول جغرافیایی (Latitude, Longitude)"
placeholder="مثال: 35.7219, 51.3347"
fullWidth
helperText={
error
? "فرمت یا محدوده مقادیر معتبر نیست (ابتدا عرض جغرافیایی + , + انتها طول جغرافیایی)"
: errors.start_point
? errors.start_point.message
: "ابتدا عرض جغرافیایی + , + انتها طول جغرافیایی"
}
error={error || errors.start_point}
value={coords}
onChange={(e) => {
const value = e.target.value.trim();
setCoords(value);
if (value === "") {
setValue("start_point", null);
setError(false);
return;
}
const parts = value.split(",").map((p) => p.trim());
if (parts.length !== 2) {
setError(true);
return;
}
const lat = Number(parts[0]);
const lng = Number(parts[1]);
if (!isNaN(lat) && !isNaN(lng) && lat >= 25 && lat <= 40 && lng >= 44 && lng <= 64) {
setValue("start_point", { lat: lat, lng: lng });
setError(false);
} else {
setValue("start_point", null);
setError(true);
}
}}
InputLabelProps={{ shrink: true }}
/>
);
};
export default LocationInputs;

View File

@@ -1,13 +1,13 @@
import { Download } from "@mui/icons-material";
import { IconButton, Tooltip } from "@mui/material";
const ButtonDownload = ({ url, title }) => {
return (
<Tooltip title={title}>
<IconButton href={url} target="_blank" color="primary" rel="noopener noreferrer">
<Download />
</IconButton>
</Tooltip>
);
};
export default ButtonDownload;
import { Download } from "@mui/icons-material";
import { IconButton, Tooltip } from "@mui/material";
const ButtonDownload = ({ url, title }) => {
return (
<Tooltip title={title}>
<IconButton href={url} target="_blank" color="primary" rel="noopener noreferrer">
<Download />
</IconButton>
</Tooltip>
);
};
export default ButtonDownload;

View File

@@ -1,26 +1,26 @@
import { Close } from "@mui/icons-material";
import { Dialog, DialogTitle, IconButton } from "@mui/material";
import ChangeStatusForm from "./Form";
const ChangeStatusDialog = ({ open, setOpen, mutate, row }) => {
return (
<Dialog open={open} fullWidth maxWidth="xs">
<IconButton
aria-label="close"
onClick={() => setOpen(false)}
sx={(theme) => ({
position: "absolute",
right: 8,
top: 8,
zIndex: 50,
color: theme.palette.grey[500],
})}
>
<Close />
</IconButton>
<DialogTitle>تغییر وضعیت</DialogTitle>
{open && <ChangeStatusForm setOpen={setOpen} mutate={mutate} row={row} />}
</Dialog>
);
};
export default ChangeStatusDialog;
import { Close } from "@mui/icons-material";
import { Dialog, DialogTitle, IconButton } from "@mui/material";
import ChangeStatusForm from "./Form";
const ChangeStatusDialog = ({ open, setOpen, mutate, row }) => {
return (
<Dialog open={open} fullWidth maxWidth="xs">
<IconButton
aria-label="close"
onClick={() => setOpen(false)}
sx={(theme) => ({
position: "absolute",
right: 8,
top: 8,
zIndex: 50,
color: theme.palette.grey[500],
})}
>
<Close />
</IconButton>
<DialogTitle>تغییر وضعیت</DialogTitle>
{open && <ChangeStatusForm setOpen={setOpen} mutate={mutate} row={row} />}
</Dialog>
);
};
export default ChangeStatusDialog;

View File

@@ -1,96 +1,96 @@
import SelectBox from "@/core/components/SelectBox";
import StyledForm from "@/core/components/StyledForm";
import { CHANGE_STATUS_RECEIPT } from "@/core/utils/routes";
import useRequest from "@/lib/hooks/useRequest";
import { yupResolver } from "@hookform/resolvers/yup";
import { Beenhere, ExitToApp } from "@mui/icons-material";
import { Button, DialogActions, DialogContent, Grid, Stack } from "@mui/material";
import { Controller, useForm } from "react-hook-form";
import { object, string } from "yup";
const validationSchema = object({
status: string().required("وضعیت را مشخص کنید!"),
});
const ChangeStatusForm = ({ setOpen, mutate, row }) => {
const requestServer = useRequest({ notificationSuccess: true });
const defaultValues = {
status: row.original.status || "",
};
const handleClose = () => {
setOpen(false);
};
const {
control,
handleSubmit,
formState: { isSubmitting },
} = useForm({
defaultValues,
resolver: yupResolver(validationSchema),
mode: "all",
});
const onSubmitBase = async (data) => {
const formData = new FormData();
formData.append("status_id", data.status);
await requestServer(`${CHANGE_STATUS_RECEIPT}/${row.original.id}`, "post", {
data: formData,
})
.then((response) => {
mutate();
setOpen(false);
})
.catch((error) => {});
};
return (
<StyledForm onSubmit={handleSubmit(onSubmitBase)}>
<DialogContent dividers sx={{ overflowY: "auto", maxHeight: "70vh" }}>
<Stack>
<Grid container spacing={2}>
<Grid item xs={12} sm={12} sx={{ display: "flex", alignItems: "center" }}>
<Controller
control={control}
name={"status"}
render={({ field, fieldState: { error } }) => (
<SelectBox
value={field.value}
label="وضعیت"
selectors={[
{ id: 0, name_fa: "بدون اقدام" },
{ id: 1, name_fa: "صدور نامه بیمه و کارشناسی داغی" },
{ id: 2, name_fa: "فیش ها ثبت شده است" },
{ id: 3, name_fa: "فاکتور صادر شده است" },
{ id: 4, name_fa: "فاکتور پرداخت شده است" },
{ id: 5, name_fa: "نامه پلیس راه صادر شده است" },
]}
schema={{ name: "name_fa", value: "id" }}
error={error}
onChange={field.onChange}
helperText={error?.message}
/>
)}
/>
</Grid>
</Grid>
</Stack>
</DialogContent>
<DialogActions sx={{ alignItems: "center", justifyContent: "center" }}>
<Button
onClick={handleClose}
variant="outlined"
color="secondary"
size="large"
startIcon={<ExitToApp />}
>
بستن
</Button>
<Button variant="contained" size="large" disabled={isSubmitting} type={"submit"} endIcon={<Beenhere />}>
{isSubmitting ? "در حال ثبت" : "ثبت"}
</Button>
</DialogActions>
</StyledForm>
);
};
export default ChangeStatusForm;
import SelectBox from "@/core/components/SelectBox";
import StyledForm from "@/core/components/StyledForm";
import { CHANGE_STATUS_RECEIPT } from "@/core/utils/routes";
import useRequest from "@/lib/hooks/useRequest";
import { yupResolver } from "@hookform/resolvers/yup";
import { Beenhere, ExitToApp } from "@mui/icons-material";
import { Button, DialogActions, DialogContent, Grid, Stack } from "@mui/material";
import { Controller, useForm } from "react-hook-form";
import { object, string } from "yup";
const validationSchema = object({
status: string().required("وضعیت را مشخص کنید!"),
});
const ChangeStatusForm = ({ setOpen, mutate, row }) => {
const requestServer = useRequest({ notificationSuccess: true });
const defaultValues = {
status: row.original.status || "",
};
const handleClose = () => {
setOpen(false);
};
const {
control,
handleSubmit,
formState: { isSubmitting },
} = useForm({
defaultValues,
resolver: yupResolver(validationSchema),
mode: "all",
});
const onSubmitBase = async (data) => {
const formData = new FormData();
formData.append("status_id", data.status);
await requestServer(`${CHANGE_STATUS_RECEIPT}/${row.original.id}`, "post", {
data: formData,
})
.then((response) => {
mutate();
setOpen(false);
})
.catch((error) => {});
};
return (
<StyledForm onSubmit={handleSubmit(onSubmitBase)}>
<DialogContent dividers sx={{ overflowY: "auto", maxHeight: "70vh" }}>
<Stack>
<Grid container spacing={2}>
<Grid item xs={12} sm={12} sx={{ display: "flex", alignItems: "center" }}>
<Controller
control={control}
name={"status"}
render={({ field, fieldState: { error } }) => (
<SelectBox
value={field.value}
label="وضعیت"
selectors={[
{ id: 0, name_fa: "بدون اقدام" },
{ id: 1, name_fa: "صدور نامه بیمه و کارشناسی داغی" },
{ id: 2, name_fa: "فیش ها ثبت شده است" },
{ id: 3, name_fa: "فاکتور صادر شده است" },
{ id: 4, name_fa: "فاکتور پرداخت شده است" },
{ id: 5, name_fa: "نامه پلیس راه صادر شده است" },
]}
schema={{ name: "name_fa", value: "id" }}
error={error}
onChange={field.onChange}
helperText={error?.message}
/>
)}
/>
</Grid>
</Grid>
</Stack>
</DialogContent>
<DialogActions sx={{ alignItems: "center", justifyContent: "center" }}>
<Button
onClick={handleClose}
variant="outlined"
color="secondary"
size="large"
startIcon={<ExitToApp />}
>
بستن
</Button>
<Button variant="contained" size="large" disabled={isSubmitting} type={"submit"} endIcon={<Beenhere />}>
{isSubmitting ? "در حال ثبت" : "ثبت"}
</Button>
</DialogActions>
</StyledForm>
);
};
export default ChangeStatusForm;

View File

@@ -1,19 +1,19 @@
import { Reply } from "@mui/icons-material";
import { IconButton, Tooltip } from "@mui/material";
import { useState } from "react";
import ChangeStatusDialog from "./Dialog";
const ChangeStatus = ({ row, mutate }) => {
const [open, setOpen] = useState(false);
return (
<>
<Tooltip title="تغییر وضعیت">
<IconButton color="primary" onClick={() => setOpen(true)}>
<Reply />
</IconButton>
</Tooltip>
<ChangeStatusDialog open={open} setOpen={setOpen} mutate={mutate} row={row} />
</>
);
};
export default ChangeStatus;
import { Reply } from "@mui/icons-material";
import { IconButton, Tooltip } from "@mui/material";
import { useState } from "react";
import ChangeStatusDialog from "./Dialog";
const ChangeStatus = ({ row, mutate }) => {
const [open, setOpen] = useState(false);
return (
<>
<Tooltip title="تغییر وضعیت">
<IconButton color="primary" onClick={() => setOpen(true)}>
<Reply />
</IconButton>
</Tooltip>
<ChangeStatusDialog open={open} setOpen={setOpen} mutate={mutate} row={row} />
</>
);
};
export default ChangeStatus;