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); - }} - > - - - - setOpenCarDialog(false)} - fullWidth - open={openCarDialog} - PaperProps={{ - sx: { - transition: "all .3s", - boxShadow: - "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px", - }, - }} - maxWidth={"lg"} - > - نمایش اطلاعات خودرو - - - - - ); -}; -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 ( - + {open && } ); }; 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 ( - + {open && ( + + )} ); }; 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} - - Image - - - + {title} + + + Image + + ); }; 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"} > - کد خودرو + خودرو ها 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 }) => { خیر ! 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} - - Image - - - + {title} + + + Image + + ); }; 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" > - تصاویر - - + تصاویر + + + + + + - 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"} > - کد خودرو + خودرو ها 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 ( - - - لیست اقدامات حین گشت - - - - - {ActionsList.length !== 0 ? ( - - {ActionsList.map((action, index) => ( - - deleteAction(index)} - /> - - ))} - - ) : ( - - - فعالیتی ثبت نکرده اید - - - )} - - - + + + + + + + {actionsList.length !== 0 ? ( + + {actionsList.map((action, index) => ( + + deleteAction(index)} + /> + + ))} + + ) : ( + + + فعالیتی ثبت نکرده اید + + + )} - - + + + + + + ); }; 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, - }} - /> - - - - - - - کد پیامک شده - setVerificationCode(e.target.value)} - onInput={handleNumericInput} - type="text" - inputProps={{ - maxLength: 6, - inputMode: "numeric", - style: { - textAlign: "center", - letterSpacing: "10px", - }, - }} - /> - + + + + شماره تلفن مامور گشت + + + + + + + + + + کد تایید پیامک شده + + + + + - + - - - + + + + + + ); }; 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"} + /> + + + + + + + + + {patrolResultStatus !== 0 && } + + + + + - - - - - {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 && ( + + + + )} - - - - - - + ); }; 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) => ( - - - - ))} - + <> + + - - + + + + { + return ( + field.onChange(value)} + error={error} + multiple={false} + /> + ); + }} + name={"road_patrol_rahdaran_id"} + /> + + + + + + + + {SuperVisorList.length === 0 && ( + + + ابتدا اطلاعات بالا را تکمیل نمایید + + + )} + + + {SuperVisorList.length !== 0 && + SuperVisorList.map((superVisor) => ( + + + + ))} + + - - ) : ( - - - ابتدا اطلاعات بالا را تکمیل نمایید - - )} - + + + + + + ); }; 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 ( - - + + {open && } ); }; diff --git a/src/components/dashboard/roadPatrols/operator/OperatorList.jsx b/src/components/dashboard/roadPatrols/operator/OperatorList.jsx index e96d08d..f9e144d 100644 --- a/src/components/dashboard/roadPatrols/operator/OperatorList.jsx +++ b/src/components/dashboard/roadPatrols/operator/OperatorList.jsx @@ -43,10 +43,10 @@ const OperatorList = () => { }, }, }, - Cell: ({ renderedCellValue }) => { + Cell: ({ renderedCellValue, row }) => { return ( - + ); }, diff --git a/src/components/dashboard/roadPatrols/operator/RowActions/MachinePerformanceForm/StopsInfo.jsx b/src/components/dashboard/roadPatrols/operator/RowActions/MachinePerformanceForm/StopsInfo.jsx index 4483996..fa6679a 100644 --- a/src/components/dashboard/roadPatrols/operator/RowActions/MachinePerformanceForm/StopsInfo.jsx +++ b/src/components/dashboard/roadPatrols/operator/RowActions/MachinePerformanceForm/StopsInfo.jsx @@ -3,6 +3,7 @@ import AccessAlarmsIcon from "@mui/icons-material/AccessAlarms"; import PinDropIcon from "@mui/icons-material/PinDrop"; import LocalGasStationIcon from "@mui/icons-material/LocalGasStation"; import DirectionsCarIcon from "@mui/icons-material/DirectionsCar"; +import { formatSecondsToHHMMSS } from "@/core/utils/formatSecondsToHHMMSS"; const StopsInfo = ({ selectedPoint, staticData }) => { return ( @@ -13,7 +14,7 @@ const StopsInfo = ({ selectedPoint, staticData }) => { icon={} label={ - کد ماشین + کد خودرو } /> @@ -29,14 +30,14 @@ const StopsInfo = ({ selectedPoint, staticData }) => { icon={} label={ - مصرف سوخت + میزان سوخت مصرفی } /> - {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 && (
- + {columns.map((column) => column.enableColumnFilter ? ( column.dependencyId ? ( @@ -144,7 +140,7 @@ function FilterBody({ columns, drawerState, setDrawerState }) {
)} -
+ ); } 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} + - - - نوع فیلتر: {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} + - - + {/* + نوع فیلتر: {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) => ( @@ -46,11 +48,11 @@ function CustomSelectMultiple({ column, filterParameters, defaultFilterTranslati ))} - - + {/* + نوع فیلتر: {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";