diff --git a/.env.local.example b/.env.local.example
index b1ff64a..c218e28 100644
--- a/.env.local.example
+++ b/.env.local.example
@@ -1,3 +1,4 @@
-NEXT_PUBLIC_VERSION="0.14.0"
+HOST="rms.witel.ir"
+NEXT_PUBLIC_VERSION="0.15.0"
NEXT_PUBLIC_API_URL="https://rms.witel.ir"
NEXT_PUBLIC_MAPTILE_ENDPOINT="https://rmsmap.rmto.ir/141map"
\ No newline at end of file
diff --git a/next.config.mjs b/next.config.mjs
index 7b0b855..e33199c 100644
--- a/next.config.mjs
+++ b/next.config.mjs
@@ -5,7 +5,7 @@ const nextConfig = {
remotePatterns: [
{
protocol: 'https',
- hostname: 'rms.witel.ir',
+ hostname: process.env.HOST,
},
],
},
diff --git a/src/app/(withAuth)/dashboard/car-details/page.js b/src/app/(withAuth)/dashboard/car-details/page.js
deleted file mode 100644
index 4392b1a..0000000
--- a/src/app/(withAuth)/dashboard/car-details/page.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import TestPage from "@/components/dashboard/carDetails";
-import WithPermission from "@/core/middlewares/withPermission";
-
-const Page = () => {
- return (
-
-
-
- );
-};
-
-export default Page;
diff --git a/src/components/dashboard/carDetails/CarDetailsContent.jsx b/src/components/dashboard/carDetails/CarDetailsContent.jsx
deleted file mode 100644
index 4d71d02..0000000
--- a/src/components/dashboard/carDetails/CarDetailsContent.jsx
+++ /dev/null
@@ -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: () => ,
- 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 (
- <>
-
-
-
-
-
- {
- 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
- />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {/**/}
-
-
-
-
-
-
-
- >
- );
-};
-export default CarDetailsContent;
diff --git a/src/components/dashboard/carDetails/index.jsx b/src/components/dashboard/carDetails/index.jsx
deleted file mode 100644
index 745736d..0000000
--- a/src/components/dashboard/carDetails/index.jsx
+++ /dev/null
@@ -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 (
-
-
- <>
-
- {
- setOpenCarDialog(true);
- }}
- >
-
-
-
-
- >
-
- );
-};
-export default TestPage;
diff --git a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/CreateFormContent.jsx b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/CreateFormContent.jsx
index 7b9b9a5..cfe6c09 100644
--- a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/CreateFormContent.jsx
+++ b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/CreateFormContent.jsx
@@ -27,10 +27,26 @@ function TabPanel(props) {
const validationSchema = object({
item_id: number().required("نوع آیتم را مشخص کنید!"),
- sub_item_id: number().required("موضوع مشاهده شده را مشخص کنید!"),
+ sub_item_id: number().required("اقدام انجام شده را مشخص کنید!"),
amount: string().required("وارد کردن مقدار الزامیست!"),
- cmms_machines: array().required("وارد کردن کد خودرو الزامیست!").min(1, "حداقل یک کد خودرو باید وارد شود!"),
- rahdaran_id: array().required("وارد کردن کد راهداران الزامیست!").min(1, "حداقل یک کد راهدار باید وارد شود!"), // بررسی حداقل یک آیتم,
+ cmms_machines: array()
+ .test("cmms-machines-conditional", "وارد کردن کد خودرو الزامیست!", function (value) {
+ const { is_gasht } = this.options.context;
+ if (is_gasht) {
+ return true; // اگر is_gasht true باشد، این فیلد نیاز به اعتبارسنجی ندارد
+ }
+ return Array.isArray(value) && value.length > 0; // حداقل یک کد باید وجود داشته باشد
+ })
+ .min(1, "حداقل یک کد خودرو باید وارد شود!"), // پیام خطا برای زمانی که شرط تست برقرار باشد
+ rahdaran_id: array()
+ .test("rahdaran-id-conditional", "وارد کردن کد راهداران الزامیست!", function (value) {
+ const { is_gasht } = this.options.context;
+ if (is_gasht) {
+ return true; // اگر is_gasht true باشد، این فیلد نیاز به اعتبارسنجی ندارد
+ }
+ return Array.isArray(value) && value.length > 0; // حداقل یک کد باید وجود داشته باشد
+ })
+ .min(1, "حداقل یک کد راهدار باید وارد شود!"), // پیام خطا برای زمانی که شرط تست برقرار باشد
activity_time: string().test("activity-time-conditional", "لطفا زمان فعالیت را انتخاب کنید!", function (value) {
const { is_gasht } = this.options.context; // دسترسی به context
if (is_gasht) {
@@ -91,11 +107,14 @@ const CreateFormContent = ({ setOpen, onSubmit, is_gasht = false }) => {
amount: "",
before_image: null,
after_image: null,
- cmms_machines: null,
- rahdaran_id: null,
start_point: "",
end_point: "",
- ...(!is_gasht && { activity_time: "", activity_date: "" }),
+ ...(!is_gasht && {
+ activity_time: "",
+ activity_date: "",
+ cmms_machines: [],
+ rahdaran_id: [],
+ }),
};
const [tabState, setTabState] = useState(0);
@@ -175,17 +194,24 @@ const CreateFormContent = ({ setOpen, onSubmit, is_gasht = false }) => {
result.start_point = `${result.start_point.lat},${result.start_point.lng}`;
}
- result.rahdaran_id.forEach((rahdar, index) => {
- result[`rahdaran_id[${index}]`] = rahdar.id;
- });
- delete result.rahdaran_id;
+ if (!is_gasht) {
+ result.rahdaran_id.forEach((rahdar, index) => {
+ result[`rahdaran_id[${index}]`] = rahdar.id;
+ });
+ delete result.rahdaran_id;
- result.cmms_machines.forEach((cmms_machine, index) => {
- result[`machines_id[${index}]`] = cmms_machine.id;
- });
- delete result.cmms_machines;
+ result.cmms_machines.forEach((cmms_machine, index) => {
+ result[`machines_id[${index}]`] = cmms_machine.id;
+ });
+ delete result.cmms_machines;
- result[`activity_time`] = format(new Date(result.activity_time), "HH:mm");
+ result[`activity_time`] = format(new Date(result.activity_time), "HH:mm");
+ } else {
+ delete result.rahdaran_id;
+ delete result.cmms_machines;
+ delete result.activity_date;
+ delete result.activity_time;
+ }
await onSubmit({
result,
@@ -214,7 +240,7 @@ const CreateFormContent = ({ setOpen, onSubmit, is_gasht = false }) => {
}}
>
} label="انتخاب آیتم" />
- } label="انتخاب موضوع مشاهده شده" />
+ } label="انتخاب اقدام انجام شده" />
} label="اطلاعات فعالیت" />
diff --git a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/GetItemInfo.jsx b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/GetItemInfo.jsx
index a80f4af..bb9cbe0 100644
--- a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/GetItemInfo.jsx
+++ b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/GetItemInfo.jsx
@@ -43,37 +43,41 @@ const GetItemInfo = ({ register, itemsList, subItemsList, control, setValue, err
fullWidth
/>
-
- {
- return (
- field.onChange(value || [])}
- error={error}
- multiple={true}
- />
- );
- }}
- name={"cmms_machines"}
- />
-
-
- {
- return (
- field.onChange(value || [])}
- error={error}
- />
- );
- }}
- name={"rahdaran_id"}
- />
-
+ {!is_gasht && (
+
+ {
+ return (
+ field.onChange(value || [])}
+ error={error}
+ multiple={true}
+ />
+ );
+ }}
+ name={"cmms_machines"}
+ />
+
+ )}
+ {!is_gasht && (
+
+ {
+ return (
+ field.onChange(value || [])}
+ error={error}
+ />
+ );
+ }}
+ name={"rahdaran_id"}
+ />
+
+ )}
{subItemsList.needs_image ? (
diff --git a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/GetSubItemsForm.jsx b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/GetSubItemsForm.jsx
index 8d9098a..9b6bc8e 100644
--- a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/GetSubItemsForm.jsx
+++ b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/GetSubItemsForm.jsx
@@ -9,7 +9,7 @@ const GetSubItemsForm = ({ setValue, watch, setSubItemsList, tabState, setTabSta
<>
{errorSubItemsList ? (
- خطا در دریافت موضوع مشاهده شده
+ خطا در دریافت اقدام انجام شده
) : loadingSubItemsList ? (
diff --git a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/PreviousStatesInfo.jsx b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/PreviousStatesInfo.jsx
index 9e7b7db..51fac42 100644
--- a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/PreviousStatesInfo.jsx
+++ b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/PreviousStatesInfo.jsx
@@ -27,14 +27,14 @@ const PreviousStatesInfo = ({ itemsList, subItemsList }) => {
icon={}
label={
- موضوع مشاهدهشده
+ اقدام انجام شده
}
/>
- {subItemsList?.name || "هیچ موضوعی انتخاب نشده است"}
+ {subItemsList?.name || "هیچ اقدامی انتخاب نشده است"}
diff --git a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/index.jsx b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/index.jsx
index 3e78906..c9921bf 100644
--- a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/index.jsx
+++ b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/index.jsx
@@ -22,7 +22,7 @@ const OperatorCreateForm = ({ open, setOpen, mutate, rowId }) => {
};
return (
);
};
diff --git a/src/components/dashboard/roadItems/operator/Actions/Create/index.jsx b/src/components/dashboard/roadItems/operator/Actions/Create/index.jsx
index ce764e7..a503283 100644
--- a/src/components/dashboard/roadItems/operator/Actions/Create/index.jsx
+++ b/src/components/dashboard/roadItems/operator/Actions/Create/index.jsx
@@ -31,7 +31,7 @@ const OperatorCreate = ({ mutate }) => {
ثبت فعالیت
)}
- {open && }
+
>
);
};
diff --git a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreate.jsx b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreate.jsx
index ca4cd51..968d907 100644
--- a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreate.jsx
+++ b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreate.jsx
@@ -6,7 +6,9 @@ const GashtCreate = ({ open, setOpen, mutate, rowId }) => {
const [tabState, setTabState] = useState(0);
return (
);
};
diff --git a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreateContent.jsx b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreateContent.jsx
index 70884e7..80408d3 100644
--- a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreateContent.jsx
+++ b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreateContent.jsx
@@ -104,7 +104,7 @@ const GashtCreateContent = ({ mutate, setOpen, tabState, setTabState }) => {
}}
>
} label="انتخاب مورد مشاهده شده" />
- } label="اطلاعات مورد مشاهده شده" />
+ } label="اطلاعات مورد اقدام شده" />
diff --git a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/RowActions/CompleteItem.jsx b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/RowActions/CompleteItem.jsx
index 1270a2c..3ef226d 100644
--- a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/RowActions/CompleteItem.jsx
+++ b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/RowActions/CompleteItem.jsx
@@ -36,7 +36,7 @@ const CompleteItem = ({ subItem, itemInfo, setSubmitCompleteForm, mutate, setOpe
const validationSchema = object({
item_id: number().required("نوع آیتم را مشخص کنید!"),
- sub_item_id: number().required("موضوع مشاهده شده را مشخص کنید!"),
+ sub_item_id: number().required("اقدام انجام شده را مشخص کنید!"),
amount: string().required("وارد کردن مقدار الزامیست!"),
cmms_machines: array().required("وارد کردن کد خودرو الزامیست!").min(1, "حداقل یک کد خودرو باید وارد شود!"),
rahdaran_id: array().required("وارد کردن کد راهداران الزامیست!").min(1, "حداقل یک کد راهدار باید وارد شود!"), // بررسی حداقل یک آیتم,
diff --git a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/RowActions/PreviousStatesInfo.jsx b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/RowActions/PreviousStatesInfo.jsx
index 57c8839..6603df4 100644
--- a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/RowActions/PreviousStatesInfo.jsx
+++ b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/RowActions/PreviousStatesInfo.jsx
@@ -27,14 +27,14 @@ const PreviousStatesInfo = ({ itemInfo }) => {
icon={}
label={
- موضوع مشاهدهشده
+ اقدام انجام شده
}
/>
- {itemInfo?.sub_item_name || "هیچ موضوعی انتخاب نشده است"}
+ {itemInfo?.sub_item_name || "هیچ اقدامی انتخاب نشده است"}
diff --git a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/TableInfo.jsx b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/TableInfo.jsx
index c16dba4..73f9cdd 100644
--- a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/TableInfo.jsx
+++ b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/TableInfo.jsx
@@ -54,7 +54,7 @@ const TableInfo = ({ specialFilter, setTabState, setItemInfo }) => {
},
{
accessorKey: "sub_item_name",
- header: "موضوع مشاهده شده",
+ header: "مشاهده انجام شده",
id: "sub_item_name",
enableColumnFilter: false,
datatype: "text",
diff --git a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/index.jsx b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/index.jsx
index 4379040..b6eb6b8 100644
--- a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/index.jsx
+++ b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/index.jsx
@@ -35,7 +35,7 @@ const ObservedGashtCreate = ({ mutate }) => {
ثبت فعالیت برای موارد مشاهده شده در گشت راهداری
)}
- {open && }
+
>
);
};
diff --git a/src/components/dashboard/roadItems/operator/OperatorList.jsx b/src/components/dashboard/roadItems/operator/OperatorList.jsx
index 5fcc7e4..52913cc 100644
--- a/src/components/dashboard/roadItems/operator/OperatorList.jsx
+++ b/src/components/dashboard/roadItems/operator/OperatorList.jsx
@@ -17,6 +17,7 @@ import MachinesCodeDialog from "./RowActions/MachinesCodeForm";
const OperatorList = () => {
const statusOptions = [
+ { value: "", label: "همه وضعیت ها" },
{ value: 0, label: "درحال بررسی" },
{ value: 1, label: "تایید" },
{ value: 2, label: "عدم تایید" },
@@ -54,7 +55,7 @@ const OperatorList = () => {
return [{ value: "error", label: "خطا در بارگذاری" }];
}
return [
- { value: "", label: props.column.header },
+ { value: "", label: "همه آیتم ها" },
...itemsList.map((item) => ({
value: item.id,
label: item.name,
@@ -76,7 +77,7 @@ const OperatorList = () => {
},
{
accessorKey: "sub_item",
- header: "موضوع مشاهده شده",
+ header: "اقدام انجام شده",
id: "sub_item",
enableColumnFilter: true,
datatype: "numeric",
@@ -99,7 +100,7 @@ const OperatorList = () => {
return [{ value: "error", label: "خطا در بارگذاری" }];
}
return [
- { value: "", label: props.column.header },
+ { value: "", label: "همه اقدام ها" },
...subItemsList.map((item) => ({
value: item.sub_item,
label: item.name,
@@ -246,7 +247,7 @@ const OperatorList = () => {
);
}
- return کد خودرویی وجود ندارد;
+ return خودرویی وجود ندارد;
},
},
{
diff --git a/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormContent.jsx b/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormContent.jsx
index 530583b..d8b8dc3 100644
--- a/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormContent.jsx
+++ b/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormContent.jsx
@@ -3,7 +3,7 @@ import React from "react";
import useRoadItemGetISubtems from "@/lib/hooks/useRoadItemGetISubtems";
import EditFormCreate from "@/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormCreate";
-const EditFormContent = ({ setOpenEditDialog, onSubmit, defaultData }) => {
+const EditFormContent = ({ setOpenEditDialog, onSubmit, defaultData, is_gasht }) => {
const { subItemsList, loadingSubItemsList, errorSubItemsList } = useRoadItemGetISubtems(defaultData?.item_id);
const subItem = subItemsList.find((SubItem) => SubItem.sub_item === defaultData?.sub_item_id);
@@ -13,8 +13,10 @@ const EditFormContent = ({ setOpenEditDialog, onSubmit, defaultData }) => {
amount: defaultData?.amount || null,
start_point: defaultData?.start_point || { lat: "", lng: "" },
end_point: defaultData?.end_point || { lat: "", lng: "" },
- cmms_machines: defaultData?.cmms_machines || null,
- rahdaran_id: defaultData?.rahdaran_id || null,
+ ...(!is_gasht && {
+ cmms_machines: defaultData?.cmms_machines || null,
+ rahdaran_id: defaultData?.rahdaran_id || null,
+ }),
};
const onSubmitBase = async (data) => {
@@ -43,15 +45,20 @@ const EditFormContent = ({ setOpenEditDialog, onSubmit, defaultData }) => {
result.start_point = `${result.start_point.lat},${result.start_point.lng}`;
}
- result.rahdaran_id.forEach((rahdar, index) => {
- result[`rahdaran_id[${index}]`] = rahdar.id;
- });
- delete result.rahdaran_id;
+ if (!is_gasht) {
+ result.rahdaran_id.forEach((rahdar, index) => {
+ result[`rahdaran_id[${index}]`] = rahdar.id;
+ });
+ delete result.rahdaran_id;
- result.cmms_machines.forEach((cmms_machine, index) => {
- result[`machines_id[${index}]`] = cmms_machine.id;
- });
- delete result.cmms_machines;
+ result.cmms_machines.forEach((cmms_machine, index) => {
+ result[`machines_id[${index}]`] = cmms_machine.id;
+ });
+ delete result.cmms_machines;
+ } else {
+ delete result.rahdaran_id;
+ delete result.cmms_machines;
+ }
await onSubmit({
result,
@@ -81,6 +88,7 @@ const EditFormContent = ({ setOpenEditDialog, onSubmit, defaultData }) => {
defaultData={defaultData}
defaultValues={defaultValues}
setOpenEditDialog={setOpenEditDialog}
+ is_gasht={is_gasht}
/>
)}
>
diff --git a/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormCreate.jsx b/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormCreate.jsx
index c0266ad..7813d41 100644
--- a/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormCreate.jsx
+++ b/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormCreate.jsx
@@ -13,8 +13,24 @@ import { array, mixed, object, string } from "yup";
const validationSchema = object({
amount: string().required("وارد کردن مقدار الزامیست!"),
- cmms_machines: array().required("وارد کردن کد خودرو الزامیست!").min(1, "حداقل یک کد خودرو باید وارد شود!"),
- rahdaran_id: array().required("وارد کردن کد راهداران الزامیست!").min(1, "حداقل یک کد راهدار باید وارد شود!"),
+ cmms_machines: array()
+ .test("cmms-machines-conditional", "وارد کردن کد خودرو الزامیست!", function (value) {
+ const { is_gasht } = this.options.context;
+ if (is_gasht) {
+ return true; // اگر is_gasht true باشد، این فیلد نیاز به اعتبارسنجی ندارد
+ }
+ return Array.isArray(value) && value.length > 0; // حداقل یک کد باید وجود داشته باشد
+ })
+ .min(1, "حداقل یک کد خودرو باید وارد شود!"), // پیام خطا برای زمانی که شرط تست برقرار باشد
+ rahdaran_id: array()
+ .test("rahdaran-id-conditional", "وارد کردن کد راهداران الزامیست!", function (value) {
+ const { is_gasht } = this.options.context;
+ if (is_gasht) {
+ return true; // اگر is_gasht true باشد، این فیلد نیاز به اعتبارسنجی ندارد
+ }
+ return Array.isArray(value) && value.length > 0; // حداقل یک کد باید وجود داشته باشد
+ })
+ .min(1, "حداقل یک کد راهدار باید وارد شود!"),
before_image: mixed()
.nullable()
.test("before-image-required", "لطفا عکس قبل از اقدام را بارگذاری کنید!", function (value) {
@@ -50,7 +66,7 @@ const validationSchema = object({
}),
});
-const EditFormCreate = ({ defaultData, subItem, onSubmitBase, defaultValues, setOpenEditDialog }) => {
+const EditFormCreate = ({ defaultData, subItem, onSubmitBase, defaultValues, setOpenEditDialog, is_gasht }) => {
const {
control,
getValues,
@@ -63,7 +79,7 @@ const EditFormCreate = ({ defaultData, subItem, onSubmitBase, defaultValues, set
defaultValues,
resolver: yupResolver(validationSchema),
mode: "onBlur",
- context: { subItem },
+ context: { subItem, is_gasht },
});
return (
@@ -108,38 +124,42 @@ const EditFormCreate = ({ defaultData, subItem, onSubmitBase, defaultValues, set
fullWidth
/>
-
- {
- return (
- field.onChange(value || [])}
- inputValueDefault={defaultData?.cmms_machines}
- multiple={true}
- error={error} // اگر خطا وجود داشته باشد
- />
- );
- }}
- name={"cmms_machines"}
- />
-
-
- {
- return (
- field.onChange(value || [])}
- error={error}
- />
- );
- }}
- name={"rahdaran_id"}
- />
-
+ {!is_gasht && (
+
+ {
+ return (
+ field.onChange(value || [])}
+ inputValueDefault={defaultData?.cmms_machines}
+ multiple={true}
+ error={error} // اگر خطا وجود داشته باشد
+ />
+ );
+ }}
+ name={"cmms_machines"}
+ />
+
+ )}
+ {!is_gasht && (
+
+ {
+ return (
+ field.onChange(value || [])}
+ error={error}
+ />
+ );
+ }}
+ name={"rahdaran_id"}
+ />
+
+ )}
{subItem.needs_end_point === 1 ? (
{
const theme = useTheme();
return (
-
-
+
-
-
- {title}
-
-
-
-
-
+ {title}
+
+
+
+
+
);
};
export default ImageFormContent;
diff --git a/src/components/dashboard/roadItems/operator/RowActions/ImageForm/index.jsx b/src/components/dashboard/roadItems/operator/RowActions/ImageForm/index.jsx
index 8bdb7e9..130f443 100644
--- a/src/components/dashboard/roadItems/operator/RowActions/ImageForm/index.jsx
+++ b/src/components/dashboard/roadItems/operator/RowActions/ImageForm/index.jsx
@@ -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 PhotoLibraryIcon from "@mui/icons-material/PhotoLibrary";
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",
},
}}
- dir="rtl"
- maxWidth={"md"}
+ maxWidth={"sm"}
+ scroll="paper"
>
تصاویر
-
-
+
+
+
+
+
+
-
diff --git a/src/components/dashboard/roadItems/operator/RowActions/MachinesCodeForm/index.jsx b/src/components/dashboard/roadItems/operator/RowActions/MachinesCodeForm/index.jsx
index d8e8754..ec6ad3e 100644
--- a/src/components/dashboard/roadItems/operator/RowActions/MachinesCodeForm/index.jsx
+++ b/src/components/dashboard/roadItems/operator/RowActions/MachinesCodeForm/index.jsx
@@ -7,7 +7,7 @@ const MachinesCodeDialog = ({ machinesLists }) => {
const [openMachinesCodeDialog, setOpenMachinesCodeDialog] = useState(false);
return (
<>
-
+
setOpenMachinesCodeDialog(true)}>
@@ -24,7 +24,7 @@ const MachinesCodeDialog = ({ machinesLists }) => {
dir="rtl"
maxWidth={"md"}
>
- کد خودرو
+ خودرو ها
{
data={data.data}
page_name={"roadItemReportByItems"}
table_name={"roadItemReportByItemsList"}
+ enablePagination={false}
/>
);
diff --git a/src/components/dashboard/roadItems/reports/SubItemsReports/SubItemsList.jsx b/src/components/dashboard/roadItems/reports/SubItemsReports/SubItemsList.jsx
index f047491..3ab9fc1 100644
--- a/src/components/dashboard/roadItems/reports/SubItemsReports/SubItemsList.jsx
+++ b/src/components/dashboard/roadItems/reports/SubItemsReports/SubItemsList.jsx
@@ -9,6 +9,7 @@ const SubItemsList = ({ data }) => {
data={data.data}
page_name={"roadItemReportBySubItems"}
table_name={"roadItemReportBySubItemsList"}
+ enablePagination={false}
/>
);
diff --git a/src/components/dashboard/roadItems/reports/SubItemsReports/index.jsx b/src/components/dashboard/roadItems/reports/SubItemsReports/index.jsx
index 57521d7..1601b48 100644
--- a/src/components/dashboard/roadItems/reports/SubItemsReports/index.jsx
+++ b/src/components/dashboard/roadItems/reports/SubItemsReports/index.jsx
@@ -22,7 +22,7 @@ const createColumns = (sub_items) => {
columns: [
{
accessorKey: `sub_item_${sub_item.sub_item}_count`,
- header: "تعداد",
+ header: "تعداد اقدام",
id: `sub_item_${sub_item.sub_item}_count`,
enableColumnFilter: false,
enableSorting: false,
@@ -81,7 +81,7 @@ const createColumns = (sub_items) => {
size: 50,
},
{
- header: "موارد مشاهده شده فعالیت روزانه",
+ header: "موارد اقدام شده فعالیت روزانه",
enableColumnFilter: false,
id: "subItems",
enableSorting: false,
@@ -228,7 +228,7 @@ const SubItemsReports = () => {
});
return (
-
+
{
{...register("description")}
multiline
rows={8}
- label="توضیحات کارشناس"
+ label="توضیحات و دلایل تأیید (اختیاری)"
+ placeholder="لطفاً علت تأیید خود را توضیح دهید"
fullWidth
variant="outlined"
sx={{ mt: 1 }}
+ InputLabelProps={{ shrink: true }}
/>
@@ -59,7 +61,7 @@ const ConfirmContent = ({ rowId, mutate, setOpenConfirmDialog }) => {
بستن
- {isSubmitting ? "درحال ارسال اطلاعات..." : "ثبت"}
+ {isSubmitting ? "درحال ثبت تایید..." : "ثبت تایید"}
>
diff --git a/src/components/dashboard/roadItems/supervisor/RowActions/ConfirmForm/index.jsx b/src/components/dashboard/roadItems/supervisor/RowActions/ConfirmForm/index.jsx
index a542a30..d9aafa0 100644
--- a/src/components/dashboard/roadItems/supervisor/RowActions/ConfirmForm/index.jsx
+++ b/src/components/dashboard/roadItems/supervisor/RowActions/ConfirmForm/index.jsx
@@ -6,7 +6,7 @@ const ConfirmForm = ({ rowId, mutate }) => {
const [openConfirmDialog, setOpenConfirmDialog] = useState(false);
return (
<>
-
+
setOpenConfirmDialog(true)}>
@@ -20,7 +20,7 @@ const ConfirmForm = ({ rowId, mutate }) => {
},
}}
>
- تایید
+ تایید فعالیت
>
diff --git a/src/components/dashboard/roadItems/supervisor/RowActions/DeleteForm/DeleteContent.jsx b/src/components/dashboard/roadItems/supervisor/RowActions/DeleteForm/DeleteContent.jsx
index 485ac40..2d03dc7 100644
--- a/src/components/dashboard/roadItems/supervisor/RowActions/DeleteForm/DeleteContent.jsx
+++ b/src/components/dashboard/roadItems/supervisor/RowActions/DeleteForm/DeleteContent.jsx
@@ -22,9 +22,7 @@ const DeleteContent = ({ rowId, mutate, setOpenDeleteDialog }) => {
<>
-
- آیا از حذف فعالیت اطمینان دارید؟
-
+ آیا از حذف فعالیت اطمینان دارید؟
@@ -32,7 +30,7 @@ const DeleteContent = ({ rowId, mutate, setOpenDeleteDialog }) => {
خیر !
- {submitting ? "درحال ارسال اطلاعات..." : "بله اطمینان دارم"}
+ {submitting ? "درحال حذف..." : "بله اطمینان دارم"}
>
diff --git a/src/components/dashboard/roadItems/supervisor/RowActions/ImageForm/ImageFormContent.jsx b/src/components/dashboard/roadItems/supervisor/RowActions/ImageForm/ImageFormContent.jsx
index c9f4e2e..9aaa92e 100644
--- a/src/components/dashboard/roadItems/supervisor/RowActions/ImageForm/ImageFormContent.jsx
+++ b/src/components/dashboard/roadItems/supervisor/RowActions/ImageForm/ImageFormContent.jsx
@@ -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 theme = useTheme();
return (
-
-
+
-
-
- {title}
-
-
-
-
-
+ {title}
+
+
+
+
+
);
};
export default ImageFormContent;
diff --git a/src/components/dashboard/roadItems/supervisor/RowActions/ImageForm/index.jsx b/src/components/dashboard/roadItems/supervisor/RowActions/ImageForm/index.jsx
index 0e70c1d..130f443 100644
--- a/src/components/dashboard/roadItems/supervisor/RowActions/ImageForm/index.jsx
+++ b/src/components/dashboard/roadItems/supervisor/RowActions/ImageForm/index.jsx
@@ -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 PhotoLibraryIcon from "@mui/icons-material/PhotoLibrary";
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",
},
}}
- dir="rtl"
- maxWidth={"md"}
+ maxWidth={"sm"}
+ scroll="paper"
>
- تصاویر
-
-
+ تصاویر
+
+
+
+
+
+
- setOpenImageDialog(false)} variant="outlined" color="secondary" autoFocus>
+ setOpenImageDialog(false)} variant="outlined" color="secondary">
بستن
diff --git a/src/components/dashboard/roadItems/supervisor/RowActions/MachinesCodeForm/index.jsx b/src/components/dashboard/roadItems/supervisor/RowActions/MachinesCodeForm/index.jsx
index d8e8754..ec6ad3e 100644
--- a/src/components/dashboard/roadItems/supervisor/RowActions/MachinesCodeForm/index.jsx
+++ b/src/components/dashboard/roadItems/supervisor/RowActions/MachinesCodeForm/index.jsx
@@ -7,7 +7,7 @@ const MachinesCodeDialog = ({ machinesLists }) => {
const [openMachinesCodeDialog, setOpenMachinesCodeDialog] = useState(false);
return (
<>
-
+
setOpenMachinesCodeDialog(true)}>
@@ -24,7 +24,7 @@ const MachinesCodeDialog = ({ machinesLists }) => {
dir="rtl"
maxWidth={"md"}
>
- کد خودرو
+ خودرو ها
{
const requestServer = useRequest({ notificationSuccess: true });
const validationSchema = Yup.object().shape({
- description: Yup.string().required("توضیحات الزامیست!!!"),
+ description: Yup.string().required("لطفاً توضیحات را وارد کنید."),
});
const {
@@ -51,12 +51,14 @@ const RejectContent = ({ rowId, mutate, setOpenRejectDialog }) => {
{...register("description")}
multiline
rows={8}
- label="توضیحات کارشناس"
+ label="توضیحات و دلایل عدم تأیید"
+ placeholder="لطفاً علت عدم تأیید خود را توضیح دهید"
error={!!errors.description}
helperText={errors.description?.message}
fullWidth
variant="outlined"
sx={{ mt: 1 }}
+ InputLabelProps={{ shrink: true }}
/>
@@ -72,7 +74,7 @@ const RejectContent = ({ rowId, mutate, setOpenRejectDialog }) => {
بستن
- {isSubmitting ? "درحال ارسال اطلاعات..." : "عدم تایید"}
+ {isSubmitting ? "درحال ثبت عدم تایید..." : "ثبت عدم تایید"}
>
diff --git a/src/components/dashboard/roadItems/supervisor/RowActions/RejectForm/index.jsx b/src/components/dashboard/roadItems/supervisor/RowActions/RejectForm/index.jsx
index e05288c..2f08152 100644
--- a/src/components/dashboard/roadItems/supervisor/RowActions/RejectForm/index.jsx
+++ b/src/components/dashboard/roadItems/supervisor/RowActions/RejectForm/index.jsx
@@ -6,7 +6,7 @@ const RejectForm = ({ rowId, mutate }) => {
const [openRejectDialog, setOpenRejectDialog] = useState(false);
return (
<>
-
+
setOpenRejectDialog(true)}>
@@ -20,7 +20,7 @@ const RejectForm = ({ rowId, mutate }) => {
},
}}
>
- عدم تایید
+ عدم تایید فعالیت
>
diff --git a/src/components/dashboard/roadItems/supervisor/SupervisorList.jsx b/src/components/dashboard/roadItems/supervisor/SupervisorList.jsx
index 1dfae7c..84a48c9 100644
--- a/src/components/dashboard/roadItems/supervisor/SupervisorList.jsx
+++ b/src/components/dashboard/roadItems/supervisor/SupervisorList.jsx
@@ -19,6 +19,7 @@ import { useAuth } from "@/lib/contexts/auth";
const SupervisorList = () => {
const statusOptions = [
+ { value: "", label: "همه وضعیت ها" },
{ value: 0, label: "درحال بررسی" },
{ value: 1, label: "تایید" },
{ value: 2, label: "عدم تایید" },
@@ -46,7 +47,7 @@ const SupervisorList = () => {
return [{ value: "error", label: "خطا در بارگذاری" }];
}
return [
- { value: "", label: props.column.header },
+ { value: "", label: "کل کشور" },
...provinces.map((province) => ({
value: province.id,
label: province.name_fa,
@@ -106,7 +107,7 @@ const SupervisorList = () => {
return [{ value: "error", label: "خطا در بارگذاری" }];
}
return [
- { value: "", label: props.column.header },
+ { value: "", label: "کل ادارات" },
...edaratList.map((edare) => ({
value: edare.id,
label: edare.name_fa,
@@ -155,7 +156,7 @@ const SupervisorList = () => {
return [{ value: "error", label: "خطا در بارگذاری" }];
}
return [
- { value: "", label: props.column.header },
+ { value: "", label: "همه آیتم ها" },
...itemsList.map((item) => ({
value: item.id,
label: item.name,
@@ -177,7 +178,7 @@ const SupervisorList = () => {
},
{
accessorKey: "sub_item",
- header: "موضوع مشاهده شده",
+ header: "اقدام انجام شده",
id: "sub_item",
enableColumnFilter: true,
datatype: "numeric",
@@ -200,7 +201,7 @@ const SupervisorList = () => {
return [{ value: "error", label: "خطا در بارگذاری" }];
}
return [
- { value: "", label: props.column.header },
+ { value: "", label: "همه اقدام ها" },
...subItemsList.map((item) => ({
value: item.sub_item,
label: item.name,
@@ -347,7 +348,7 @@ const SupervisorList = () => {
);
}
- return کد خودرویی وجود ندارد;
+ return خودرویی وجود ندارد;
},
},
{
diff --git a/src/components/dashboard/roadPatrols/operator/Actions/Create/index.jsx b/src/components/dashboard/roadPatrols/operator/Actions/Create/index.jsx
index a76a68a..5c2f233 100644
--- a/src/components/dashboard/roadPatrols/operator/Actions/Create/index.jsx
+++ b/src/components/dashboard/roadPatrols/operator/Actions/Create/index.jsx
@@ -26,7 +26,7 @@ const OperatorCreate = ({ mutate }) => {
ثبت اقدام
)}
- {open && }
+
>
);
};
diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionInfo.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionInfo.jsx
index 025aee2..ae935b3 100644
--- a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionInfo.jsx
+++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionInfo.jsx
@@ -1,75 +1,25 @@
"use client";
-import React from "react";
-import dynamic from "next/dynamic";
-import MapLoading from "@/core/components/MapLayer/Loading";
-import {
- Box,
- Card,
- CardActions,
- CardContent,
- CardHeader,
- Chip,
- Divider,
- IconButton,
- Stack,
- Typography,
-} from "@mui/material";
-import HandymanIcon from "@mui/icons-material/Handyman";
import DeleteIcon from "@mui/icons-material/Delete";
-import DirectionsCarIcon from "@mui/icons-material/DirectionsCar";
-import PersonIcon from "@mui/icons-material/Person";
-import DesignServicesIcon from "@mui/icons-material/DesignServices";
+import HandymanIcon from "@mui/icons-material/Handyman";
+import { Box, Card, CardActions, CardHeader, IconButton, Typography } from "@mui/material";
import EditActionDuringPatrol from "./EditActionDuringPatrol";
-const MapLayer = dynamic(() => import("@/core/components/MapLayer"), {
- loading: () => ,
- ssr: false,
-});
-
const ActionInfo = ({ action, setActionsList, index, deleteAction }) => {
return (
-
+
}
title={{action.data.item_name}}
subheader={action.data.sub_item_name}
/>
-
-
-
-
- میزان فعالیت انجام شده:
-
- {action.data.amount}({action.data.unit_fa})
-
-
-
-
- } />
-
-
- {action.data.cmms_machines.map((cmms_machine, index) => (
-
- {index + 1}: {cmms_machine.car_name}
-
- ))}
-
-
-
-
- } />
-
-
- {action.data.rahdaran_id.map((rahdar, index) => (
-
- {index + 1}: {rahdar.name}
-
- ))}
-
-
-
-
diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionsDurigPatrol.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionsDurigPatrol.jsx
index 698346f..304391a 100644
--- a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionsDurigPatrol.jsx
+++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionsDurigPatrol.jsx
@@ -1,14 +1,14 @@
"use client";
-import { Box, Button, Divider, Grid, Typography } from "@mui/material";
import AddCircleIcon from "@mui/icons-material/AddCircle";
-import React, { useState } from "react";
-import ModalActionsDuringPatrol from "./ModalActionsDuringPatrol";
+import ExitToAppIcon from "@mui/icons-material/ExitToApp";
+import { Box, Button, Chip, DialogActions, DialogContent, Divider, Grid, Stack, Typography } from "@mui/material";
+import { useState } from "react";
import ActionInfo from "./ActionInfo";
-import KeyboardDoubleArrowLeftIcon from "@mui/icons-material/KeyboardDoubleArrowLeft";
+import ModalActionsDuringPatrol from "./ModalActionsDuringPatrol";
-const ActionsDuringPatrol = ({ setValue, tabState, setTabState }) => {
- const [ActionsList, setActionsList] = useState([]);
+const ActionsDuringPatrol = ({ allData, setAllData, handlePrev, setTabState }) => {
+ const [actionsList, setActionsList] = useState(allData.observed_items);
const [open, setOpen] = useState(false);
const handleOpen = () => {
setOpen(true);
@@ -18,72 +18,77 @@ const ActionsDuringPatrol = ({ setValue, tabState, setTabState }) => {
setActionsList((prev) => prev.filter((_, index) => index !== indexToRemove));
};
- const SubmitActionDuringPatrol = () => {
- setTabState(tabState + 1);
- const resultItems = ActionsList.map((item) => item.result);
- console.log("resultItems", resultItems);
- setValue("observed_items", resultItems);
+ const handleNext = (data) => {
+ setAllData({ observed_items: data });
+ setTabState((s) => s + 1);
};
return (
-
-
- لیست اقدامات حین گشت
- }
- variant="outlined"
- sx={{ mb: 1, alignSelf: "end" }}
- >
- ثبت اقدام
-
-
-
-
- {ActionsList.length !== 0 ? (
-
- {ActionsList.map((action, index) => (
-
- deleteAction(index)}
- />
-
- ))}
-
- ) : (
-
-
- فعالیتی ثبت نکرده اید
-
-
- )}
-
-
- }
- sx={{ mt: 2 }}
+ <>
+
+
+
- نهایی کردن درخواست
-
+ } variant="outlined" sx={{ mb: 1 }}>
+ ثبت اقدام انجام شده
+
+
+
+
+
+
+ {actionsList.length !== 0 ? (
+
+ {actionsList.map((action, index) => (
+
+ deleteAction(index)}
+ />
+
+ ))}
+
+ ) : (
+
+
+ فعالیتی ثبت نکرده اید
+
+
+ )}
-
-
+
+
+ }
+ >
+ {"صفحه قبل"}
+
+ handleNext(actionsList)}>
+ {"تایید اقدامات و ادامه"}
+
+
+ >
);
};
diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/CompeleteRequest.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/CompeleteRequest.jsx
index bbbd8a0..78a9496 100644
--- a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/CompeleteRequest.jsx
+++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/CompeleteRequest.jsx
@@ -1,10 +1,20 @@
"use client";
-import React, { useEffect, useState } from "react";
+import ShowPlak from "@/core/components/ShowPlak";
+import StyledForm from "@/core/components/StyledForm";
+import { formatCounter } from "@/core/utils/formatCounter";
+import { formatSecondsToHHMMSS } from "@/core/utils/formatSecondsToHHMMSS";
+import { CREATE_PATROL, GET_OTP_TOKEN } from "@/core/utils/routes";
+import useRequest from "@/lib/hooks/useRequest";
+import { yupResolver } from "@hookform/resolvers/yup";
+import ExitToAppIcon from "@mui/icons-material/ExitToApp";
+import ForwardToInboxIcon from "@mui/icons-material/ForwardToInbox";
import {
Box,
Button,
Chip,
+ DialogActions,
+ DialogContent,
Divider,
FormControl,
Grid,
@@ -14,39 +24,53 @@ import {
Stack,
Typography,
} from "@mui/material";
-import BeenhereIcon from "@mui/icons-material/Beenhere";
-import ForwardToInboxIcon from "@mui/icons-material/ForwardToInbox";
-import { formatCounter } from "@/core/utils/formatCounter";
-import useRequest from "@/lib/hooks/useRequest";
-import { GET_OTP_TOKEN } from "@/core/utils/routes";
import moment from "jalali-moment";
+import { useCallback, useEffect, useState } from "react";
+import { useForm } from "react-hook-form";
+import * as yup from "yup";
-const CompeleteRequest = ({ watch, isSubmitting, setValue, register }) => {
- const requestServer = useRequest({ auth: true });
+const schemaOtp = yup.object().shape({
+ phoneNumber: yup
+ .string()
+ .matches(/^09\d{9}$/, "شماره تماس باید با 09 شروع شود و 11 رقم باشد.")
+ .required("شماره تماس الزامی است."),
+});
+
+const schemaSend = yup.object().shape({
+ phoneNumber: yup
+ .string()
+ .matches(/^09\d{9}$/, "شماره تماس باید با 09 شروع شود و 11 رقم باشد.")
+ .required("شماره تماس الزامی است."),
+ code: yup.string().length(6).required("شماره تماس الزامی است."),
+});
+
+const CompeleteRequest = ({ allData, handlePrev, mutate, setOpen }) => {
+ const requestServer = useRequest();
const [delayPerRequest, setDelayPerRequest] = useState(false);
- const [phoneNumber, setPhoneNumber] = useState("");
- const [validPhone, setValidPhone] = useState(false);
- const [verificationCode, setVerificationCode] = useState("");
const [counter, setCounter] = useState(120);
const [otpSended, setOtpSended] = useState(false);
- const [readyToVerify, setReadyToVerify] = useState(false);
- const handleNumericInput = (e) => {
- e.target.value = e.target.value.replace(/[^0-9]/g, "");
+ const defaultValuesOtp = {
+ phoneNumber: "",
};
- useEffect(() => {
- if (phoneNumber.length === 11) {
- setValidPhone(true);
- } else {
- setValidPhone(false);
- }
- if (verificationCode.length === 6 && phoneNumber.length === 11) {
- setReadyToVerify(true);
- } else {
- setReadyToVerify(false);
- }
- }, [phoneNumber, verificationCode]);
+ const defaultValuesSend = {
+ phoneNumber: "",
+ code: "",
+ };
+
+ const {
+ handleSubmit: handleSubmitOtp,
+ register: registerOtp,
+ formState: { isSubmitting: isSubmittingOtp, isValid: isValidOtp },
+ } = useForm({ defaultValues: defaultValuesOtp, resolver: yupResolver(schemaOtp), mode: "onBlur" });
+
+ const {
+ handleSubmit: handleSubmitSend,
+ setValue: setValueSend,
+ register: registerSend,
+ formState: { isSubmitting: isSubmittingSend, isValid: isValidSend },
+ } = useForm({ defaultValues: defaultValuesSend, resolver: yupResolver(schemaSend), mode: "onBlur" });
useEffect(() => {
if (counter === 0) {
@@ -62,167 +86,265 @@ const CompeleteRequest = ({ watch, isSubmitting, setValue, register }) => {
}
}, [counter, delayPerRequest]);
- const sendOtp = () => {
- if (!validPhone) return false;
- requestServer(`${GET_OTP_TOKEN}?phone_number=${phoneNumber}`, "get")
- .then((response) => {
- setOtpSended(true);
- setDelayPerRequest(true);
- })
- .catch(() => { });
+ const sendOtp = async (data) => {
+ try {
+ const response = await requestServer(`${GET_OTP_TOKEN}?phone_number=${data.phoneNumber}`, "get");
+ setOtpSended(true);
+ setDelayPerRequest(true);
+ setValueSend("phoneNumber", data.phoneNumber);
+ } catch (error) {}
};
+ const sendData = useCallback(
+ async (data) => {
+ const formData = new FormData();
+ allData.road_patrol_rahdaran_id.forEach((rahdar, index) =>
+ formData.append(`road_patrol_rahdaran_id[${index}]`, rahdar.id)
+ );
+ formData.append(`road_patrol_machines_id[0]`, allData.roadPatrolMachinesId.id);
+ allData.stopPoints.forEach((stop_point, index) => {
+ formData.append(`stop_points[${index}][duration]`, stop_point.duration);
+ formData.append(`stop_points[${index}][latitude]`, stop_point.latitude);
+ formData.append(`stop_points[${index}][longitude]`, stop_point.longitude);
+ formData.append(`stop_points[${index}][startDT]`, stop_point.startDT);
+ });
+ allData.observed_items.forEach((observed_item, index) => {
+ formData.append(`observed_items[${index}][instant_action]`, 1);
+ formData.append(`observed_items[${index}][local_name]`, "");
+ formData.append(`observed_items[${index}][start_point]`, observed_item.result.start_point);
+ formData.append(`observed_items[${index}][end_point]`, observed_item.result.end_point);
+ formData.append(`observed_items[${index}][amount]`, observed_item.result.amount);
+ formData.append(`observed_items[${index}][before_image]`, observed_item.result.before_image);
+ formData.append(`observed_items[${index}][after_image]`, observed_item.result.after_image);
+ formData.append(`observed_items[${index}][item_id]`, observed_item.result.item_id);
+ formData.append(`observed_items[${index}][sub_item_id]`, observed_item.result.sub_item_id);
+ formData.append(`observed_items[${index}][road_item_machines_id][]`, allData.roadPatrolMachinesId.id);
+ allData.road_patrol_rahdaran_id.forEach((rahdar, index) =>
+ formData.append(`observed_items[${index}][road_item_rahdaran_id][]`, rahdar.id)
+ );
+ });
+ formData.append("start_time", allData.start_time);
+ formData.append("end_time", allData.end_time);
+ formData.append("vehicle_runtime", allData.accOnDuration);
+ formData.append("fuel_consumption", +allData.fuelConsumption);
+ formData.append("distance", allData.mileage);
+ // formData.append("description", "");
+ formData.append("phone_number", data.phoneNumber);
+ formData.append("verification_code", data.code);
+ try {
+ await requestServer(CREATE_PATROL, "post", {
+ data: formData,
+ });
+ mutate();
+ setOpen(false);
+ } catch (error) {
+ console.log(error);
+ }
+ },
+ [allData]
+ );
+
return (
-
-
-
-
-
- {moment(watch("start_time")).locale("fa").format("YYYY/MM/DD | HH:mm")}
-
-
-
-
- {moment(watch("end_time")).locale("fa").format("YYYY/MM/DD | HH:mm")}
-
-
-
-
-
-
-
- {watch("vehicle_runtime")}
-
-
-
-
- {watch("fuel_consumption")}
-
-
-
-
- {watch("stop_points").length}
-
-
-
-
- {watch("distance")}
-
-
-
-
- {watch("observed_items").length}
-
-
-
-
+ <>
+
+
+
-
+
-
- کد
-
- {watch("road_patrol_machines_id.machine_code")}
-
-
- نام
-
- {watch("road_patrol_machines_id.car_name")}
-
-
- پلاک
-
- {watch("road_patrol_machines_id.plak_number")}
-
-
-
-
-
-
- {watch("road_patrol_rahdaran_id")?.map((rahdar, index) => (
-
- نام و کد راهدار
+
+
+
- {rahdar.name} | {rahdar.code}
+ {allData.start_time !== "" &&
+ moment(allData.start_time).locale("fa").format("YYYY/MM/DD | HH:mm")}
-
- ))}
-
-
-
-
-
- شماره تلفن مامور گشت
- setPhoneNumber(e.target.value)}
- onInput={handleNumericInput}
- type="text"
- inputProps={{
- maxLength: 11,
- }}
- />
-
- }
+
+
+
+
+
+ {allData.start_time !== "" &&
+ moment(allData.start_time).locale("fa").format("YYYY/MM/DD | HH:mm")}
+
+
+
+
+
+
+
+
+ {allData.accOnDuration && formatSecondsToHHMMSS(allData.accOnDuration)}
+
+
+
+
+
+
+ {allData.fuelConsumption && Math.round(allData.fuelConsumption * 10) / 10} لیتر
+
+
+
+
+
+ {allData.stopPoints && allData.stopPoints.length}
+
+
+
+
+
+ {allData.mileage && (allData.mileage / 1000).toFixed(1)} کیلومتر
+
+
+
+
+
+ {allData.observed_items && allData.observed_items.length}
+
+
+
+
+
+
+
+
+
+
+
+ {allData.roadPatrolMachinesId && allData.roadPatrolMachinesId.machine_code}
+
+
+
+
+
+
+ {allData.roadPatrolMachinesId && allData.roadPatrolMachinesId.car_name}
+
+
+
+
+
+
+ {allData.roadPatrolMachinesId.plak_number &&
+ ShowPlak({ plak_number: allData.roadPatrolMachinesId.plak_number })}
+
+
+
+
+
+
+
+ {allData.road_patrol_rahdaran_id.map((rahdar, index) => (
+
+
+
+
+
+ {rahdar.name} | {rahdar.code}
+
+
+
+ ))}
+
+
+
+
+
+
- {delayPerRequest ? formatCounter(counter) : "دریافت کد"}
-
-
-
-
-
- کد پیامک شده
- setVerificationCode(e.target.value)}
- onInput={handleNumericInput}
- type="text"
- inputProps={{
- maxLength: 6,
- inputMode: "numeric",
- style: {
- textAlign: "center",
- letterSpacing: "10px",
- },
- }}
- />
-
+
+
+
+ شماره تلفن مامور گشت
+
+
+ }
+ >
+ {delayPerRequest
+ ? formatCounter(counter)
+ : isSubmittingOtp
+ ? "درحال دریافت کد ..."
+ : "دریافت کد"}
+
+
+
+
+
+
+
+ کد تایید پیامک شده
+
+
+
+
+
-
+
-
- }
- >
- {isSubmitting ? "در حال ثبت فعالیت" : "ثبت فعالیت"}
-
-
+
+
+ }
+ >
+ {"صفحه قبل"}
+
+
+ {isSubmittingSend ? "در حال ثبت ..." : "تایید نهایی و ثبت"}
+
+
+ >
);
};
diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/DatePickerForEndTime.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/DatePickerForEndTime.jsx
new file mode 100644
index 0000000..10e1526
--- /dev/null
+++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/DatePickerForEndTime.jsx
@@ -0,0 +1,54 @@
+import { IconButton, InputAdornment } from "@mui/material";
+import { ClearIcon, MobileDateTimePicker } from "@mui/x-date-pickers";
+import moment from "jalali-moment";
+import { useWatch } from "react-hook-form";
+
+const DatePickerForEndTime = ({ field, fieldState: { error }, control }) => {
+ const startTime = useWatch({ control, name: "start_time" });
+ return (
+ {
+ const date = new Date(end_time);
+ const formattedDate = moment(date).locale("en").format("YYYY-MM-DD HH:mm");
+ field.onChange(formattedDate);
+ }}
+ slotProps={{
+ textField: {
+ size: "small",
+ placeholder: "تاریخ و ساعت وارد کنید",
+ InputLabelProps: { shrink: true },
+ sx: { width: { xs: "100%", md: 200 } },
+ InputProps: {
+ endAdornment: (
+
+ {
+ event.stopPropagation();
+ field.onChange("");
+ }}
+ sx={{
+ color: "#bfbfbf",
+ "&:hover": {
+ backgroundColor: "rgba(189, 189, 189, 0.1)",
+ color: "#363434",
+ },
+ }}
+ >
+
+
+
+ ),
+ },
+ },
+ }}
+ label="تاریخ و ساعت پایان گشت"
+ />
+ );
+};
+export default DatePickerForEndTime;
diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/DatePickerForStartTime.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/DatePickerForStartTime.jsx
new file mode 100644
index 0000000..927ad13
--- /dev/null
+++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/DatePickerForStartTime.jsx
@@ -0,0 +1,54 @@
+import { IconButton, InputAdornment } from "@mui/material";
+import { ClearIcon, MobileDateTimePicker } from "@mui/x-date-pickers";
+import moment from "jalali-moment";
+import { useWatch } from "react-hook-form";
+
+const DatePickerForStartTime = ({ field, fieldState: { error }, control }) => {
+ const endTime = useWatch({ control, name: "end_time" });
+ return (
+ {
+ const date = new Date(start_time);
+ const formattedDate = moment(date).locale("en").format("YYYY-MM-DD HH:mm");
+ field.onChange(formattedDate);
+ }}
+ slotProps={{
+ textField: {
+ size: "small",
+ placeholder: "تاریخ و ساعت وارد کنید",
+ InputLabelProps: { shrink: true },
+ sx: { width: { xs: "100%", md: 200 } },
+ InputProps: {
+ endAdornment: (
+
+ {
+ event.stopPropagation();
+ field.onChange("");
+ }}
+ sx={{
+ color: "#bfbfbf",
+ "&:hover": {
+ backgroundColor: "rgba(189, 189, 189, 0.1)",
+ color: "#363434",
+ },
+ }}
+ >
+
+
+
+ ),
+ },
+ },
+ }}
+ label="تاریخ و ساعت شروع گشت"
+ />
+ );
+};
+export default DatePickerForStartTime;
diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/EditActionDuringPatrol.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/EditActionDuringPatrol.jsx
index 1693c39..46875ce 100644
--- a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/EditActionDuringPatrol.jsx
+++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/EditActionDuringPatrol.jsx
@@ -48,7 +48,12 @@ const EditActionDuringPatrol = ({ action, index, setActionsList }) => {
}}
>
ویرایش اطلاعات
-
+
>
);
diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolDetail.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolDetail.jsx
index 487f38e..75515aa 100644
--- a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolDetail.jsx
+++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolDetail.jsx
@@ -1,202 +1,179 @@
"use client";
-import { Box, Button, Chip, Divider, IconButton, InputAdornment, Stack } from "@mui/material";
-import React, { useEffect, useState } from "react";
import CarCode from "@/core/components/CarCode";
+import StyledForm from "@/core/components/StyledForm";
+import { GET_FMS_DATA as GET_VAHICLE_OPRATION } from "@/core/utils/routes";
+import useRequest from "@/lib/hooks/useRequest";
+import { yupResolver } from "@hookform/resolvers/yup";
+import ExitToAppIcon from "@mui/icons-material/ExitToApp";
import SearchIcon from "@mui/icons-material/Search";
+import { Box, Button, Chip, DialogActions, DialogContent, Divider, Stack } from "@mui/material";
+import { LocalizationProvider } from "@mui/x-date-pickers";
import { AdapterDateFnsJalali } from "@mui/x-date-pickers/AdapterDateFnsJalali";
import { faIR } from "@mui/x-date-pickers/locales";
-import { LocalizationProvider, MobileDateTimePicker } from "@mui/x-date-pickers";
-import ClearIcon from "@mui/icons-material/Clear";
import moment from "jalali-moment";
-import dynamic from "next/dynamic";
-import MapLoading from "@/core/components/MapLayer/Loading";
-import { Controller } from "react-hook-form";
-import { GET_FMS_DATA } from "@/core/utils/routes";
-import useRequest from "@/lib/hooks/useRequest";
+import { useState } from "react";
+import { Controller, useForm } from "react-hook-form";
+import * as yup from "yup";
+import DatePickerForEndTime from "./DatePickerForEndTime";
+import DatePickerForStartTime from "./DatePickerForStartTime";
import PatrolDetailInfo from "./PatrolDetailInfo";
import PatrolResultCodeErrors from "./PatrolResultCodeErrors";
-const MapLayer = dynamic(() => import("@/core/components/MapLayer"), {
- loading: () => ,
- ssr: false,
+const schema = yup.object().shape({
+ roadPatrolMachinesId: yup.object().required("خودرو الزامی است."),
+ start_time: yup.string().required("زمان شروع الزامی است."),
+ end_time: yup.string().required("زمان پایان الزامی است."),
});
-const PatrolDetail = ({ control, watch, setValue, tabState, setTabState }) => {
- const requestServer = useRequest({ notificationSuccess: true });
- const [patrolResultStatus, setPatrolResultStatus] = useState(null);
- const [readyToRequest, setReadyToRequest] = useState(false);
- const [patrolData, setPatrolData] = useState(null);
+const PatrolDetail = ({ allData, setAllData, handlePrev, setTabState }) => {
+ const defaultValues = {
+ has_vehicle_operation: allData.has_vehicle_operation,
+ roadPatrolMachinesId: allData.roadPatrolMachinesId,
+ start_time: allData.start_time,
+ end_time: allData.end_time,
+ stopPoints: allData.stopPoints,
+ accOnDuration: allData.accOnDuration,
+ fuelConsumption: allData.fuelConsumption,
+ mileage: allData.mileage,
+ };
+ const requestServer = useRequest();
+ const [patrolResultStatus, setPatrolResultStatus] = useState(allData.resultCode);
+ const [patrolData, setPatrolData] = useState(defaultValues);
- const requestPatrolInfo = async () => {
+ const {
+ control,
+ handleSubmit,
+ setValue,
+ formState: { isSubmitting, isValid },
+ } = useForm({ defaultValues, resolver: yupResolver(schema), mode: "onBlur" });
+
+ const requestPatrolInfo = async (data) => {
+ setPatrolResultStatus(1);
+ setPatrolData((pd) => ({ ...pd, has_vehicle_operation: false }));
const formData = new FormData();
- formData.append("machineCode", watch("road_patrol_machines_id").machine_code);
- formData.append("startDT", moment(watch("start_time")).format("YYYY-MM-DDTHH:mm"));
- formData.append("endDT", moment(watch("end_time")).format("YYYY-MM-DDTHH:mm"));
- await requestServer(GET_FMS_DATA, "post", {
- data: formData,
- })
- .then((response) => {
- const data = response.data.data;
- setPatrolData({
- ...data,
- roadPatrolMachinesId: watch("road_patrol_machines_id"),
- start_time: watch("start_time"),
- end_time: watch("end_time"),
- });
- setPatrolResultStatus(data.resultCode);
- })
- .catch((error) => {});
+ formData.append("machineCode", data.roadPatrolMachinesId.machine_code);
+ formData.append("startDT", moment(data.start_time).format("YYYY-MM-DDTHH:mm"));
+ formData.append("endDT", moment(data.end_time).format("YYYY-MM-DDTHH:mm"));
+ try {
+ const response = await requestServer(GET_VAHICLE_OPRATION, "post", {
+ data: formData,
+ });
+ const result = response.data.data;
+ setPatrolData({
+ ...result,
+ roadPatrolMachinesId: data.roadPatrolMachinesId,
+ start_time: data.start_time,
+ end_time: data.end_time,
+ has_vehicle_operation: result.resultCode == 0,
+ });
+
+ setValue("stopPoints", result.stopPoints);
+ setValue("accOnDuration", result.accOnDuration);
+ setValue("fuelConsumption", result.fuelConsumption);
+ setValue("mileage", result.mileage);
+ setValue("has_vehicle_operation", true);
+ setPatrolResultStatus(result.resultCode);
+ } catch (error) {}
};
- useEffect(() => {
- const roadPatrolMachinesId = watch("road_patrol_machines_id");
- const startTime = watch("start_time");
- const endTime = watch("end_time");
-
- const isReady = roadPatrolMachinesId !== null && startTime !== "" && endTime !== "";
- setReadyToRequest(isReady);
- }, [watch("road_patrol_machines_id"), watch("start_time"), watch("end_time")]);
+ const handleNext = (data) => {
+ setAllData(data);
+ setTabState((s) => s + 1);
+ };
return (
-
-
-
- {
- return (
- field.onChange(value)}
- error={error}
- />
- );
+ <>
+
+
+
-
-
-
- {
- const date = new Date(start_time);
- const formattedDate = moment(date).locale("en").format("YYYY-MM-DD HH:mm");
- setValue("start_time", formattedDate);
- }}
- slotProps={{
- textField: {
- size: "small",
- placeholder: "تاریخ و ساعت شروع گشت",
- InputProps: {
- endAdornment: (
-
- {
- event.stopPropagation();
- setValue("start_time", "");
- }}
- sx={{
- color: "#bfbfbf",
- "&:hover": {
- backgroundColor: "rgba(189, 189, 189, 0.1)",
- color: "#363434",
- },
- }}
- >
-
-
-
- ),
- },
- },
- }}
- label="تاریخ و ساعت شروع گشت"
- />
- {
- const date = new Date(end_time);
- const formattedDate = moment(date).locale("en").format("YYYY-MM-DD HH:mm");
- setValue("end_time", formattedDate);
- }}
- slotProps={{
- textField: {
- size: "small",
- placeholder: "تاریخ و ساعت پایان گشت",
- InputProps: {
- endAdornment: (
-
- {
- event.stopPropagation();
- setValue("end_time", "");
- }}
- sx={{
- color: "#bfbfbf",
- "&:hover": {
- backgroundColor: "rgba(189, 189, 189, 0.1)",
- color: "#363434",
- },
- }}
- >
-
-
-
- ),
- },
- },
- }}
- label="تاریخ و ساعت پایان گشت"
- />
-
+
+
+
+ {
+ return (
+ field.onChange(value)}
+ error={error}
+ />
+ );
+ }}
+ name={"roadPatrolMachinesId"}
+ />
+
+
+
+ }
+ name={"start_time"}
+ />
+ }
+ name={"end_time"}
+ />
+
+
+ }
+ >
+ {isSubmitting ? "درحال دریافت عملکرد خودرو ..." : "دریافت عملکرد خوردو"}
+
+
+
+
+
+
+ {patrolResultStatus !== 0 && }
+
+
+
+
+ }
+ >
+ {"بستن"}
+
}
+ size="large"
+ disabled={!patrolData?.has_vehicle_operation}
+ onClick={() => handleNext(patrolData)}
>
- درخواست اطلاعات
+ {"تایید مشخصات گشت و ادامه"}
-
-
-
-
- {patrolResultStatus === 0 ? (
-
- ) : (
-
- )}
-
+
+ >
);
};
diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolDetailInfo.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolDetailInfo.jsx
index 81fb7f0..f67f322 100644
--- a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolDetailInfo.jsx
+++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolDetailInfo.jsx
@@ -1,6 +1,18 @@
"use client";
-import { Box, Button, Card, CardActions, CardContent, Chip, Divider, Slide, Stack, Typography } from "@mui/material";
+import {
+ Box,
+ Button,
+ Card,
+ CardActions,
+ CardContent,
+ Chip,
+ Divider,
+ Fade,
+ Slide,
+ Stack,
+ Typography,
+} from "@mui/material";
import React, { useEffect } from "react";
import dynamic from "next/dynamic";
import MapLoading from "@/core/components/MapLayer/Loading";
@@ -16,6 +28,8 @@ import QrCode2Icon from "@mui/icons-material/QrCode2";
import moment from "jalali-moment";
import PatrolMapFeatures from "./PatrolMapFeatures";
import { useMap } from "react-leaflet";
+import { formatSecondsToHHMMSS } from "@/core/utils/formatSecondsToHHMMSS";
+import ShowPlak from "@/core/components/ShowPlak";
const MapLayer = dynamic(() => import("@/core/components/MapLayer"), {
loading: () => ,
@@ -27,111 +41,109 @@ const MapItemViewBound = ({ patrolData, bound }) => {
useEffect(() => {
if (bound.length !== 0) {
- map.fitBounds(bound, { paddingTopLeft: [16, 16], paddingBottomRight: [16, 130] });
+ map.fitBounds(bound, { paddingTopLeft: [64, 64], paddingBottomRight: [64, 64] });
}
}, [bound]);
return (
<>
- {patrolData.stopPoints.map((stopPoint, index) => (
-
-
-
- ))}
+ {patrolData?.stopPoints &&
+ patrolData.stopPoints.map((stopPoint, index) => (
+
+
+
+ ))}
>
);
};
-const PatrolDetailInfo = ({ patrolData, tabState, setTabState, setValue }) => {
- const bound = patrolData.stopPoints.map((point) => [point.latitude, point.longitude]);
-
- const SendPatrolInfo = () => {
- setValue("vehicle_runtime", patrolData.accOnDuration);
- setValue("fuel_consumption", patrolData.fuelConsumption);
- setValue("distance", patrolData.mileage);
- setValue("stop_points", patrolData.stopPoints);
- setTabState(tabState + 1);
- };
+const PatrolDetailInfo = ({ patrolData }) => {
+ const bound = patrolData?.stopPoints
+ ? patrolData?.stopPoints.map((point) => [point.latitude, point.longitude])
+ : [];
return (
-
-
+
+
-
+
} />
- {Math.floor(patrolData.accOnDuration / 60)} دقیقه
+ {formatSecondsToHHMMSS(patrolData?.accOnDuration)}
} />
- {patrolData.roadPatrolMachinesId.car_name}
+ {patrolData?.roadPatrolMachinesId?.car_name}
} />
- {patrolData.roadPatrolMachinesId.machine_code}
+ {patrolData?.roadPatrolMachinesId?.machine_code}
-
+
} />
-
- {patrolData.roadPatrolMachinesId.plak_number}
-
+
+ {patrolData?.roadPatrolMachinesId?.plak_number &&
+ ShowPlak({ plak_number: patrolData?.roadPatrolMachinesId?.plak_number })}
+
} />
- {moment(patrolData.start_time).locale("fa").format("HH:mm | YYYY/MM/DD")}
+ {patrolData?.start_time !== "" &&
+ moment(patrolData?.start_time).locale("fa").format("HH:mm | YYYY/MM/DD")}
} />
- {moment(patrolData.end_time).locale("fa").format("HH:mm | YYYY/MM/DD")}
+ {patrolData?.end_time !== "" &&
+ moment(patrolData?.end_time).locale("fa").format("HH:mm | YYYY/MM/DD")}
- } />
+ } />
- {(patrolData.mileage / 1000).toFixed(1)} کیلومتر
+ {(patrolData?.mileage / 1000).toFixed(1)} کیلومتر
- } />
+ } />
- {Math.round(patrolData.fuelConsumption * 10) / 10} لیتر
+ {Math.round(patrolData?.fuelConsumption * 10) / 10} لیتر
} />
- {patrolData.stopPoints.length} مورد
+ {patrolData?.stopPoints?.length} مورد
-
+
{
justifyContent: "center",
}}
>
-
-
-
+ {bound.length > 0 && (
+
+
+
+ )}
-
-
- }
- sx={{ mt: 2 }}
- >
- تایید اطلاعات و رفتن به مرحله بعد
-
-
-
-
+
);
};
diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolForms.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolForms.jsx
index bc67467..63b877c 100644
--- a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolForms.jsx
+++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolForms.jsx
@@ -1,20 +1,17 @@
"use client";
-import { Box, DialogContent, Tab, Tabs, useMediaQuery } from "@mui/material";
import { useTheme } from "@emotion/react";
-import React, { useEffect, useState } from "react";
-import TaxiAlertIcon from "@mui/icons-material/TaxiAlert";
import EngineeringIcon from "@mui/icons-material/Engineering";
import HandymanIcon from "@mui/icons-material/Handyman";
+import TaxiAlertIcon from "@mui/icons-material/TaxiAlert";
import VerifiedIcon from "@mui/icons-material/Verified";
-import PatrolTimeLine from "./PatrolTimeLine";
+import { Box, Tab, Tabs, useMediaQuery } from "@mui/material";
+import { DialogHeader } from "next/dist/client/components/react-dev-overlay/internal/components/Dialog";
+import { useCallback, useEffect, useReducer, useState } from "react";
+import ActionsDuringPatrol from "./ActionsDurigPatrol";
+import CompeleteRequest from "./CompeleteRequest";
import PatrolDetail from "./PatrolDetail";
import SuperVisorsDetail from "./SuperVisorsDetail";
-import ActionsDuringPatrol from "./ActionsDurigPatrol";
-import { useForm } from "react-hook-form";
-import StyledForm from "@/core/components/StyledForm";
-import useRequest from "@/lib/hooks/useRequest";
-import CompeleteRequest from "./CompeleteRequest";
function TabPanel(props) {
const { children, value, index } = props;
@@ -27,21 +24,32 @@ function TabPanel(props) {
}
const defaultValues = {
- road_patrol_rahdaran_id: null,
- road_patrol_machines_id: null,
+ has_vehicle_operation: false,
+ road_patrol_rahdaran_id: [],
+ roadPatrolMachinesId: null,
start_time: "",
end_time: "",
- stop_points: null,
- vehicle_runtime: "",
- fuel_consumption: "",
- distance: "",
- observed_items: null,
+ stopPoints: null,
+ accOnDuration: "",
+ fuelConsumption: "",
+ mileage: "",
+ observed_items: [],
phone_number: "",
otp_token: "",
+ resultCode: null,
+};
+
+const reducer = (state, action) => {
+ switch (action.type) {
+ case "changeData":
+ return { ...state, ...action.data };
+ default:
+ return state;
+ }
};
const PatrolForms = ({ mutate, setOpen }) => {
- const requestServer = useRequest({ notificationSuccess: true });
+ const [allData, dispatch] = useReducer(reducer, defaultValues);
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down("md"));
const [tabState, setTabState] = useState(0);
@@ -57,123 +65,68 @@ const PatrolForms = ({ mutate, setOpen }) => {
}
}, [tabState]);
- const {
- control,
- watch,
- getValues,
- register,
- handleSubmit,
- setValue,
- resetField,
- formState: { isSubmitting },
- } = useForm({
- defaultValues,
- mode: "onBlur",
- });
-
- const onSubmit = async (data) => {
- console.log("data", data);
- // const formData = new FormData();
- // data.road_patrol_rahdaran_id.forEach((rahdar, index) => formData.append(`road_patrol_rahdaran_id[${index}]`, rahdar.id));
- // formData.append(`road_patrol_machines_id[0]`, data.road_patrol_machines_id.id)
- // data.stop_points.forEach((stop_point, index) => formData.append(`stop_points[${index}]`, stop_point))
- // data.observed_items.forEach((observed_item, index) => {
- // formData.append(`observed_items[${index}][instant_action]`, 1);
- // formData.append(`observed_items[${index}][local_name]`, "");
- // formData.append(`observed_items[${index}][start_point]`, observed_item.start_point);
- // formData.append(`observed_items[${index}][start_point]`, observed_item.end_point);
- // formData.append(`observed_items[${index}][amount]`, observed_item.amount);
- // formData.append(`observed_items[${index}][before_image]`, observed_item.before_image);
- // formData.append(`observed_items[${index}][after_image]`, observed_item.after_image);
- // observed_item.cmms_machines.forEach((machine) => formData.append(`observed_items[${index}][cmms_machines][]`, machine.id))
- // observed_item.rahdaran_id.forEach((rahdar) => formData.append(`observed_items[${index}][rahdaran_id][]`, rahdar.id))
- // formData.append(`observed_items[${index}][sub_item_id]`, observed_item.sub_item_id);
- // })
- // formData.append("start_time", data.start_time);
- // formData.append("end_time", data.end_time);
- // formData.append("vehicle_runtime", data.vehicle_runtime);
- // formData.append("fuel_consumption", +data.fuel_consumption);
- // formData.append("distance", data.distance);
- // formData.append("description", "");
- // formData.append("phone_number", data.phone_number);
- // formData.append("verification_code", data.verification_code);
- // if (data.phone_number !== "" && data.verification_code !== "") {
- // try {
- // await requestServer(CREATE_PATROL, "post", {
- // data: formData,
- // });
- // mutate();
- // setOpen(false);
- // } catch (error) {
- // }
- // } else {
- // console.log("error phone number")
- // }
- };
+ const handlePrev = useCallback(() => {
+ if (tabState == 0) {
+ setOpen(false);
+ }
+ setTabState((s) => s - 1);
+ }, [tabState]);
return (
-
-
- = 0)} icon={} label="مشخصات گشت">
- = 1)} icon={} label="مشخصات راهداران">
- = 2)} icon={} label="اقدامات حین گشت">
- = 3)} icon={} label="تکمیل درخواست">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {!isMobile && (
-
-
-
- )}
-
-
+ <>
+
+
+ = 0)} icon={} label="مشخصات گشت">
+ = 1)} icon={} label="مشخصات راهداران">
+ = 2)} icon={} label="اقدامات حین گشت">
+ = 3)} icon={} label="بررسی نهایی و ثبت">
+
+
+
+ {
+ dispatch({ type: "changeData", data });
+ }}
+ handlePrev={handlePrev}
+ setTabState={setTabState}
+ />
+
+
+ {
+ dispatch({ type: "changeData", data });
+ }}
+ handlePrev={handlePrev}
+ setTabState={setTabState}
+ />
+
+
+ {
+ dispatch({ type: "changeData", data });
+ }}
+ handlePrev={handlePrev}
+ setTabState={setTabState}
+ />
+
+
+
+
+ >
);
};
export default PatrolForms;
diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolResultCodeErrors.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolResultCodeErrors.jsx
index da28921..e079d0e 100644
--- a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolResultCodeErrors.jsx
+++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PatrolResultCodeErrors.jsx
@@ -5,6 +5,7 @@ import React from "react";
const PatrolResultCodeErrors = ({ ResultCode }) => {
const errorMessages = {
+ [1]: "درحال دریافت عملکرد خودرو ...",
[-1]: "نام کاربری یا کلمه عبور صحیح نمیباشد",
[-2]: "ردیاب به خودرو انتخابی متصل نیست",
[-3]: "کاربر دسترسی لازم به اطلاعات خودرو انتخابی را ندارد",
@@ -14,8 +15,11 @@ const PatrolResultCodeErrors = ({ ResultCode }) => {
const message = errorMessages[ResultCode] || "ابتدا اطلاعات بالا را تکمیل نمایید";
return (
-
-
+
+
{message}
diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/SuperVisorInfo.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/SuperVisorInfo.jsx
index c70c5f4..d9ffef6 100644
--- a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/SuperVisorInfo.jsx
+++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/SuperVisorInfo.jsx
@@ -8,11 +8,13 @@ import React from "react";
const SuperVisorInfo = ({ superVisor, deleteSuperVisor }) => {
return (
{
- const [SuperVisorList, setSuperVisorList] = useState([]);
- const [readyToRequest, setReadyToRequest] = useState(false);
+const schema = yup.object().shape({
+ road_patrol_rahdaran_id: yup.object().required("راهدار الزامی است."),
+});
- const requestPatrolInfo = () => {
- setSuperVisorList((prev) => [...prev, watch("road_patrol_rahdaran_id")]);
- setReadyToRequest(false);
- setValue("road_patrol_rahdaran_id", null);
+const SuperVisorsDetail = ({ allData, setAllData, handlePrev, setTabState }) => {
+ const [SuperVisorList, setSuperVisorList] = useState(allData.road_patrol_rahdaran_id);
+
+ const defaultValues = {
+ road_patrol_rahdaran_id: null,
+ };
+
+ const {
+ control,
+ handleSubmit,
+ reset,
+ setValue,
+ formState: { isSubmitting, isValid },
+ } = useForm({ defaultValues, resolver: yupResolver(schema), mode: "onBlur" });
+
+ const requestPatrolInfo = (data) => {
+ setSuperVisorList((prev) => [...prev, data.road_patrol_rahdaran_id]);
+ reset();
};
const deleteSuperVisor = (id) => {
setSuperVisorList((prev) => prev.filter((superVisor) => superVisor.id !== id));
};
- useEffect(() => {
- setReadyToRequest(watch("road_patrol_rahdaran_id") != null);
- }, [watch("road_patrol_rahdaran_id")]);
-
- const SendSuperVisor = () => {
- setValue("road_patrol_rahdaran_id", SuperVisorList);
- setTabState(tabState + 1);
+ const handleNext = (data) => {
+ setAllData({ road_patrol_rahdaran_id: data });
+ setTabState((s) => s + 1);
};
return (
-
-
-
-
- {
- return (
- field.onChange(value)}
- error={error}
- multiple={false}
- />
- );
- }}
- name={"road_patrol_rahdaran_id"}
- />
-
- }
- >
- ثبت راهدار
-
-
-
-
-
-
- {SuperVisorList.length !== 0 ? (
- <>
-
- {SuperVisorList.map((superVisor) => (
-
-
-
- ))}
-
+ <>
+
+
- }
- sx={{ mt: 2 }}
- >
- بازگشت
-
- }
- sx={{ mt: 2 }}
- >
- تایید اطلاعات و رفتن به مرحله بعد
-
+
+
+
+ {
+ return (
+ field.onChange(value)}
+ error={error}
+ multiple={false}
+ />
+ );
+ }}
+ name={"road_patrol_rahdaran_id"}
+ />
+
+
+ افزودن راهدار
+
+
+
+
+
+
+ {SuperVisorList.length === 0 && (
+
+
+ ابتدا اطلاعات بالا را تکمیل نمایید
+
+
+ )}
+
+
+ {SuperVisorList.length !== 0 &&
+ SuperVisorList.map((superVisor) => (
+
+
+
+ ))}
+
+
- >
- ) : (
-
-
- ابتدا اطلاعات بالا را تکمیل نمایید
-
- )}
-
+
+
+ }
+ >
+ {"صفحه قبل"}
+
+ handleNext(SuperVisorList)}
+ >
+ {"تایید راهداران و ادامه"}
+
+
+ >
);
};
diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/index.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/index.jsx
index 3c1c72c..7769896 100644
--- a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/index.jsx
+++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/index.jsx
@@ -5,8 +5,8 @@ import PatrolForms from "./PatrolForms";
const CreatePatrol = ({ open, setOpen, mutate }) => {
return (
-
- {staticData.fuelConsumption || ""} لیتر
+ {Math.round(patrolData?.fuelConsumption * 10) / 10} لیتر
@@ -45,14 +46,14 @@ const StopsInfo = ({ selectedPoint, staticData }) => {
icon={}
label={
- مسافت طیشده
+ مسافت پیموده شده
}
/>
- {staticData.mileage || ""} کیلومتر
+ {(patrolData?.mileage / 1000).toFixed(1)} کیلومتر
@@ -68,7 +69,7 @@ const StopsInfo = ({ selectedPoint, staticData }) => {
- {(staticData.accOnDuration / 60)?.toFixed(2) || ""} دقیقه
+ {formatSecondsToHHMMSS(patrolData?.accOnDuration)}
diff --git a/src/components/dashboard/roadPatrols/operator/RowActions/MachinePerformanceForm/index.jsx b/src/components/dashboard/roadPatrols/operator/RowActions/MachinePerformanceForm/index.jsx
index 242902f..8f35d4f 100644
--- a/src/components/dashboard/roadPatrols/operator/RowActions/MachinePerformanceForm/index.jsx
+++ b/src/components/dashboard/roadPatrols/operator/RowActions/MachinePerformanceForm/index.jsx
@@ -3,34 +3,15 @@ import DirectionsCarIcon from "@mui/icons-material/DirectionsCar";
import MachinePerformanceContent from "./MachinePerformanceContent";
import { useState } from "react";
-const MachinePerformanceForm = () => {
+const MachinePerformanceForm = ({ row }) => {
const [openMachinesCodeDialog, setOpenMachinesCodeDialog] = useState(false);
const machineData = {
- cmms_machine_code: 245,
+ cmms_machine_code: row.original?.cmms_machines[0]?.machine_code,
resultCode: 0,
- mileage: 17645,
- accOnDuration: 3599,
- fuelConsumption: 6.1757503,
- stopPoints: [
- {
- startDT: "2024-12-23T13:55:40",
- duration: 114,
- latitude: 37.521317,
- longitude: 46.103584,
- },
- {
- startDT: "2024-12-23T14:31:11",
- duration: 14,
- latitude: 37.566532,
- longitude: 46.17688,
- },
- {
- startDT: "2024-12-23T14:35:36",
- duration: 55,
- latitude: 37.569958,
- longitude: 46.18166,
- },
- ],
+ mileage: row.original?.distance,
+ accOnDuration: row.original?.vehicle_runtime,
+ fuelConsumption: row.original?.fuel_consumption,
+ stopPoints: row.original?.stop_points,
};
return (
<>
diff --git a/src/components/dashboard/roadPatrols/operator/RowActions/ReportForm/index.jsx b/src/components/dashboard/roadPatrols/operator/RowActions/ReportForm/index.jsx
index 0319aaf..4c834ca 100644
--- a/src/components/dashboard/roadPatrols/operator/RowActions/ReportForm/index.jsx
+++ b/src/components/dashboard/roadPatrols/operator/RowActions/ReportForm/index.jsx
@@ -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 { IconButton, Tooltip } from "@mui/material";
const ReportForm = ({ rowId }) => {
- const reportUrl = `https://rms.rmto.ir/v2/road_patrols/operator/report/${rowId}`;
return (
{
return (
@@ -12,7 +14,7 @@ const StopsInfo = ({ selectedPoint, staticData }) => {
icon={}
label={
- کد ماشین
+ کد خودرو
}
/>
@@ -28,14 +30,14 @@ const StopsInfo = ({ selectedPoint, staticData }) => {
icon={}
label={
- مصرف سوخت
+ میزان سوخت مصرفی
}
/>
- {staticData.fuelConsumption || ""} لیتر
+ {Math.round(staticData?.fuelConsumption * 10) / 10} لیتر
@@ -44,14 +46,14 @@ const StopsInfo = ({ selectedPoint, staticData }) => {
icon={}
label={
- مسافت طیشده
+ مسافت پیموده شده
}
/>
- {staticData.mileage || ""} کیلومتر
+ {(staticData?.mileage / 1000).toFixed(1)} کیلومتر
@@ -67,62 +69,59 @@ const StopsInfo = ({ selectedPoint, staticData }) => {
- {(staticData.accOnDuration / 60)?.toFixed(2) || ""} دقیقه
+ {formatSecondsToHHMMSS(staticData?.accOnDuration)}
+
+
+
+
+ }
+ label={
+
+ طول جغرافیایی
+
+ }
+ />
+
+
+
+ {selectedPoint ? selectedPoint.longitude : "نقطه مورد نظر را انتخاب کنید"}
+
+
+
+
+ }
+ label={
+
+ عرض جغرافیایی
+
+ }
+ />
+
+
+
+ {selectedPoint ? selectedPoint.latitude : "نقطه مورد نظر را انتخاب کنید"}
+
+
+
+
+ }
+ label={
+
+ مدت زمان توقف
+
+ }
+ />
+
+
+
+ {selectedPoint
+ ? `${formatSecondsToHHMMSS(selectedPoint.duration)} ثانیه`
+ : "نقطه مورد نظر را انتخاب کنید"}
-
- {selectedPoint && (
- <>
-
-
- }
- label={
-
- طول جغرافیایی
-
- }
- />
-
-
-
- {selectedPoint.longitude || ""}
-
-
-
-
- }
- label={
-
- عرض جغرافیایی
-
- }
- />
-
-
-
- {selectedPoint.latitude || ""}
-
-
-
-
- }
- label={
-
- مدت زمان توقف
-
- }
- />
-
-
-
- {selectedPoint.duration || ""} ثانیه
-
-
- >
- )}
);
};
diff --git a/src/components/dashboard/roadPatrols/supervisor/RowActions/MachinePerformanceForm/index.jsx b/src/components/dashboard/roadPatrols/supervisor/RowActions/MachinePerformanceForm/index.jsx
index 242902f..8f35d4f 100644
--- a/src/components/dashboard/roadPatrols/supervisor/RowActions/MachinePerformanceForm/index.jsx
+++ b/src/components/dashboard/roadPatrols/supervisor/RowActions/MachinePerformanceForm/index.jsx
@@ -3,34 +3,15 @@ import DirectionsCarIcon from "@mui/icons-material/DirectionsCar";
import MachinePerformanceContent from "./MachinePerformanceContent";
import { useState } from "react";
-const MachinePerformanceForm = () => {
+const MachinePerformanceForm = ({ row }) => {
const [openMachinesCodeDialog, setOpenMachinesCodeDialog] = useState(false);
const machineData = {
- cmms_machine_code: 245,
+ cmms_machine_code: row.original?.cmms_machines[0]?.machine_code,
resultCode: 0,
- mileage: 17645,
- accOnDuration: 3599,
- fuelConsumption: 6.1757503,
- stopPoints: [
- {
- startDT: "2024-12-23T13:55:40",
- duration: 114,
- latitude: 37.521317,
- longitude: 46.103584,
- },
- {
- startDT: "2024-12-23T14:31:11",
- duration: 14,
- latitude: 37.566532,
- longitude: 46.17688,
- },
- {
- startDT: "2024-12-23T14:35:36",
- duration: 55,
- latitude: 37.569958,
- longitude: 46.18166,
- },
- ],
+ mileage: row.original?.distance,
+ accOnDuration: row.original?.vehicle_runtime,
+ fuelConsumption: row.original?.fuel_consumption,
+ stopPoints: row.original?.stop_points,
};
return (
<>
diff --git a/src/components/dashboard/roadPatrols/supervisor/RowActions/ReportForm/index.jsx b/src/components/dashboard/roadPatrols/supervisor/RowActions/ReportForm/index.jsx
index 0319aaf..c33aa7b 100644
--- a/src/components/dashboard/roadPatrols/supervisor/RowActions/ReportForm/index.jsx
+++ b/src/components/dashboard/roadPatrols/supervisor/RowActions/ReportForm/index.jsx
@@ -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 { IconButton, Tooltip } from "@mui/material";
const ReportForm = ({ rowId }) => {
- const reportUrl = `https://rms.rmto.ir/v2/road_patrols/operator/report/${rowId}`;
return (
{
},
},
},
- Cell: () => (
+ Cell: ({ row }) => (
-
+
),
},
diff --git a/src/core/components/CarCode.jsx b/src/core/components/CarCode.jsx
index 60d7cda..ec23995 100644
--- a/src/core/components/CarCode.jsx
+++ b/src/core/components/CarCode.jsx
@@ -10,36 +10,37 @@ const CarCode = ({ carCode, setCarCode, inputValueDefault = "", error, multiple
const [loading, setLoading] = useState(false);
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(() => {
+ 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();
fetchCarCodes(inputValue, controller);
return () => controller.abort();
}, [inputValue]);
+
return (
{
- setInputValue(newInputValue || ""); // Prevent inputValue from being null or undefined
+ setInputValue(newInputValue || "");
}}
options={options}
getOptionLabel={(option) => {
diff --git a/src/core/components/DataTable/Main.js b/src/core/components/DataTable/Main.js
index cd07da5..eb11e54 100644
--- a/src/core/components/DataTable/Main.js
+++ b/src/core/components/DataTable/Main.js
@@ -61,7 +61,8 @@ const DataTable_Main = (props) => {
}
params.set("sorting", JSON.stringify(sortData));
return `${table_url}?${params}`;
- }, [table_url, filterData, pagination, columns, sortData, specialFilter]);
+ }, [table_url, filterData, pagination, sortData, specialFilter]);
+
const fetcher = async (url) => {
try {
const response = await request(url);
diff --git a/src/core/components/DataTable/filter/FilterBody.jsx b/src/core/components/DataTable/filter/FilterBody.jsx
index 32d3e3f..ab12820 100644
--- a/src/core/components/DataTable/filter/FilterBody.jsx
+++ b/src/core/components/DataTable/filter/FilterBody.jsx
@@ -84,16 +84,12 @@ function FilterBody({ columns, drawerState, setDrawerState }) {
};
return (
- setDrawerState(false)}
- sx={{ overflowY: "hidden", display: "flex", flexDirection: "column", height: "100%", zIndex: "1300" }}
- >
+ <>
{Object.keys(filterData).length > 0 && (
)}
-
+ >
);
}
diff --git a/src/core/components/DataTable/filter/FilterHeader.jsx b/src/core/components/DataTable/filter/FilterHeader.jsx
index 50d00d8..c7b01b5 100644
--- a/src/core/components/DataTable/filter/FilterHeader.jsx
+++ b/src/core/components/DataTable/filter/FilterHeader.jsx
@@ -1,8 +1,8 @@
"use client";
-import { Box, IconButton, Typography } from "@mui/material";
import CancelIcon from "@mui/icons-material/Cancel";
import FilterAltIcon from "@mui/icons-material/FilterAlt";
+import { Box, IconButton, Typography } from "@mui/material";
function FilterHeader({ setDrawerState }) {
return (
diff --git a/src/core/components/DataTable/filter/fieldsType/CustomDate/MuiDatePicker.jsx b/src/core/components/DataTable/filter/fieldsType/CustomDate/MuiDatePicker.jsx
index 0e91257..d2d9df0 100644
--- a/src/core/components/DataTable/filter/fieldsType/CustomDate/MuiDatePicker.jsx
+++ b/src/core/components/DataTable/filter/fieldsType/CustomDate/MuiDatePicker.jsx
@@ -30,6 +30,7 @@ function MuiDatePicker({ label, value, setFieldValue, name, minDate, maxDate, he
maxDate={maxDate ? new Date(maxDate) : null}
slotProps={{
textField: {
+ size: "small",
error: error,
placeholder: placeholder,
InputProps: {
@@ -60,9 +61,9 @@ function MuiDatePicker({ label, value, setFieldValue, name, minDate, maxDate, he
},
}}
/>
-
+ {/*
{helperText ? helperText : ""}
-
+ */}
);
diff --git a/src/core/components/DataTable/filter/fieldsType/CustomSelect.jsx b/src/core/components/DataTable/filter/fieldsType/CustomSelect.jsx
index 274a58b..f008c5e 100644
--- a/src/core/components/DataTable/filter/fieldsType/CustomSelect.jsx
+++ b/src/core/components/DataTable/filter/fieldsType/CustomSelect.jsx
@@ -1,46 +1,28 @@
"use client";
-import { FormControl, FormHelperText, InputLabel, MenuItem, OutlinedInput, Select, Typography } from "@mui/material";
-import { useEffect, useMemo } from "react";
-
-function CustomSelect({ column, dependencyFieldValue, filterParameters, defaultFilterTranslation, handleChange }) {
- const columnSelectOption = useMemo(() => {
- return column?.columnSelectOption?.(dependencyFieldValue) || [];
- }, [dependencyFieldValue]);
-
- useEffect(() => {
- const isValidValue = columnSelectOption.some((option) => option.value === filterParameters.value);
- if (!isValidValue) {
- handleChange({ ...filterParameters, value: "" });
- }
- }, [columnSelectOption, filterParameters.value, handleChange]);
-
- const isValidValue = columnSelectOption.some((option) => option.value === filterParameters.value);
- const selectedValue = isValidValue ? filterParameters.value : "";
-
+import { FormControl, InputLabel, MenuItem, OutlinedInput, Select } from "@mui/material";
+function CustomSelect({ column, filterParameters, handleChange }) {
return (
-
- {column.header}
+
+
+ {column.header}
+
}
+ size="small"
onChange={(e) => handleChange({ ...filterParameters, value: e.target.value })}
+ displayEmpty
>
-
- {columnSelectOption.map((option) => (
+ {column.columnSelectOption().map((option) => (
))}
-
-
- نوع فیلتر: {defaultFilterTranslation}
-
-
);
}
diff --git a/src/core/components/DataTable/filter/fieldsType/CustomSelectByDependency.jsx b/src/core/components/DataTable/filter/fieldsType/CustomSelectByDependency.jsx
index 5d809e3..5a1f2d3 100644
--- a/src/core/components/DataTable/filter/fieldsType/CustomSelectByDependency.jsx
+++ b/src/core/components/DataTable/filter/fieldsType/CustomSelectByDependency.jsx
@@ -12,15 +12,19 @@ function CustomSelectByDependency({
columnSelectOption,
}) {
return (
-
- {column.header}
+
+
+ {column.header}
+
}
onChange={(e) => handleChange({ ...filterParameters, value: e.target.value })}
+ displayEmpty
>
{columnSelectOption.map((option) => (
))}
-
-
+ {/*
+
نوع فیلتر: {defaultFilterTranslation}
-
+ */}
);
}
diff --git a/src/core/components/DataTable/filter/fieldsType/CustomSelectMultiple.jsx b/src/core/components/DataTable/filter/fieldsType/CustomSelectMultiple.jsx
index 22ff8aa..8ee2695 100644
--- a/src/core/components/DataTable/filter/fieldsType/CustomSelectMultiple.jsx
+++ b/src/core/components/DataTable/filter/fieldsType/CustomSelectMultiple.jsx
@@ -21,7 +21,7 @@ function CustomSelectMultiple({ column, filterParameters, defaultFilterTranslati
};
return (
-
+
{column.header}
@@ -30,6 +30,7 @@ function CustomSelectMultiple({ column, filterParameters, defaultFilterTranslati
id={column.id}
value={filterParameters.value}
multiple
+ size="small"
onChange={(e) => handleChange({ ...filterParameters, value: e.target.value })}
renderValue={(selected) => (
@@ -39,6 +40,7 @@ function CustomSelectMultiple({ column, filterParameters, defaultFilterTranslati
)}
input={}
+ InputLabelProps={{ shrink: true }}
>
{columnSelectOption.map((option) => (
))}
-
-
+ {/*
+
نوع فیلتر: {defaultFilterTranslation}
-
+ */}
);
}
diff --git a/src/core/components/DataTable/filter/fieldsType/CustomTextField.jsx b/src/core/components/DataTable/filter/fieldsType/CustomTextField.jsx
index 619237a..c69105d 100644
--- a/src/core/components/DataTable/filter/fieldsType/CustomTextField.jsx
+++ b/src/core/components/DataTable/filter/fieldsType/CustomTextField.jsx
@@ -18,14 +18,14 @@ function CustomTextField({
onChange={(e) => handleChange({ ...filterParameters, value: e.target.value })}
onBlur={handleBlur}
fullWidth
- helperText={
-
- نوع فیلتر: {defaultFilterTranslation}
-
- }
+ // helperText={
+ //
+ // نوع فیلتر: {defaultFilterTranslation}
+ //
+ // }
variant="outlined"
- size="normal"
- sx={{ marginY: 1 }}
+ size="small"
+ sx={{ my: 1 }}
InputProps={{
endAdornment: (
@@ -33,6 +33,7 @@ function CustomTextField({
),
}}
+ InputLabelProps={{ shrink: true }}
/>
);
}
diff --git a/src/core/components/DataTable/filter/fieldsType/CustomTextFieldRange.jsx b/src/core/components/DataTable/filter/fieldsType/CustomTextFieldRange.jsx
index 20afcbd..57a2dc3 100644
--- a/src/core/components/DataTable/filter/fieldsType/CustomTextFieldRange.jsx
+++ b/src/core/components/DataTable/filter/fieldsType/CustomTextFieldRange.jsx
@@ -24,13 +24,13 @@ function CustomTextFieldRange({
fullWidth
error={touched?.[`${column.id}`]?.value && Boolean(errors?.[`${column.id}`]?.value)}
helperText={
-
+
نوع فیلتر: {defaultFilterTranslation}
}
variant="outlined"
- size="normal"
- sx={{ marginY: 1, marginRight: 1 }}
+ size="small"
+ sx={{ my: 1, marginRight: 1 }}
/>
diff --git a/src/core/components/DataTable/filter/index.jsx b/src/core/components/DataTable/filter/index.jsx
index 8399857..b922bc4 100644
--- a/src/core/components/DataTable/filter/index.jsx
+++ b/src/core/components/DataTable/filter/index.jsx
@@ -2,6 +2,7 @@
import { useState } from "react";
import FilterButton from "@/core/components/DataTable/filter/FilterButton";
import FilterBody from "@/core/components/DataTable/filter/FilterBody";
+import { Drawer } from "@mui/material";
function FilterColumn({ columns, user_id, page_name, table_name }) {
const [open, setOpen] = useState(false);
@@ -9,7 +10,11 @@ function FilterColumn({ columns, user_id, page_name, table_name }) {
return (
<>
- {open && (
+ setOpen(false)}
+ sx={{ overflowY: "hidden", display: "flex", flexDirection: "column", height: "100%", zIndex: "1300" }}
+ >
- )}
+
>
);
}
diff --git a/src/core/components/MapInfoOneMarker.jsx b/src/core/components/MapInfoOneMarker.jsx
index a0817bf..b42ced9 100644
--- a/src/core/components/MapInfoOneMarker.jsx
+++ b/src/core/components/MapInfoOneMarker.jsx
@@ -122,8 +122,8 @@ const MapInteraction = ({ setValue, startLat, startLng }) => {
zIndex: 1000,
}}
>
-
- ویرایش
+
+ تغییر مکان
)}
diff --git a/src/core/components/MapInfoTwoMarker.jsx b/src/core/components/MapInfoTwoMarker.jsx
index 2ddae72..44745b1 100644
--- a/src/core/components/MapInfoTwoMarker.jsx
+++ b/src/core/components/MapInfoTwoMarker.jsx
@@ -73,7 +73,7 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => {
{ lat: startLat, lng: startLng },
{ lat: endLat, lng: endLng },
],
- { paddingTopLeft: [16, 16], paddingBottomRight: [16, 130] }
+ { paddingTopLeft: [64, 64], paddingBottomRight: [64, 64] }
);
}
}, [startLat, map, endLng]);
@@ -142,7 +142,7 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => {
zIndex: 1000,
}}
>
-
+
ویرایش نقطه شروع
@@ -184,8 +184,8 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => {
setIsEndLocked(true);
setEndIconColor("#D13131");
map.fitBounds([startPosition, map.getCenter()], {
- paddingTopLeft: [16, 16],
- paddingBottomRight: [16, 16],
+ paddingTopLeft: [64, 64],
+ paddingBottomRight: [64, 64],
});
}
},
@@ -202,7 +202,7 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => {
zIndex: 1000,
}}
>
-
+
ویرایش نقاط
diff --git a/src/core/components/Profile/ChangePass/index.jsx b/src/core/components/Profile/ChangePass/index.jsx
index 4b388da..0a507db 100644
--- a/src/core/components/Profile/ChangePass/index.jsx
+++ b/src/core/components/Profile/ChangePass/index.jsx
@@ -22,7 +22,7 @@ const ChangePass = ({ open, setOpen }) => {
@@ -38,7 +38,7 @@ const ChangePass = ({ open, setOpen }) => {
loadingPosition="end"
endIcon={}
>
- ثبت
+ تغییر
diff --git a/src/core/components/Profile/Update/index.jsx b/src/core/components/Profile/Update/index.jsx
index d72b5a0..4cec971 100644
--- a/src/core/components/Profile/Update/index.jsx
+++ b/src/core/components/Profile/Update/index.jsx
@@ -22,7 +22,7 @@ const Update = ({ open, setOpen }) => {
-
+
بستن
{
loadingPosition="end"
endIcon={}
>
- ثبت
+ ویرایش
diff --git a/src/core/components/RahdarCode.jsx b/src/core/components/RahdarCode.jsx
index c1f6c48..7ebf1d2 100644
--- a/src/core/components/RahdarCode.jsx
+++ b/src/core/components/RahdarCode.jsx
@@ -11,34 +11,34 @@ const RahdarCode = ({ rahdarsCode, setRahdarsCode, error, multiple = true }) =>
const [loading, setLoading] = useState(false);
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(() => {
+ 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();
fetchRahdarCodes(inputValue, controller);
return () => controller.abort();
diff --git a/src/core/components/ShowPlak.jsx b/src/core/components/ShowPlak.jsx
index 04548f1..5d51455 100644
--- a/src/core/components/ShowPlak.jsx
+++ b/src/core/components/ShowPlak.jsx
@@ -16,13 +16,14 @@ const ShowPlak = ({ plak_number }) => {
const plakParts = processPlak(plak_number);
return (
-
+
{plakParts.region} {plakParts.mainNumber}
diff --git a/src/core/utils/formatSecondsToHHMMSS.js b/src/core/utils/formatSecondsToHHMMSS.js
new file mode 100644
index 0000000..e7f630c
--- /dev/null
+++ b/src/core/utils/formatSecondsToHHMMSS.js
@@ -0,0 +1,10 @@
+import moment from "jalali-moment";
+
+export const formatSecondsToHHMMSS = (seconds) => {
+ const duration = moment.duration(seconds, "seconds");
+ const hours = Math.floor(duration.asHours());
+ const minutes = duration.minutes();
+ const secs = duration.seconds();
+
+ return `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}:${String(secs).padStart(2, "0")}`;
+};
diff --git a/src/core/utils/headerMenu.js b/src/core/utils/headerMenu.js
index 32438bb..a3ac3c9 100644
--- a/src/core/utils/headerMenu.js
+++ b/src/core/utils/headerMenu.js
@@ -1,3 +1,5 @@
+const api = process.env.NEXT_PUBLIC_API_URL;
+
export const headerMenu = [
{
title: "تصادفات",
@@ -5,7 +7,7 @@ export const headerMenu = [
[
{
title: "تصادفات روزانه",
- href: "https://rms.witel.ir/v2/daily_accidents/create",
+ href: api + "/v2/daily_accidents/create",
},
],
],
@@ -16,11 +18,11 @@ export const headerMenu = [
[
{
title: "گزارش محوری",
- href: "https://rms.witel.ir/v2/axis_reports",
+ href: api + "/v2/axis_reports",
},
{
title: "هوش تجاری (BI)",
- href: "https://rms.witel.ir/v2/axis_reports",
+ href: api + "/v2/axis_reports",
},
],
],
@@ -31,17 +33,17 @@ export const headerMenu = [
[
{
title: "پراکندگی بر روی نقشه راهدارخانه ها",
- href: "https://rms.witel.ir/v2/map?type=rahdar",
+ href: api + "/v2/map?type=rahdar",
},
{
title: "راهدارخانه ها",
- href: "https://rms.witel.ir/v2/rahdari_points",
+ href: api + "/v2/rahdari_points",
},
],
[
{
title: "ممیزی ماشین آلات راهداری کشور",
- href: "https://rms.witel.ir/cmms-audit",
+ href: api + "/cmms-audit",
},
],
],
@@ -52,7 +54,7 @@ export const headerMenu = [
[
{
title: "تحقیق و توسعه",
- href: "https://rms.witel.ir/RandD",
+ href: api + "/RandD",
},
{
title: "سامانه مدیریت یکپارچه زیرساخت های راه (PMS,BMS,SMS)",
diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js
index d93692d..f312523 100644
--- a/src/core/utils/pageMenu.js
+++ b/src/core/utils/pageMenu.js
@@ -165,7 +165,7 @@ export const pageMenu = [
},
{
id: "roadItemManagmentReportItems",
- label: "تعداد و حجم فعالیت ها به تفکیک موارد مشاهده شده",
+ label: "تعداد و حجم فعالیت ها به تفکیک موارد اقدام شده",
type: "page",
route: "/dashboard/road-items/reports/sub-items-report",
permissions: [
diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js
index b13b921..a217a6e 100644
--- a/src/core/utils/routes.js
+++ b/src/core/utils/routes.js
@@ -30,10 +30,12 @@ export const UPDATE_AZMAYESH_TYPE = api + "/api/v3/azmayesh_types/update";
//road patrol
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 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 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 GET_FMS_DATA = api + "/api/v3/fms_vehicle/get_activity";
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 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 GET_ROAD_ITEMS_ITEM = "https://rms.witel.ir/v2/items";
-export const GET_ROAD_ITEMS_SUB_ITEM = "https://rms.witel.ir/v2/sub_items";
-export const GET_EDARAT_LISTS = "https://rms.witel.ir/public/contents/edarate_shahri_by_province";
+export const GET_ROAD_ITEMS_ITEM = api + "/v2/items";
+export const GET_ROAD_ITEMS_SUB_ITEM = api + "/v2/sub_items";
+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 UPDATE_ROAD_ITEMS = api + "/api/v3/road_items/update";
export const VERIFY_BY_SUPERVISOR = api + "/api/v3/road_items/verify_by_supervisor";