Feature/change any file

This commit is contained in:
AmirHossein Mahmoodi
2025-01-21 12:20:38 +00:00
parent dd4d01d639
commit 87e3281f60
42 changed files with 220 additions and 432 deletions

View File

@@ -1,3 +1,4 @@
HOST="rms.witel.ir"
NEXT_PUBLIC_VERSION="0.14.0" NEXT_PUBLIC_VERSION="0.14.0"
NEXT_PUBLIC_API_URL="https://rms.witel.ir" NEXT_PUBLIC_API_URL="https://rms.witel.ir"
NEXT_PUBLIC_MAPTILE_ENDPOINT="https://rmsmap.rmto.ir/141map" NEXT_PUBLIC_MAPTILE_ENDPOINT="https://rmsmap.rmto.ir/141map"

View File

@@ -5,7 +5,7 @@ const nextConfig = {
remotePatterns: [ remotePatterns: [
{ {
protocol: 'https', protocol: 'https',
hostname: 'rms.witel.ir', hostname: process.env.HOST,
}, },
], ],
}, },

View File

@@ -1,12 +0,0 @@
import TestPage from "@/components/dashboard/carDetails";
import WithPermission from "@/core/middlewares/withPermission";
const Page = () => {
return (
<WithPermission permission_name={[""]}>
<TestPage />
</WithPermission>
);
};
export default Page;

View File

@@ -1,180 +0,0 @@
import { Button, Collapse, DialogActions, DialogContent, Grid, Stack, TextField } from "@mui/material";
import MuiDatePicker from "@/core/components/MuiDatePicker";
import { useFormik } from "formik";
import moment from "jalali-moment";
import * as Yup from "yup";
import { useState } from "react";
import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail";
import DetailMap from "@/core/components/ApplicantRequestDetail/DetailMap";
import FlyToPolyline from "@/core/components/ApplicantRequestDetail/FlyToPolyline";
import { MapContainer } from "react-leaflet";
import dynamic from "next/dynamic";
import MapLoading from "@/core/components/MapLayer/Loading";
const MapLayer = dynamic(() => import("@/core/components/MapLayer"), {
loading: () => <MapLoading />,
ssr: false,
});
const fakeData = {
id: 1,
shomareh_darkhast: "2124",
ostan: "ostan",
shahr: "shahr",
shahrestan: "shahrestan",
bakhsh: "bakhsh",
roosta: "roosta",
tarikh_darkhast: "tarikh_darkhast",
sazman: "sazman",
masahat_zamin: "masahat_zamin",
masahat_tarh: "masahat_tarh",
gorooh_tarh: "gorooh_tarh",
onvane_tarh: "onvane_tarh",
address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر",
file_mosavab: "file",
polyline: [
[35.6892, 51.389],
[35.7074, 51.3929],
],
};
const CarDetailsContent = ({ setOpenCarDialog }) => {
const [openCarDetailContent, setOpenCarDetailContent] = useState(false);
const initialValues = {
start_date: "",
end_date: "",
vehicle_code: "",
};
const validationSchema = Yup.object().shape({
start_date: Yup.string().required("تاریخ شروع الزامیست!!!"),
end_date: Yup.string()
.test("is-greater", "تاریخ اتمام نمی‌تواند کمتر از تاریخ شروع باشد", function (value) {
const { start_date } = this.parent; // Access other field values
if (!value || !start_date) return true; // Skip validation if either field is empty
return moment(value, "YYYY/MM/DD").isSameOrAfter(moment(start_date, "YYYY/MM/DD"));
})
.required("تاریخ اتمام الزامیست!!!"),
vehicle_code: Yup.mixed()
.test("is-number", "کد خودرو باید عدد باشد!!!", (value) => !isNaN(value))
.test("positive", "کد خودرو باید مثبت باشد!!!", (value) => value >= 0)
.required("کد خودرو الزامیست!!!"),
});
const handleSubmit = async (values, props) => {
props.setSubmitting(true);
setOpenCarDetailContent(true);
};
const formik = useFormik({
initialValues,
validationSchema,
onSubmit: handleSubmit,
});
return (
<>
<DialogContent>
<Stack spacing={2} sx={{ my: 2 }}>
<Stack direction={"row"} spacing={2} sx={{ my: 2 }}>
<MuiDatePicker
formik={formik}
value={formik.values.start_date}
name={"start_date"}
error={formik.errors.start_date}
helperText={formik.touched.start_date && formik.errors.start_date}
touched={formik.touched.start_date}
onBlur={formik.handleBlur("start_date")}
/>
<MuiDatePicker
formik={formik}
name={"end_date"}
disabled={formik.values.start_date === ""}
value={formik.values.end_date}
error={formik.errors.end_date}
helperText={formik.touched.end_date && formik.errors.end_date}
touched={formik.touched.end_date}
onBlur={formik.handleBlur("end_date")}
/>
<TextField
name="vehicle_code"
label={"کد خودرو"}
type="text"
inputProps={{
inputMode: "number",
min: 0,
pattern: "[0-9]*",
}}
variant="outlined"
value={formik.values.vehicle_code}
onChange={(event) => {
if (!isNaN(event.target.value)) {
formik.setFieldValue("vehicle_code", event.target.value);
} else {
formik.setFieldValue("vehicle_code", formik.values.vehicle_code);
}
}}
size={"small"}
error={formik.touched.vehicle_code && Boolean(formik.errors.vehicle_code)}
helperText={formik.touched.vehicle_code && formik.errors.vehicle_code}
onBlur={formik.handleBlur("vehicle_code")}
fullWidth
/>
</Stack>
<Stack>
<Button variant={"contained"} color={"primary"} onClick={formik.handleSubmit}>
نمایش اطلاعات
</Button>
</Stack>
</Stack>
<Grid container spacing={2}>
<Grid item xs={12} sm={4}>
<Stack
direction="column"
sx={{ height: "100%", justifyContent: "start", alignItems: "center" }}
spacing={5}
>
<TextField
name="vehicle_code"
label={"مصرف سوخت خودرو"}
disabled
variant="outlined"
value={"5 لیتر"}
size={"small"}
fullWidth
/>
<TextField
name="vehicle_code"
label={"مسافت پیموده شده"}
disabled
variant="outlined"
value={"54 کیلومتر"}
size={"small"}
fullWidth
/>
<TextField
name="vehicle_code"
label={"زمان روشن بودن خودرو"}
disabled
variant="outlined"
value={"3 ساعت"}
size={"small"}
fullWidth
/>
</Stack>
</Grid>
<Grid item xs={12} sm={8}>
<MapLayer style={{ height: "400px", width: "100%" }}>
{/*<FlyToPolyline polyline={fakeData.polyline} />*/}
</MapLayer>
</Grid>
</Grid>
</DialogContent>
<DialogActions>
<Button variant={"outlined"} color={"warning"} onClick={() => setOpenCarDialog(false)}>
بستن
</Button>
</DialogActions>
</>
);
};
export default CarDetailsContent;

View File

@@ -1,44 +0,0 @@
"use client";
import PageTitle from "@/core/components/PageTitle";
import { Dialog, DialogTitle, IconButton, Stack, Tooltip } from "@mui/material";
import { useState } from "react";
import DriveEtaIcon from "@mui/icons-material/DriveEta";
import CarDetailsContent from "@/components/dashboard/carDetails/CarDetailsContent";
const TestPage = () => {
const [openCarDialog, setOpenCarDialog] = useState(false);
return (
<Stack spacing={1}>
<PageTitle title={"نمایش اطلاعات خودرو"} />
<>
<Tooltip title="نمایش اطلاعات خودرو">
<IconButton
color="primary"
onClick={() => {
setOpenCarDialog(true);
}}
>
<DriveEtaIcon />
</IconButton>
</Tooltip>
<Dialog
onClose={() => setOpenCarDialog(false)}
fullWidth
open={openCarDialog}
PaperProps={{
sx: {
transition: "all .3s",
boxShadow:
"rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px",
},
}}
maxWidth={"lg"}
>
<DialogTitle>نمایش اطلاعات خودرو</DialogTitle>
<CarDetailsContent setOpenCarDialog={setOpenCarDialog} />
</Dialog>
</>
</Stack>
);
};
export default TestPage;

View File

@@ -27,7 +27,7 @@ function TabPanel(props) {
const validationSchema = object({ const validationSchema = object({
item_id: number().required("نوع آیتم را مشخص کنید!"), item_id: number().required("نوع آیتم را مشخص کنید!"),
sub_item_id: number().required("موضوع مشاهده شده را مشخص کنید!"), sub_item_id: number().required("اقدام انجام شده را مشخص کنید!"),
amount: string().required("وارد کردن مقدار الزامیست!"), amount: string().required("وارد کردن مقدار الزامیست!"),
cmms_machines: array().required("وارد کردن کد خودرو الزامیست!").min(1, "حداقل یک کد خودرو باید وارد شود!"), cmms_machines: array().required("وارد کردن کد خودرو الزامیست!").min(1, "حداقل یک کد خودرو باید وارد شود!"),
rahdaran_id: array().required("وارد کردن کد راهداران الزامیست!").min(1, "حداقل یک کد راهدار باید وارد شود!"), // بررسی حداقل یک آیتم, rahdaran_id: array().required("وارد کردن کد راهداران الزامیست!").min(1, "حداقل یک کد راهدار باید وارد شود!"), // بررسی حداقل یک آیتم,
@@ -214,7 +214,7 @@ const CreateFormContent = ({ setOpen, onSubmit, is_gasht = false }) => {
}} }}
> >
<Tab icon={<InsertDriveFileIcon />} label="انتخاب آیتم" /> <Tab icon={<InsertDriveFileIcon />} label="انتخاب آیتم" />
<Tab disabled={tabState === 0} icon={<FileCopyIcon />} label="انتخاب موضوع مشاهده شده" /> <Tab disabled={tabState === 0} icon={<FileCopyIcon />} label="انتخاب اقدام انجام شده" />
<Tab disabled={tabState === 0 || tabState === 1} icon={<InfoIcon />} label="اطلاعات فعالیت" /> <Tab disabled={tabState === 0 || tabState === 1} icon={<InfoIcon />} label="اطلاعات فعالیت" />
</Tabs> </Tabs>
<DialogContent dividers sx={{ overflowY: "auto", maxHeight: "70vh" }}> <DialogContent dividers sx={{ overflowY: "auto", maxHeight: "70vh" }}>

View File

@@ -9,7 +9,7 @@ const GetSubItemsForm = ({ setValue, watch, setSubItemsList, tabState, setTabSta
<> <>
{errorSubItemsList ? ( {errorSubItemsList ? (
<Typography textAlign={"center"} color={"error"}> <Typography textAlign={"center"} color={"error"}>
خطا در دریافت موضوع مشاهده شده خطا در دریافت اقدام انجام شده
</Typography> </Typography>
) : loadingSubItemsList ? ( ) : loadingSubItemsList ? (
<LinearProgress /> <LinearProgress />

View File

@@ -27,14 +27,14 @@ const PreviousStatesInfo = ({ itemsList, subItemsList }) => {
icon={<FileCopyIcon />} icon={<FileCopyIcon />}
label={ label={
<Typography variant="body2" sx={{ fontWeight: 600, color: "grey.700" }}> <Typography variant="body2" sx={{ fontWeight: 600, color: "grey.700" }}>
موضوع مشاهدهشده اقدام انجام شده
</Typography> </Typography>
} }
/> />
</Box> </Box>
<Divider sx={{ flex: 1, mx: 2 }} /> <Divider sx={{ flex: 1, mx: 2 }} />
<Typography variant="body2" sx={{ fontWeight: 600, color: "grey.800" }}> <Typography variant="body2" sx={{ fontWeight: 600, color: "grey.800" }}>
{subItemsList?.name || "هیچ موضوعی انتخاب نشده است"} {subItemsList?.name || "هیچ اقدامی انتخاب نشده است"}
</Typography> </Typography>
</Grid> </Grid>
</Grid> </Grid>

View File

@@ -104,7 +104,7 @@ const GashtCreateContent = ({ mutate, setOpen, tabState, setTabState }) => {
}} }}
> >
<Tab icon={<InsertDriveFileIcon />} label="انتخاب مورد مشاهده شده" /> <Tab icon={<InsertDriveFileIcon />} label="انتخاب مورد مشاهده شده" />
<Tab disabled={tabState === 0} icon={<FileCopyIcon />} label="اطلاعات مورد مشاهده شده" /> <Tab disabled={tabState === 0} icon={<FileCopyIcon />} label="اطلاعات مورد اقدام شده" />
</Tabs> </Tabs>
<DialogContent dividers sx={{ overflowY: "auto", maxHeight: "70vh" }}> <DialogContent dividers sx={{ overflowY: "auto", maxHeight: "70vh" }}>
<Box sx={{ flex: 1 }}> <Box sx={{ flex: 1 }}>

View File

@@ -36,7 +36,7 @@ const CompleteItem = ({ subItem, itemInfo, setSubmitCompleteForm, mutate, setOpe
const validationSchema = object({ const validationSchema = object({
item_id: number().required("نوع آیتم را مشخص کنید!"), item_id: number().required("نوع آیتم را مشخص کنید!"),
sub_item_id: number().required("موضوع مشاهده شده را مشخص کنید!"), sub_item_id: number().required("اقدام انجام شده را مشخص کنید!"),
amount: string().required("وارد کردن مقدار الزامیست!"), amount: string().required("وارد کردن مقدار الزامیست!"),
cmms_machines: array().required("وارد کردن کد خودرو الزامیست!").min(1, "حداقل یک کد خودرو باید وارد شود!"), cmms_machines: array().required("وارد کردن کد خودرو الزامیست!").min(1, "حداقل یک کد خودرو باید وارد شود!"),
rahdaran_id: array().required("وارد کردن کد راهداران الزامیست!").min(1, "حداقل یک کد راهدار باید وارد شود!"), // بررسی حداقل یک آیتم, rahdaran_id: array().required("وارد کردن کد راهداران الزامیست!").min(1, "حداقل یک کد راهدار باید وارد شود!"), // بررسی حداقل یک آیتم,

View File

@@ -27,14 +27,14 @@ const PreviousStatesInfo = ({ itemInfo }) => {
icon={<FileCopyIcon />} icon={<FileCopyIcon />}
label={ label={
<Typography variant="body2" sx={{ fontWeight: 600, color: "grey.700" }}> <Typography variant="body2" sx={{ fontWeight: 600, color: "grey.700" }}>
موضوع مشاهدهشده اقدام انجام شده
</Typography> </Typography>
} }
/> />
</Box> </Box>
<Divider sx={{ flex: 1, mx: 2 }} /> <Divider sx={{ flex: 1, mx: 2 }} />
<Typography variant="body2" sx={{ fontWeight: 600, color: "grey.800" }}> <Typography variant="body2" sx={{ fontWeight: 600, color: "grey.800" }}>
{itemInfo?.sub_item_name || "هیچ موضوعی انتخاب نشده است"} {itemInfo?.sub_item_name || "هیچ اقدامی انتخاب نشده است"}
</Typography> </Typography>
</Grid> </Grid>
</Grid> </Grid>

View File

@@ -54,7 +54,7 @@ const TableInfo = ({ specialFilter, setTabState, setItemInfo }) => {
}, },
{ {
accessorKey: "sub_item_name", accessorKey: "sub_item_name",
header: وضوع مشاهده شده", header: "مشاهده انجام شده",
id: "sub_item_name", id: "sub_item_name",
enableColumnFilter: false, enableColumnFilter: false,
datatype: "text", datatype: "text",

View File

@@ -76,7 +76,7 @@ const OperatorList = () => {
}, },
{ {
accessorKey: "sub_item", accessorKey: "sub_item",
header: "موضوع مشاهده شده", header: "اقدام انجام شده",
id: "sub_item", id: "sub_item",
enableColumnFilter: true, enableColumnFilter: true,
datatype: "numeric", datatype: "numeric",
@@ -246,7 +246,7 @@ const OperatorList = () => {
</Stack> </Stack>
); );
} }
return <Typography variant="body2">کد خودرویی وجود ندارد</Typography>; return <Typography variant="body2">خودرویی وجود ندارد</Typography>;
}, },
}, },
{ {

View File

@@ -1,41 +1,44 @@
import { DialogContent, Paper, Stack, Typography, useTheme } from "@mui/material"; import { Box, DialogContent, Paper, Stack, Typography, useTheme } from "@mui/material";
import Image from "next/image";
const ImageFormContent = ({ image, title }) => { const ImageFormContent = ({ image, title }) => {
const theme = useTheme(); const theme = useTheme();
return ( return (
<DialogContent> <Stack
<Paper spacing={2}
elevation={3} alignItems="center"
justifyContent="center"
sx={{
my: 2,
padding: 2,
borderRadius: "12px",
border: `1px solid ${theme.palette.primary.main}`,
}}
>
<Typography
variant="h6"
sx={{ sx={{
padding: 2, color: theme.palette.primary.dark,
borderRadius: "12px", fontWeight: "bold",
border: `1px solid ${theme.palette.primary.main}`,
}} }}
> >
<Stack spacing={2} alignItems="center" justifyContent="center"> {title}
<Typography </Typography>
variant="h6" <Box sx={{ width: "100%", position: "relative", aspectRatio: "16/9" }}>
sx={{ <Image
color: theme.palette.primary.dark, src={image}
fontWeight: "bold", alt="Image"
}} fill={true}
> loading="lazy"
{title} style={{
</Typography> objectFit: "contain",
<img marginBottom: "16px",
src={image} borderRadius: "12px",
alt="Image" border: `1px solid ${theme.palette.divider}`,
style={{ }}
maxWidth: "100%", />
maxHeight: "200px", </Box>
marginBottom: "16px", </Stack>
borderRadius: "12px",
border: `1px solid ${theme.palette.divider}`,
}}
/>
</Stack>
</Paper>
</DialogContent>
); );
}; };
export default ImageFormContent; export default ImageFormContent;

View File

@@ -1,4 +1,4 @@
import { Button, Dialog, DialogActions, DialogTitle, IconButton, Tooltip } from "@mui/material"; import { Button, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, Paper, Tooltip } from "@mui/material";
import { useState } from "react"; import { useState } from "react";
import PhotoLibraryIcon from "@mui/icons-material/PhotoLibrary"; import PhotoLibraryIcon from "@mui/icons-material/PhotoLibrary";
import ImageFormContent from "./ImageFormContent"; import ImageFormContent from "./ImageFormContent";
@@ -22,14 +22,18 @@ const ImageDialog = ({ images }) => {
boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px", boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px",
}, },
}} }}
dir="rtl" maxWidth={"sm"}
maxWidth={"md"} scroll="paper"
> >
<DialogTitle sx={{ fontSize: "large" }}>تصاویر</DialogTitle> <DialogTitle sx={{ fontSize: "large" }}>تصاویر</DialogTitle>
<ImageFormContent image={images[1]?.full_path_for_fast_react} title={"قبل از اقدام"} /> <DialogContent>
<ImageFormContent image={images[0]?.full_path_for_fast_react} title={"بعد از اقدام"} /> <Paper elevation={0}>
<ImageFormContent image={images[1]?.full_path_for_fast_react} title={"قبل از اقدام"} />
<ImageFormContent image={images[0]?.full_path_for_fast_react} title={"بعد از اقدام"} />
</Paper>
</DialogContent>
<DialogActions> <DialogActions>
<Button onClick={() => setOpenImageDialog(false)} variant="outlined" color="secondary" autoFocus> <Button onClick={() => setOpenImageDialog(false)} variant="outlined" color="secondary">
بستن بستن
</Button> </Button>
</DialogActions> </DialogActions>

View File

@@ -7,7 +7,7 @@ const MachinesCodeDialog = ({ machinesLists }) => {
const [openMachinesCodeDialog, setOpenMachinesCodeDialog] = useState(false); const [openMachinesCodeDialog, setOpenMachinesCodeDialog] = useState(false);
return ( return (
<> <>
<Tooltip title="کد خودرو"> <Tooltip title="خودرو ها">
<IconButton color="primary" onClick={() => setOpenMachinesCodeDialog(true)}> <IconButton color="primary" onClick={() => setOpenMachinesCodeDialog(true)}>
<DirectionsCarIcon /> <DirectionsCarIcon />
</IconButton> </IconButton>
@@ -24,7 +24,7 @@ const MachinesCodeDialog = ({ machinesLists }) => {
dir="rtl" dir="rtl"
maxWidth={"md"} maxWidth={"md"}
> >
<DialogTitle sx={{ fontSize: "large" }}>کد خودرو</DialogTitle> <DialogTitle sx={{ fontSize: "large" }}>خودرو ها</DialogTitle>
<MachinesCodeContent machinesLists={machinesLists} /> <MachinesCodeContent machinesLists={machinesLists} />
<DialogActions> <DialogActions>
<Button <Button

View File

@@ -84,6 +84,7 @@ const ReportLists = ({ itemsList, data }) => {
data={data.data} data={data.data}
page_name={"roadItemReportByItems"} page_name={"roadItemReportByItems"}
table_name={"roadItemReportByItemsList"} table_name={"roadItemReportByItemsList"}
enablePagination={false}
/> />
</Box> </Box>
); );

View File

@@ -9,6 +9,7 @@ const SubItemsList = ({ data }) => {
data={data.data} data={data.data}
page_name={"roadItemReportBySubItems"} page_name={"roadItemReportBySubItems"}
table_name={"roadItemReportBySubItemsList"} table_name={"roadItemReportBySubItemsList"}
enablePagination={false}
/> />
</Box> </Box>
); );

View File

@@ -22,7 +22,7 @@ const createColumns = (sub_items) => {
columns: [ columns: [
{ {
accessorKey: `sub_item_${sub_item.sub_item}_count`, accessorKey: `sub_item_${sub_item.sub_item}_count`,
header: "تعداد", header: "تعداد اقدام",
id: `sub_item_${sub_item.sub_item}_count`, id: `sub_item_${sub_item.sub_item}_count`,
enableColumnFilter: false, enableColumnFilter: false,
enableSorting: false, enableSorting: false,
@@ -81,7 +81,7 @@ const createColumns = (sub_items) => {
size: 50, size: 50,
}, },
{ {
header: "موارد مشاهده شده فعالیت روزانه", header: "موارد اقدام شده فعالیت روزانه",
enableColumnFilter: false, enableColumnFilter: false,
id: "subItems", id: "subItems",
enableSorting: false, enableSorting: false,
@@ -228,7 +228,7 @@ const SubItemsReports = () => {
}); });
return ( return (
<Stack spacing={1}> <Stack spacing={1}>
<PageTitle title={"گزارش تعداد فعالیت ها به تفکیک موارد مشاهده شده"} /> <PageTitle title={"گزارش تعداد فعالیت ها به تفکیک موارد اقدام شده"} />
<SearchReportList <SearchReportList
control={control} control={control}
hasProvincesPermission={hasProvincesPermission} hasProvincesPermission={hasProvincesPermission}

View File

@@ -40,10 +40,12 @@ const ConfirmContent = ({ rowId, mutate, setOpenConfirmDialog }) => {
{...register("description")} {...register("description")}
multiline multiline
rows={8} rows={8}
label="توضیحات کارشناس" label="توضیحات و دلایل تأیید (اختیاری)"
placeholder="لطفاً علت تأیید خود را توضیح دهید"
fullWidth fullWidth
variant="outlined" variant="outlined"
sx={{ mt: 1 }} sx={{ mt: 1 }}
InputLabelProps={{ shrink: true }}
/> />
</Stack> </Stack>
</Stack> </Stack>
@@ -59,7 +61,7 @@ const ConfirmContent = ({ rowId, mutate, setOpenConfirmDialog }) => {
بستن بستن
</Button> </Button>
<Button onClick={handleSubmit(onSubmit)} variant="contained" color="primary" disabled={isSubmitting}> <Button onClick={handleSubmit(onSubmit)} variant="contained" color="primary" disabled={isSubmitting}>
{isSubmitting ? "درحال ارسال اطلاعات..." : "ثبت"} {isSubmitting ? "درحال ثبت تایید..." : "ثبت تایید"}
</Button> </Button>
</DialogActions> </DialogActions>
</> </>

View File

@@ -6,7 +6,7 @@ const ConfirmForm = ({ rowId, mutate }) => {
const [openConfirmDialog, setOpenConfirmDialog] = useState(false); const [openConfirmDialog, setOpenConfirmDialog] = useState(false);
return ( return (
<> <>
<Tooltip title="تایید"> <Tooltip title="تایید فعالیت">
<IconButton color="primary" onClick={() => setOpenConfirmDialog(true)}> <IconButton color="primary" onClick={() => setOpenConfirmDialog(true)}>
<DoneIcon /> <DoneIcon />
</IconButton> </IconButton>
@@ -20,7 +20,7 @@ const ConfirmForm = ({ rowId, mutate }) => {
}, },
}} }}
> >
<DialogTitle>تایید</DialogTitle> <DialogTitle>تایید فعالیت</DialogTitle>
<ConfirmContent mutate={mutate} rowId={rowId} setOpenConfirmDialog={setOpenConfirmDialog} /> <ConfirmContent mutate={mutate} rowId={rowId} setOpenConfirmDialog={setOpenConfirmDialog} />
</Dialog> </Dialog>
</> </>

View File

@@ -22,9 +22,7 @@ const DeleteContent = ({ rowId, mutate, setOpenDeleteDialog }) => {
<> <>
<DialogContent> <DialogContent>
<Stack alignItems="center" spacing={2}> <Stack alignItems="center" spacing={2}>
<Typography textAlign="center" fontWeight="bold" fontSize="16px" mt={2}> <Typography mt={2}>آیا از حذف فعالیت اطمینان دارید؟</Typography>
آیا از حذف فعالیت اطمینان دارید؟
</Typography>
</Stack> </Stack>
</DialogContent> </DialogContent>
<DialogActions sx={{ justifyContent: "center", paddingBottom: 2, width: "100%" }}> <DialogActions sx={{ justifyContent: "center", paddingBottom: 2, width: "100%" }}>
@@ -32,7 +30,7 @@ const DeleteContent = ({ rowId, mutate, setOpenDeleteDialog }) => {
خیر ! خیر !
</Button> </Button>
<Button onClick={handleClick} variant="contained" color="error" disabled={submitting}> <Button onClick={handleClick} variant="contained" color="error" disabled={submitting}>
{submitting ? "درحال ارسال اطلاعات..." : "بله اطمینان دارم"} {submitting ? "درحال حذف..." : "بله اطمینان دارم"}
</Button> </Button>
</DialogActions> </DialogActions>
</> </>

View File

@@ -1,41 +1,44 @@
import { DialogContent, Paper, Stack, Typography, useTheme } from "@mui/material"; import { Box, DialogContent, Paper, Stack, Typography, useTheme } from "@mui/material";
import Image from "next/image";
const ImageFormContent = ({ image, title }) => { const ImageFormContent = ({ image, title }) => {
const theme = useTheme(); const theme = useTheme();
return ( return (
<DialogContent> <Stack
<Paper spacing={2}
elevation={3} alignItems="center"
justifyContent="center"
sx={{
my: 2,
padding: 2,
borderRadius: "12px",
border: `1px solid ${theme.palette.primary.main}`,
}}
>
<Typography
variant="h6"
sx={{ sx={{
padding: 2, color: theme.palette.primary.dark,
borderRadius: "12px", fontWeight: "bold",
border: `1px solid ${theme.palette.primary.main}`,
}} }}
> >
<Stack spacing={2} alignItems="center" justifyContent="center"> {title}
<Typography </Typography>
variant="h6" <Box sx={{ width: "100%", position: "relative", aspectRatio: "16/9" }}>
sx={{ <Image
color: theme.palette.primary.dark, src={image}
fontWeight: "bold", alt="Image"
}} fill={true}
> loading="lazy"
{title} style={{
</Typography> objectFit: "contain",
<img marginBottom: "16px",
src={image} borderRadius: "12px",
alt="Image" border: `1px solid ${theme.palette.divider}`,
style={{ }}
maxWidth: "100%", />
maxHeight: "200px", </Box>
marginBottom: "16px", </Stack>
borderRadius: "12px",
border: `1px solid ${theme.palette.divider}`,
}}
/>
</Stack>
</Paper>
</DialogContent>
); );
}; };
export default ImageFormContent; export default ImageFormContent;

View File

@@ -1,4 +1,4 @@
import { Button, Dialog, DialogActions, DialogTitle, IconButton, Tooltip } from "@mui/material"; import { Button, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, Paper, Tooltip } from "@mui/material";
import { useState } from "react"; import { useState } from "react";
import PhotoLibraryIcon from "@mui/icons-material/PhotoLibrary"; import PhotoLibraryIcon from "@mui/icons-material/PhotoLibrary";
import ImageFormContent from "./ImageFormContent"; import ImageFormContent from "./ImageFormContent";
@@ -22,14 +22,18 @@ const ImageDialog = ({ images }) => {
boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px", boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px",
}, },
}} }}
dir="rtl" maxWidth={"sm"}
maxWidth={"md"} scroll="paper"
> >
<DialogTitle>تصاویر</DialogTitle> <DialogTitle sx={{ fontSize: "large" }}>تصاویر</DialogTitle>
<ImageFormContent image={images[1].full_path_for_fast_react} title={"قبل از اقدام"} /> <DialogContent>
<ImageFormContent image={images[0].full_path_for_fast_react} title={"بعد از اقدام"} /> <Paper elevation={0}>
<ImageFormContent image={images[1]?.full_path_for_fast_react} title={"قبل از اقدام"} />
<ImageFormContent image={images[0]?.full_path_for_fast_react} title={"بعد از اقدام"} />
</Paper>
</DialogContent>
<DialogActions> <DialogActions>
<Button onClick={() => setOpenImageDialog(false)} variant="outlined" color="secondary" autoFocus> <Button onClick={() => setOpenImageDialog(false)} variant="outlined" color="secondary">
بستن بستن
</Button> </Button>
</DialogActions> </DialogActions>

View File

@@ -7,7 +7,7 @@ const MachinesCodeDialog = ({ machinesLists }) => {
const [openMachinesCodeDialog, setOpenMachinesCodeDialog] = useState(false); const [openMachinesCodeDialog, setOpenMachinesCodeDialog] = useState(false);
return ( return (
<> <>
<Tooltip title="کد خودرو"> <Tooltip title="خودرو ها">
<IconButton color="primary" onClick={() => setOpenMachinesCodeDialog(true)}> <IconButton color="primary" onClick={() => setOpenMachinesCodeDialog(true)}>
<DirectionsCarIcon /> <DirectionsCarIcon />
</IconButton> </IconButton>
@@ -24,7 +24,7 @@ const MachinesCodeDialog = ({ machinesLists }) => {
dir="rtl" dir="rtl"
maxWidth={"md"} maxWidth={"md"}
> >
<DialogTitle sx={{ fontSize: "large" }}>کد خودرو</DialogTitle> <DialogTitle sx={{ fontSize: "large" }}>خودرو ها</DialogTitle>
<MachinesCodeContent machinesLists={machinesLists} /> <MachinesCodeContent machinesLists={machinesLists} />
<DialogActions> <DialogActions>
<Button <Button

View File

@@ -9,7 +9,7 @@ const RejectContent = ({ rowId, mutate, setOpenRejectDialog }) => {
const requestServer = useRequest({ notificationSuccess: true }); const requestServer = useRequest({ notificationSuccess: true });
const validationSchema = Yup.object().shape({ const validationSchema = Yup.object().shape({
description: Yup.string().required("توضیحات الزامیست!!!"), description: Yup.string().required("لطفاً توضیحات را وارد کنید."),
}); });
const { const {
@@ -51,12 +51,14 @@ const RejectContent = ({ rowId, mutate, setOpenRejectDialog }) => {
{...register("description")} {...register("description")}
multiline multiline
rows={8} rows={8}
label="توضیحات کارشناس" label="توضیحات و دلایل عدم تأیید"
placeholder="لطفاً علت عدم تأیید خود را توضیح دهید"
error={!!errors.description} error={!!errors.description}
helperText={errors.description?.message} helperText={errors.description?.message}
fullWidth fullWidth
variant="outlined" variant="outlined"
sx={{ mt: 1 }} sx={{ mt: 1 }}
InputLabelProps={{ shrink: true }}
/> />
</Stack> </Stack>
</Stack> </Stack>
@@ -72,7 +74,7 @@ const RejectContent = ({ rowId, mutate, setOpenRejectDialog }) => {
بستن بستن
</Button> </Button>
<Button onClick={handleSubmit(onSubmit)} variant="contained" color="primary" disabled={isSubmitting}> <Button onClick={handleSubmit(onSubmit)} variant="contained" color="primary" disabled={isSubmitting}>
{isSubmitting ? "درحال ارسال اطلاعات..." : "عدم تایید"} {isSubmitting ? "درحال ثبت عدم تایید..." : "ثبت عدم تایید"}
</Button> </Button>
</DialogActions> </DialogActions>
</> </>

View File

@@ -6,7 +6,7 @@ const RejectForm = ({ rowId, mutate }) => {
const [openRejectDialog, setOpenRejectDialog] = useState(false); const [openRejectDialog, setOpenRejectDialog] = useState(false);
return ( return (
<> <>
<Tooltip title="عدم تایید"> <Tooltip title="عدم تایید فعالیت">
<IconButton color="primary" onClick={() => setOpenRejectDialog(true)}> <IconButton color="primary" onClick={() => setOpenRejectDialog(true)}>
<ClearIcon /> <ClearIcon />
</IconButton> </IconButton>
@@ -20,7 +20,7 @@ const RejectForm = ({ rowId, mutate }) => {
}, },
}} }}
> >
<DialogTitle>عدم تایید</DialogTitle> <DialogTitle>عدم تایید فعالیت</DialogTitle>
<RejectContent mutate={mutate} rowId={rowId} setOpenRejectDialog={setOpenRejectDialog} /> <RejectContent mutate={mutate} rowId={rowId} setOpenRejectDialog={setOpenRejectDialog} />
</Dialog> </Dialog>
</> </>

View File

@@ -177,7 +177,7 @@ const SupervisorList = () => {
}, },
{ {
accessorKey: "sub_item", accessorKey: "sub_item",
header: "موضوع مشاهده شده", header: "اقدام انجام شده",
id: "sub_item", id: "sub_item",
enableColumnFilter: true, enableColumnFilter: true,
datatype: "numeric", datatype: "numeric",
@@ -347,7 +347,7 @@ const SupervisorList = () => {
</Stack> </Stack>
); );
} }
return <Typography variant="body2">کد خودرویی وجود ندارد</Typography>; return <Typography variant="body2">خودرویی وجود ندارد</Typography>;
}, },
}, },
{ {

View File

@@ -21,7 +21,6 @@ const ActionsDuringPatrol = ({ setValue, tabState, setTabState }) => {
const SubmitActionDuringPatrol = () => { const SubmitActionDuringPatrol = () => {
setTabState(tabState + 1); setTabState(tabState + 1);
const resultItems = ActionsList.map((item) => item.result); const resultItems = ActionsList.map((item) => item.result);
console.log("resultItems", resultItems);
setValue("observed_items", resultItems); setValue("observed_items", resultItems);
}; };

View File

@@ -69,7 +69,7 @@ const CompeleteRequest = ({ watch, isSubmitting, setValue, register }) => {
setOtpSended(true); setOtpSended(true);
setDelayPerRequest(true); setDelayPerRequest(true);
}) })
.catch(() => { }); .catch(() => {});
}; };
return ( return (

View File

@@ -1,14 +1,14 @@
import { Tooltip, IconButton } from "@mui/material"; import { GET_ROAD_PATROL_OPERATOR_REPORT } from "@/core/utils/routes";
import PrintIcon from "@mui/icons-material/Print"; import PrintIcon from "@mui/icons-material/Print";
import { IconButton, Tooltip } from "@mui/material";
const ReportForm = ({ rowId }) => { const ReportForm = ({ rowId }) => {
const reportUrl = `https://rms.rmto.ir/v2/road_patrols/operator/report/${rowId}`;
return ( return (
<Tooltip title="گزارش" arrow placement="right"> <Tooltip title="گزارش" arrow placement="right">
<IconButton <IconButton
color="primary" color="primary"
component="a" component="a"
href={reportUrl} href={`${GET_ROAD_PATROL_OPERATOR_REPORT}/${rowId}`}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
sx={{ textTransform: "unset", alignSelf: "center" }} sx={{ textTransform: "unset", alignSelf: "center" }}

View File

@@ -1,14 +1,14 @@
import { Tooltip, IconButton } from "@mui/material"; import { GET_ROAD_PATROL_SUPERVISOR_REPORT } from "@/core/utils/routes";
import PrintIcon from "@mui/icons-material/Print"; import PrintIcon from "@mui/icons-material/Print";
import { IconButton, Tooltip } from "@mui/material";
const ReportForm = ({ rowId }) => { const ReportForm = ({ rowId }) => {
const reportUrl = `https://rms.rmto.ir/v2/road_patrols/operator/report/${rowId}`;
return ( return (
<Tooltip title="گزارش" arrow placement="right"> <Tooltip title="گزارش" arrow placement="right">
<IconButton <IconButton
color="primary" color="primary"
component="a" component="a"
href={reportUrl} href={`${GET_ROAD_PATROL_SUPERVISOR_REPORT}/${rowId}`}
target="_blank" target="_blank"
rel="noopener noreferrer" rel="noopener noreferrer"
sx={{ textTransform: "unset", alignSelf: "center" }} sx={{ textTransform: "unset", alignSelf: "center" }}

View File

@@ -10,36 +10,37 @@ const CarCode = ({ carCode, setCarCode, inputValueDefault = "", error, multiple
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const requestServer = useRequest(); const requestServer = useRequest();
const fetchCarCodes = (inputValue, controller) => {
const debouncer = debounce((query) => {
if (!query || query?.length < 3) {
setOptions([]);
return;
}
setLoading(true);
requestServer(`${GET_CAR_LIST_SEARCH}?machine_code=${query}`, "get", {
requestOptions: { signal: controller.signal },
})
.then((response) => {
const combinedArray = carCode ? [...carCode, ...response.data.data] : [...response.data.data];
const uniqueArray = Array.from(new Map(combinedArray.map((item) => [item.id, item])).values());
setOptions(uniqueArray || []);
})
.catch(() => {
setOptions([]);
})
.finally(() => {
setLoading(false);
});
}, 500);
debouncer(inputValue);
};
useEffect(() => { useEffect(() => {
const fetchCarCodes = (inputValue, controller) => {
const debouncer = debounce((query) => {
if (!query || query?.length < 3) {
setOptions([]);
return;
}
setLoading(true);
requestServer(`${GET_CAR_LIST_SEARCH}?machine_code=${query}`, "get", {
requestOptions: { signal: controller.signal },
})
.then((response) => {
const combinedArray = carCode ? [...carCode, ...response.data.data] : [...response.data.data];
const uniqueArray = Array.from(new Map(combinedArray.map((item) => [item.id, item])).values());
setOptions(uniqueArray || []);
})
.catch(() => {
setOptions([]);
})
.finally(() => {
setLoading(false);
});
}, 500);
debouncer(inputValue);
};
const controller = new AbortController(); const controller = new AbortController();
fetchCarCodes(inputValue, controller); fetchCarCodes(inputValue, controller);
return () => controller.abort(); return () => controller.abort();
}, [inputValue]); }, [inputValue]);
return ( return (
<Autocomplete <Autocomplete
multiple={multiple} multiple={multiple}
@@ -50,7 +51,7 @@ const CarCode = ({ carCode, setCarCode, inputValueDefault = "", error, multiple
}} }}
inputValue={inputValue} inputValue={inputValue}
onInputChange={(event, newInputValue) => { onInputChange={(event, newInputValue) => {
setInputValue(newInputValue || ""); // Prevent inputValue from being null or undefined setInputValue(newInputValue || "");
}} }}
options={options} options={options}
getOptionLabel={(option) => { getOptionLabel={(option) => {

View File

@@ -61,7 +61,8 @@ const DataTable_Main = (props) => {
} }
params.set("sorting", JSON.stringify(sortData)); params.set("sorting", JSON.stringify(sortData));
return `${table_url}?${params}`; return `${table_url}?${params}`;
}, [table_url, filterData, pagination, columns, sortData, specialFilter]); }, [table_url, filterData, pagination, sortData, specialFilter]);
const fetcher = async (url) => { const fetcher = async (url) => {
try { try {
const response = await request(url); const response = await request(url);

View File

@@ -122,8 +122,8 @@ const MapInteraction = ({ setValue, startLat, startLng }) => {
zIndex: 1000, zIndex: 1000,
}} }}
> >
<Button variant="contained" onClick={handleUnlockMarker}> <Button variant="contained" color="warning" onClick={handleUnlockMarker}>
ویرایش تغییر مکان
</Button> </Button>
</Box> </Box>
)} )}

View File

@@ -73,7 +73,7 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => {
{ lat: startLat, lng: startLng }, { lat: startLat, lng: startLng },
{ lat: endLat, lng: endLng }, { lat: endLat, lng: endLng },
], ],
{ paddingTopLeft: [16, 16], paddingBottomRight: [16, 130] } { paddingTopLeft: [64, 64], paddingBottomRight: [64, 64] }
); );
} }
}, [startLat, map, endLng]); }, [startLat, map, endLng]);
@@ -142,7 +142,7 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => {
zIndex: 1000, zIndex: 1000,
}} }}
> >
<Button variant={"contained"} onClick={handleUnlockStart}> <Button variant={"contained"} color="warning" onClick={handleUnlockStart}>
ویرایش نقطه شروع ویرایش نقطه شروع
</Button> </Button>
</Box> </Box>
@@ -184,8 +184,8 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => {
setIsEndLocked(true); setIsEndLocked(true);
setEndIconColor("#D13131"); setEndIconColor("#D13131");
map.fitBounds([startPosition, map.getCenter()], { map.fitBounds([startPosition, map.getCenter()], {
paddingTopLeft: [16, 16], paddingTopLeft: [64, 64],
paddingBottomRight: [16, 16], paddingBottomRight: [64, 64],
}); });
} }
}, },
@@ -202,7 +202,7 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => {
zIndex: 1000, zIndex: 1000,
}} }}
> >
<Button variant={"contained"} onClick={handleUnlockEnd}> <Button variant={"contained"} color="warning" onClick={handleUnlockEnd}>
ویرایش نقاط ویرایش نقاط
</Button> </Button>
</Box> </Box>

View File

@@ -22,7 +22,7 @@ const ChangePass = ({ open, setOpen }) => {
<LoadingButton <LoadingButton
loading={loading} loading={loading}
variant="outlined" variant="outlined"
color="error" color="secondary"
size="large" size="large"
onClick={handleCloseForm} onClick={handleCloseForm}
> >
@@ -38,7 +38,7 @@ const ChangePass = ({ open, setOpen }) => {
loadingPosition="end" loadingPosition="end"
endIcon={<SaveIcon />} endIcon={<SaveIcon />}
> >
ثبت تغییر
</LoadingButton> </LoadingButton>
</DialogActions> </DialogActions>
</Dialog> </Dialog>

View File

@@ -22,7 +22,7 @@ const Update = ({ open, setOpen }) => {
<Form handleCloseForm={handleCloseForm} setLoading={setLoading} /> <Form handleCloseForm={handleCloseForm} setLoading={setLoading} />
</DialogContent> </DialogContent>
<DialogActions> <DialogActions>
<Button autoFocus variant="outlined" color="error" size="large" onClick={handleCloseForm}> <Button variant="outlined" color="secondary" size="large" onClick={handleCloseForm}>
بستن بستن
</Button> </Button>
<LoadingButton <LoadingButton
@@ -35,7 +35,7 @@ const Update = ({ open, setOpen }) => {
loadingPosition="end" loadingPosition="end"
endIcon={<SaveIcon />} endIcon={<SaveIcon />}
> >
ثبت ویرایش
</LoadingButton> </LoadingButton>
</DialogActions> </DialogActions>
</Dialog> </Dialog>

View File

@@ -11,34 +11,34 @@ const RahdarCode = ({ rahdarsCode, setRahdarsCode, error, multiple = true }) =>
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const requestServer = useRequest(); const requestServer = useRequest();
const fetchRahdarCodes = (inputValue, controller) => {
const debouncer = debounce((query) => {
if ((query || "").length < 3) {
setOptions([]);
return;
}
setLoading(true);
requestServer(`${GET_RAHDARANS_LIST_SEARCH}?code=${query}`, "get", {
requestOptions: { signal: controller.signal },
})
.then((response) => {
const combinedArray = rahdarsCode
? [...rahdarsCode, ...response.data.data]
: [...response.data.data];
const uniqueArray = Array.from(new Map(combinedArray.map((item) => [item.id, item])).values());
setOptions(uniqueArray || []);
})
.catch(() => {
setOptions([]);
})
.finally(() => {
setLoading(false);
});
}, 500);
debouncer(inputValue);
};
useEffect(() => { useEffect(() => {
const fetchRahdarCodes = (inputValue, controller) => {
const debouncer = debounce((query) => {
if ((query || "").length < 3) {
setOptions([]);
return;
}
setLoading(true);
requestServer(`${GET_RAHDARANS_LIST_SEARCH}?code=${query}`, "get", {
requestOptions: { signal: controller.signal },
})
.then((response) => {
const combinedArray = rahdarsCode
? [...rahdarsCode, ...response.data.data]
: [...response.data.data];
const uniqueArray = Array.from(new Map(combinedArray.map((item) => [item.id, item])).values());
setOptions(uniqueArray || []);
})
.catch(() => {
setOptions([]);
})
.finally(() => {
setLoading(false);
});
}, 500);
debouncer(inputValue);
};
const controller = new AbortController(); const controller = new AbortController();
fetchRahdarCodes(inputValue, controller); fetchRahdarCodes(inputValue, controller);
return () => controller.abort(); return () => controller.abort();

View File

@@ -1,3 +1,5 @@
const api = process.env.NEXT_PUBLIC_API_URL;
export const headerMenu = [ export const headerMenu = [
{ {
title: "تصادفات", title: "تصادفات",
@@ -5,7 +7,7 @@ export const headerMenu = [
[ [
{ {
title: "تصادفات روزانه", title: "تصادفات روزانه",
href: "https://rms.witel.ir/v2/daily_accidents/create", href: api + "/v2/daily_accidents/create",
}, },
], ],
], ],
@@ -16,11 +18,11 @@ export const headerMenu = [
[ [
{ {
title: "گزارش محوری", title: "گزارش محوری",
href: "https://rms.witel.ir/v2/axis_reports", href: api + "/v2/axis_reports",
}, },
{ {
title: "هوش تجاری (BI)", title: "هوش تجاری (BI)",
href: "https://rms.witel.ir/v2/axis_reports", href: api + "/v2/axis_reports",
}, },
], ],
], ],
@@ -31,17 +33,17 @@ export const headerMenu = [
[ [
{ {
title: "پراکندگی بر روی نقشه راهدارخانه ها", title: "پراکندگی بر روی نقشه راهدارخانه ها",
href: "https://rms.witel.ir/v2/map?type=rahdar", href: api + "/v2/map?type=rahdar",
}, },
{ {
title: "راهدارخانه ها", title: "راهدارخانه ها",
href: "https://rms.witel.ir/v2/rahdari_points", href: api + "/v2/rahdari_points",
}, },
], ],
[ [
{ {
title: "ممیزی ماشین آلات راهداری کشور", title: "ممیزی ماشین آلات راهداری کشور",
href: "https://rms.witel.ir/cmms-audit", href: api + "/cmms-audit",
}, },
], ],
], ],
@@ -52,7 +54,7 @@ export const headerMenu = [
[ [
{ {
title: "تحقیق و توسعه", title: "تحقیق و توسعه",
href: "https://rms.witel.ir/RandD", href: api + "/RandD",
}, },
{ {
title: "سامانه مدیریت یکپارچه زیرساخت های راه (PMS,BMS,SMS)", title: "سامانه مدیریت یکپارچه زیرساخت های راه (PMS,BMS,SMS)",

View File

@@ -165,7 +165,7 @@ export const pageMenu = [
}, },
{ {
id: "roadItemManagmentReportItems", id: "roadItemManagmentReportItems",
label: "تعداد و حجم فعالیت ها به تفکیک موارد مشاهده شده", label: "تعداد و حجم فعالیت ها به تفکیک موارد اقدام شده",
type: "page", type: "page",
route: "/dashboard/road-items/reports/sub-items-report", route: "/dashboard/road-items/reports/sub-items-report",
permissions: [ permissions: [

View File

@@ -30,10 +30,12 @@ export const UPDATE_AZMAYESH_TYPE = api + "/api/v3/azmayesh_types/update";
//road patrol //road patrol
export const GET_ROAD_PATROL_OPERATOR_LIST = api + "/api/v3/road_patrols/operator_index"; export const GET_ROAD_PATROL_OPERATOR_LIST = api + "/api/v3/road_patrols/operator_index";
export const EXPORT_ROAD_PATROL_OPERATOR_LIST = "https://rms.witel.ir/v2/road_patrols/operator/cartable/report"; export const EXPORT_ROAD_PATROL_OPERATOR_LIST = api + "/v2/road_patrols/operator/cartable/report";
export const GET_ROAD_PATROL_SUPERVISOR_LIST = api + "/api/v3/road_patrols/supervisor_index"; export const GET_ROAD_PATROL_SUPERVISOR_LIST = api + "/api/v3/road_patrols/supervisor_index";
export const EXPORT_ROAD_PATROL_SUPERVISOR_LIST = "https://rms.witel.ir/v2/road_patrols/supervisor/cartable/report"; export const EXPORT_ROAD_PATROL_SUPERVISOR_LIST = api + "/v2/road_patrols/supervisor/cartable/report";
export const DELETE_ROAD_PATROL_SUPERVISOR = api + "/api/v3/road_patrols/delete"; export const DELETE_ROAD_PATROL_SUPERVISOR = api + "/api/v3/road_patrols/delete";
export const GET_ROAD_PATROL_OPERATOR_REPORT = api + "/v2/road_patrols/operator/report";
export const GET_ROAD_PATROL_SUPERVISOR_REPORT = api + "/v2/road_patrols/supervisor/report";
export const CREATE_PATROL = api + "/api/v3/road_patrols/store"; export const CREATE_PATROL = api + "/api/v3/road_patrols/store";
export const GET_FMS_DATA = api + "/api/v3/fms_vehicle/get_activity"; export const GET_FMS_DATA = api + "/api/v3/fms_vehicle/get_activity";
export const GET_OTP_TOKEN = api + "/v2/get_otp_token"; export const GET_OTP_TOKEN = api + "/v2/get_otp_token";
@@ -45,9 +47,9 @@ export const GET_ROAD_ITEMS_SUPERVISOR_LIST = api + "/api/v3/road_items/supervis
export const EXPORT_ROAD_ITEMS_SUPERVISOR_LIST = api + "/api/v3/road_items/supervisor_report"; export const EXPORT_ROAD_ITEMS_SUPERVISOR_LIST = api + "/api/v3/road_items/supervisor_report";
export const GET_ROAD_ITEMS_OPERATOR_LIST = api + "/api/v3/road_items/operator_index"; export const GET_ROAD_ITEMS_OPERATOR_LIST = api + "/api/v3/road_items/operator_index";
export const EXPORT_ROAD_ITEMS_OPERATOR_LIST = api + "/api/v3/road_items/operator_report"; export const EXPORT_ROAD_ITEMS_OPERATOR_LIST = api + "/api/v3/road_items/operator_report";
export const GET_ROAD_ITEMS_ITEM = "https://rms.witel.ir/v2/items"; export const GET_ROAD_ITEMS_ITEM = api + "/v2/items";
export const GET_ROAD_ITEMS_SUB_ITEM = "https://rms.witel.ir/v2/sub_items"; export const GET_ROAD_ITEMS_SUB_ITEM = api + "/v2/sub_items";
export const GET_EDARAT_LISTS = "https://rms.witel.ir/public/contents/edarate_shahri_by_province"; export const GET_EDARAT_LISTS = api + "/public/contents/edarate_shahri_by_province";
export const CREATE_ROAD_ITEMS = api + "/api/v3/road_items/store"; export const CREATE_ROAD_ITEMS = api + "/api/v3/road_items/store";
export const UPDATE_ROAD_ITEMS = api + "/api/v3/road_items/update"; export const UPDATE_ROAD_ITEMS = api + "/api/v3/road_items/update";
export const VERIFY_BY_SUPERVISOR = api + "/api/v3/road_items/verify_by_supervisor"; export const VERIFY_BY_SUPERVISOR = api + "/api/v3/road_items/verify_by_supervisor";