diff --git a/src/app/(withAuth)/dashboard/azmayesh/page.js b/src/app/(withAuth)/dashboard/azmayesh/page.js index d27371a..164a4b6 100644 --- a/src/app/(withAuth)/dashboard/azmayesh/page.js +++ b/src/app/(withAuth)/dashboard/azmayesh/page.js @@ -1,10 +1,12 @@ import AzmayeshPage from "@/components/dashboard/azmayesh"; import WithPermission from "@/core/middlewares/withPermission"; +import ActivityCodeLog from "@/core/components/ActivityCodeLog"; const Page = () => { return ( + ); }; diff --git a/src/app/(withAuth)/dashboard/azmayesh_type/page.js b/src/app/(withAuth)/dashboard/azmayesh_type/page.js index 4032594..77a604a 100644 --- a/src/app/(withAuth)/dashboard/azmayesh_type/page.js +++ b/src/app/(withAuth)/dashboard/azmayesh_type/page.js @@ -1,10 +1,12 @@ import AzmayeshTypePage from "@/components/dashboard/azmayeshType"; import WithPermission from "@/core/middlewares/withPermission"; +import ActivityCodeLog from "@/core/components/ActivityCodeLog"; const Page = () => { return ( + ); }; diff --git a/src/app/(withAuth)/dashboard/road-items/operator/page.js b/src/app/(withAuth)/dashboard/road-items/operator/page.js index 9c3d8ca..324c997 100644 --- a/src/app/(withAuth)/dashboard/road-items/operator/page.js +++ b/src/app/(withAuth)/dashboard/road-items/operator/page.js @@ -1,9 +1,11 @@ import WithPermission from "@/core/middlewares/withPermission"; import OperatorPage from "@/components/dashboard/roadItems/operator"; +import ActivityCodeLog from "@/core/components/ActivityCodeLog"; const Page = () => { return ( + ); }; diff --git a/src/app/(withAuth)/dashboard/road-items/supervisor/page.js b/src/app/(withAuth)/dashboard/road-items/supervisor/page.js index 58c47d8..2de82eb 100644 --- a/src/app/(withAuth)/dashboard/road-items/supervisor/page.js +++ b/src/app/(withAuth)/dashboard/road-items/supervisor/page.js @@ -1,11 +1,13 @@ import WithPermission from "@/core/middlewares/withPermission"; import SupervisorPage from "@/components/dashboard/roadItems/supervisor"; +import ActivityCodeLog from "@/core/components/ActivityCodeLog"; const Page = () => { return ( + ); }; diff --git a/src/app/(withAuth)/dashboard/road-patrols/operator/page.js b/src/app/(withAuth)/dashboard/road-patrols/operator/page.js index 73fa9cf..44725da 100644 --- a/src/app/(withAuth)/dashboard/road-patrols/operator/page.js +++ b/src/app/(withAuth)/dashboard/road-patrols/operator/page.js @@ -1,10 +1,12 @@ import WithPermission from "@/core/middlewares/withPermission"; import OperatorPage from "@/components/dashboard/roadPatrols/operator"; +import ActivityCodeLog from "@/core/components/ActivityCodeLog"; const Page = () => { return ( + ); }; diff --git a/src/app/(withAuth)/dashboard/road-patrols/supervisor/page.js b/src/app/(withAuth)/dashboard/road-patrols/supervisor/page.js index 1afb8c4..4093c15 100644 --- a/src/app/(withAuth)/dashboard/road-patrols/supervisor/page.js +++ b/src/app/(withAuth)/dashboard/road-patrols/supervisor/page.js @@ -1,9 +1,11 @@ import WithPermission from "@/core/middlewares/withPermission"; import SupervisorPage from "@/components/dashboard/roadPatrols/supervisor"; +import ActivityCodeLog from "@/core/components/ActivityCodeLog"; const Page = () => { return ( + ); }; 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 de60a7e..17fd595 100644 --- a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/CreateFormContent.jsx +++ b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/CreateFormContent.jsx @@ -27,11 +27,11 @@ function TabPanel(props) { } const defaultValues = { - itemId: null, - itemSubId: null, + item_id: null, + sub_item_id: null, amount: "", - action_date: "", - start_date: "", + activity_time: "", + activity_date: "", before_image: null, after_image: null, cmms_machines: null, @@ -40,13 +40,13 @@ const defaultValues = { end_point: "", }; const validationSchema = object({ - itemId: string().required("نوع آیتم را مشخص کنید!"), - itemSubId: string().required("موضوع مشاهده شده را مشخص کنید!"), + item_id: string().required("نوع آیتم را مشخص کنید!"), + sub_item_id: string().required("موضوع مشاهده شده را مشخص کنید!"), amount: string().required("وارد کردن مقدار الزامیست!"), cmms_machines: array().required("وارد کردن کد خودرو الزامیست!"), rahdaran_id: array().required("وارد کردن کد راهداران الزامیست!").min(1, "حداقل یک کد راهدار باید وارد شود!"), // بررسی حداقل یک آیتم, - action_date: string().required("لطفا زمان فعالیت را انتخاب کنید!"), - start_date: string().required("لطفاً تاریخ شروع فعالیت را انتخاب کنید!"), + activity_time: string().required("لطفا زمان فعالیت را انتخاب کنید!"), + activity_date: string().required("لطفاً تاریخ شروع فعالیت را انتخاب کنید!"), before_image: mixed() .nullable() .test("before-image-required", "لطفا عکس قبل از اقدام را بارگذاری کنید!", function (value) { @@ -82,12 +82,13 @@ const validationSchema = object({ }), }); -const CreateFormContent = ({ setOpen, mutate, onSubmit }) => { +const CreateFormContent = ({ setOpen, onSubmit }) => { const [tabState, setTabState] = useState(0); const [itemsList, setItemsList] = useState(); const [subItemsList, setSubItemsList] = useState([]); const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const handleClose = () => { setOpen(false); }; @@ -100,8 +101,8 @@ const CreateFormContent = ({ setOpen, mutate, onSubmit }) => { if (tabState === 2) { const fieldsToReset = [ "amount", - "action_date", - "start_date", + "activity_time", + "activity_date", "before_image", "after_image", "cmms_machines", @@ -133,8 +134,44 @@ const CreateFormContent = ({ setOpen, mutate, onSubmit }) => { context: { subItemsList }, }); + const onSubmitBase = (data) => { + let result = { ...data }; + + result.before_image === null && delete result.before_image; + result.after_image === null && delete result.after_image; + if (result.end_point === "") { + delete result.end_point; + } else { + result.end_point = `${result.end_point.lat},${result.end_point.lng}`; + } + if (result.start_point === "") { + delete result.start_point; + } else { + 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; + + result.cmms_machines.forEach((cmms_machine, index) => { + result[`machines_id[${index}]`] = cmms_machine.id; + }); + delete result.cmms_machines; + + onSubmit({ + result, + data: { + ...data, + item_name: itemsList.name, + sub_item_name: subItemsList.name, + }, + }); + }; + return ( - + diff --git a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/GetItemsForm.jsx b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/GetItemsForm.jsx index 0396b71..e7daaa8 100644 --- a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/GetItemsForm.jsx +++ b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/GetItemsForm.jsx @@ -28,8 +28,8 @@ const GetItemsForm = ({ setValue, setItemsList, tabState, setTabState }) => { }, }} onClick={() => { - setValue("itemId", item.id); - setItemsList(item.name); + setValue("item_id", item.id); + setItemsList(item); setTabState(tabState + 1); }} > 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 8b36594..2a60079 100644 --- a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/GetSubItemsForm.jsx +++ b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/GetSubItemsForm.jsx @@ -3,7 +3,7 @@ import { Card, CardActionArea, Grid, LinearProgress, Typography } from "@mui/mat import useRoadItemGetSubItems from "@/lib/hooks/useRoadItemGetISubtems"; const GetSubItemsForm = ({ setValue, watch, setSubItemsList, tabState, setTabState }) => { - const { subItemsList, loadingSubItemsList, errorSubItemsList } = useRoadItemGetSubItems(watch("itemId")); + const { subItemsList, loadingSubItemsList, errorSubItemsList } = useRoadItemGetSubItems(watch("item_id")); return ( <> @@ -27,7 +27,7 @@ const GetSubItemsForm = ({ setValue, watch, setSubItemsList, tabState, setTabSta }, }} onClick={() => { - setValue("itemSubId", item.sub_item); + setValue("sub_item_id", item.sub_item); setSubItemsList(item); setTabState(tabState + 1); }} 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 6f3cc86..9e7b7db 100644 --- a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/PreviousStatesInfo.jsx +++ b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/PreviousStatesInfo.jsx @@ -18,7 +18,7 @@ const PreviousStatesInfo = ({ itemsList, subItemsList }) => { - {itemsList || "هیچ آیتمی انتخاب نشده است"} + {itemsList.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 d47352a..3e78906 100644 --- a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/index.jsx +++ b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/index.jsx @@ -6,22 +6,11 @@ import useRequest from "@/lib/hooks/useRequest"; const OperatorCreateForm = ({ open, setOpen, mutate, rowId }) => { const requestServer = useRequest({ notificationSuccess: true }); - const HandleSubmit = async (data) => { - let endPoint; - let startPoint = `${data.start_point.lat},${data.start_point.lng}`; - data.end_point !== "" && (endPoint = `${data.end_point.lat},${data.end_point.lng}`); + const HandleSubmit = async ({ result }) => { const formData = new FormData(); - data.rahdaran_id.map((rahdar, index) => formData.append(`rahdaran_id[${index}]`, rahdar.id)); - formData.append("item_id", data.itemId); - formData.append("sub_item_id", data.itemSubId); - formData.append("amount", data.amount); - formData.append("activity_time", data.action_date); - formData.append("activity_date", data.start_date); - data.cmms_machines.map((machine, index) => formData.append(`machines_id[${index}]`, machine.id)); - data.before_image !== null && formData.append("before_image", data.before_image); - data.after_image !== null && formData.append("after_image", data.after_image); - data.start_point !== "" && formData.append("start_point", startPoint); - data.end_point !== "" && formData.append("end_point", endPoint); + for (const [key, value] of Object.entries(result)) { + formData.append(key, value); + } await requestServer(CREATE_ROAD_ITEMS, "post", { data: formData, }) diff --git a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreate.jsx b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreate.jsx new file mode 100644 index 0000000..1a3b3bc --- /dev/null +++ b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreate.jsx @@ -0,0 +1,17 @@ +import { Button, Dialog, DialogActions, DialogTitle } from "@mui/material"; +import GashtCreateContent from "./GashtCreateContent"; + +const GashtCreate = ({ open, setOpen, mutate, rowId }) => { + return ( + + جستجوی مورد مشاهده شده در گشت راهداری و ترابری + + + + + + ); +}; +export default GashtCreate; diff --git a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreateContent.jsx b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreateContent.jsx new file mode 100644 index 0000000..d2ff576 --- /dev/null +++ b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreateContent.jsx @@ -0,0 +1,116 @@ +import { Box, Button, DialogActions, DialogContent, Grid, Stack, Tab, Tabs } from "@mui/material"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import * as yup from "yup"; +import MuiDatePicker from "@/core/components/MuiDatePicker"; +import InsertDriveFileIcon from "@mui/icons-material/InsertDriveFile"; +import FileCopyIcon from "@mui/icons-material/FileCopy"; +import InfoIcon from "@mui/icons-material/Info"; +import GetItemsForm from "@/components/dashboard/roadItems/operator/Actions/Create/Forms/GetItemsForm"; +import GetSubItemsForm from "@/components/dashboard/roadItems/operator/Actions/Create/Forms/GetSubItemsForm"; +import GetItemInfo from "@/components/dashboard/roadItems/operator/Actions/Create/Forms/GetItemInfo"; +import ExitToAppIcon from "@mui/icons-material/ExitToApp"; +import KeyboardDoubleArrowRightIcon from "@mui/icons-material/KeyboardDoubleArrowRight"; +import BeenhereIcon from "@mui/icons-material/Beenhere"; +import StyledForm from "@/core/components/StyledForm"; +import React from "react"; +import { TabPanel } from "@mui/lab"; + +const GashtCreateContent = ({ mutate, setOpen }) => { + const defaultValues = { + start_date: null, + end_date: null, + item_id: null, + road_patrol_id: null, + }; + + const validationSchema = yup + .object() + .shape({ + start_date: yup.string().nullable(), + end_date: yup.string().nullable(), + item_id: yup.string().nullable(), + road_patrol_id: yup.string().nullable(), + }) + .test("at-least-one", "وارد کردن مقدار ضروریست!!!", (values) => { + return (!!values.start_date && !!values.end_date) || !!values.item_id || !!values.road_patrol_id; + }); + + const { + control, + getValues, + watch, + register, + handleSubmit, + setValue, + formState: { errors, isSubmitting }, + } = useForm({ + defaultValues, + resolver: yupResolver(validationSchema), + mode: "onBlur", + }); + return ( + + + } label="انتخاب آیتم" /> + } label="انتخاب موضوع مشاهده شده" /> + + + + + + + + + + + + + + {tabState === 2 && ( + + )} + + + ); +}; +export default GashtCreateContent; diff --git a/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/index.jsx b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/index.jsx new file mode 100644 index 0000000..ae14476 --- /dev/null +++ b/src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/index.jsx @@ -0,0 +1,38 @@ +"use client"; +import { Button, IconButton, useMediaQuery } from "@mui/material"; +import { useTheme } from "@emotion/react"; +import { useState } from "react"; +import AddRoadIcon from "@mui/icons-material/AddRoad"; +import GashtCreate from "./GashtCreate"; + +const ObservedGashtCreate = ({ mutate }) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const [open, setOpen] = useState(false); + + const handleOpen = () => { + setOpen(true); + }; + + return ( + <> + {isMobile ? ( + + + + ) : ( + + )} + {open && } + + ); +}; +export default ObservedGashtCreate; diff --git a/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditController.jsx b/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditController.jsx index 423bb00..169170b 100644 --- a/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditController.jsx +++ b/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditController.jsx @@ -1,29 +1,40 @@ -import { LinearProgress, Typography } from "@mui/material"; +import { Dialog, DialogTitle } from "@mui/material"; import EditFormContent from "./EditFormContent"; -import useRoadItemGetISubtems from "@/lib/hooks/useRoadItemGetISubtems"; +import { UPDATE_ROAD_ITEMS } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; -const EditController = ({ rowId, mutate, setOpenEditDialog, row }) => { - const { subItemsList, loadingSubItemsList, errorSubItemsList } = useRoadItemGetISubtems(row.original?.item); - const subItem = subItemsList.find((SubItem) => SubItem.sub_item === row.original?.sub_item); +const EditController = ({ rowId, mutate, setOpenEditDialog, openEditDialog, row }) => { + const requestServer = useRequest({ notificationSuccess: true }); + + const HandleSubmit = async ({ result }) => { + const formData = new FormData(); + for (const [key, value] of Object.entries(result)) { + formData.append(key, value); + } + await requestServer(`${UPDATE_ROAD_ITEMS}/${rowId}`, "post", { + data: formData, + }) + .then((response) => { + mutate(); + setOpenEditDialog(false); + }) + .catch((error) => {}); + }; return ( - <> - {errorSubItemsList ? ( - - خطا در دریافت اطلاعات!!! - - ) : loadingSubItemsList ? ( - - ) : ( - - )} - + + ویرایش اطلاعات + + ); }; export default EditController; diff --git a/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormContent.jsx b/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormContent.jsx index 92f7432..7bd5a49 100644 --- a/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormContent.jsx +++ b/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormContent.jsx @@ -1,215 +1,72 @@ -import { Button, DialogActions, DialogContent, Stack, TextField } from "@mui/material"; -import useRequest from "@/lib/hooks/useRequest"; -import { Controller, useForm } from "react-hook-form"; -import { yupResolver } from "@hookform/resolvers/yup"; -import { array, mixed, object, string } from "yup"; -import StyledForm from "@/core/components/StyledForm"; +import { LinearProgress, Typography } from "@mui/material"; import React from "react"; -import ImageUpload from "@/components/dashboard/roadItems/operator/Actions/Create/Forms/ImageUpload"; -import MapInfoTwoMarker from "@/core/components/MapInfoTwoMarker"; -import MapInfoOneMarker from "@/core/components/MapInfoOneMarker"; -import { UPDATE_ROAD_ITEMS } from "@/core/utils/routes"; -import CarCode from "@/core/components/CarCode"; -import RahdarCode from "@/core/components/RahdarCode"; import useRoadItemGetISubtems from "@/lib/hooks/useRoadItemGetISubtems"; -import NumberField from "@/core/components/NumberField"; +import EditFormCreate from "@/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormCreate"; -const validationSchema = object({ - amount: string().required("وارد کردن مقدار الزامیست!"), - cmms_machines: array().required("وارد کردن کد خودرو الزامیست!"), - rahdaran_id: array().required("وارد کردن کد راهداران الزامیست!").min(1, "حداقل یک کد راهدار باید وارد شود!"), - before_image: mixed() - .nullable() - .test("before-image-required", "لطفا عکس قبل از اقدام را بارگذاری کنید!", function (value) { - const { subItem } = this.options.context; - const needsImage = subItem?.needs_image === 1; - if (needsImage) { - return !!value; - } - return true; - }), - after_image: mixed() - .nullable() - .test("after-image-required", "لطفا عکس بعد از اقدام را بارگذاری کنید!", function (value) { - const { subItem } = this.options.context; - const needsImage = subItem?.needs_image === 1; - if (needsImage) { - return !!value; - } - return true; - }), - start_point: mixed() - .test("start-point-required", "لطفاً نقطه شروع را مشخص کنید!", function (value) { - return !!value; // چک می‌کند که مقدار موجود است - }) - .required("لطفاً نقطه شروع را مشخص کنید!"), - end_point: mixed().test("end-point-required", "لطفاً نقطه پایان را مشخص کنید!", function (value) { - const { subItem } = this.options.context; - const needsEndPoint = subItem?.needs_end_point === 1; - if (needsEndPoint) { - return !!value; // چک می‌کند که مقدار موجود است - } - return true; - }), -}); +const EditFormContent = ({ setOpenEditDialog, onSubmit, defaultData }) => { + const { subItemsList, loadingSubItemsList, errorSubItemsList } = useRoadItemGetISubtems(defaultData?.item); + const subItem = subItemsList.find((SubItem) => SubItem.sub_item === defaultData?.sub_item); -const EditFormContent = ({ row, mutate, setOpenEditDialog, rowId, subItem }) => { const defaultValues = { - before_image: row.original?.files[0]?.full_path_for_fast_react || null, - after_image: row.original?.files[1]?.full_path_for_fast_react || null, - amount: row.original.sub_item_data || null, - start_point: { lat: row.original.start_lat || "", lng: row.original.start_lng || "" }, - end_point: { lat: row.original.end_lat || "", lng: row.original.end_lng || "" }, - cmms_machines: row.original.cmms_machines || null, - rahdaran_id: row.original.rahdaran || null, + before_image: defaultData?.files[0]?.full_path_for_fast_react || null, + after_image: defaultData?.files[1]?.full_path_for_fast_react || null, + amount: defaultData?.sub_item_data || null, + start_point: { lat: defaultData?.start_lat || "", lng: defaultData?.start_lng || "" }, + end_point: { lat: defaultData?.end_lat || "", lng: defaultData?.end_lng || "" }, + cmms_machines: defaultData?.cmms_machines || null, + rahdaran_id: defaultData?.rahdaran || null, }; - const requestServer = useRequest(); - const { - control, - getValues, - watch, - register, - handleSubmit, - setValue, - formState: { errors, isSubmitting }, - } = useForm({ - defaultValues, - resolver: yupResolver(validationSchema), - mode: "onBlur", - context: { subItem }, - }); + const onSubmitBase = (data) => { + let result = { ...data }; + (result.before_image === null || result.before_image === defaultValues.before_image) && + delete result.before_image; + (result.after_image === null || result.after_image === defaultValues.after_image) && delete result.after_image; + if (subItem.needs_end_point !== 1) { + delete result.end_point; + } else { + result.end_point = `${result.end_point.lat},${result.end_point.lng}`; + } - const onSubmit = async (data) => { - let endPoint; - let startPoint = `${data.start_point.lat},${data.start_point.lng}`; - subItem.needs_end_point === 1 && (endPoint = `${data.end_point.lat},${data.end_point.lng}`); - const formData = new FormData(); - subItem.needs_image === 1 && - data.before_image !== defaultValues.before_image && - formData.append("before_image", data.before_image); - subItem.needs_image === 1 && - data.after_image !== defaultValues.after_image && - formData.append("after_image", data.after_image); - formData.append("amount", data.amount); - data.cmms_machines.map((machine, index) => formData.append(`machines_id[${index}]`, machine.id)); - data.rahdaran_id.map((rahdar, index) => formData.append(`rahdaran_id[${index}]`, rahdar.id)); - formData.append("start_point", startPoint); - subItem.needs_end_point === 1 && formData.append("end_point", endPoint); + result.start_point = `${result.start_point.lat},${result.start_point.lng}`; - await requestServer(`${UPDATE_ROAD_ITEMS}/${rowId}`, "post", { - notificationSuccess: true, - data: formData, - }) - .then((res) => { - mutate(); - setOpenEditDialog(false); - }) - .catch((err) => {}); + 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; + + onSubmit({ + result, + data: { + ...data, + item_name: subItem.item_str, + sub_item_name: subItemsList.name, + }, + }); }; return ( <> - - - - - {subItem.needs_image === 1 ? ( - - ) : null} - - - { - if (!isNaN(event.target.value)) { - setValue("amount", event.target.value); - } else { - setValue("amount", watch("amount")); - } - }} - helperText={errors.amount ? errors.amount.message : null} - variant="outlined" - fullWidth - /> - - - { - return ( - field.onChange(value || [])} - inputValueDefault={row.original.cmms_machines} - multiple={true} - error={error} // اگر خطا وجود داشته باشد - /> - ); - }} - name={"cmms_machines"} - /> - - - { - return ( - field.onChange(value || [])} - error={error} - /> - ); - }} - name={"rahdaran_id"} - /> - - - {subItem.needs_end_point === 1 ? ( - - ) : ( - - )} - - - - - - - - + {errorSubItemsList ? ( + + خطا در دریافت اطلاعات!!! + + ) : loadingSubItemsList ? ( + + ) : ( + + )} ); }; diff --git a/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormCreate.jsx b/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormCreate.jsx new file mode 100644 index 0000000..fef124f --- /dev/null +++ b/src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormCreate.jsx @@ -0,0 +1,171 @@ +import { Button, DialogActions, DialogContent, Stack } from "@mui/material"; +import ImageUpload from "@/components/dashboard/roadItems/operator/Actions/Create/Forms/ImageUpload"; +import NumberField from "@/core/components/NumberField"; +import { Controller, useForm } from "react-hook-form"; +import CarCode from "@/core/components/CarCode"; +import RahdarCode from "@/core/components/RahdarCode"; +import MapInfoTwoMarker from "@/core/components/MapInfoTwoMarker"; +import MapInfoOneMarker from "@/core/components/MapInfoOneMarker"; +import StyledForm from "@/core/components/StyledForm"; +import React from "react"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { array, mixed, object, string } from "yup"; + +const validationSchema = object({ + amount: string().required("وارد کردن مقدار الزامیست!"), + cmms_machines: array().required("وارد کردن کد خودرو الزامیست!"), + rahdaran_id: array().required("وارد کردن کد راهداران الزامیست!").min(1, "حداقل یک کد راهدار باید وارد شود!"), + before_image: mixed() + .nullable() + .test("before-image-required", "لطفا عکس قبل از اقدام را بارگذاری کنید!", function (value) { + const { subItem } = this.options.context; + const needsImage = subItem?.needs_image === 1; + if (needsImage) { + return !!value; + } + return true; + }), + after_image: mixed() + .nullable() + .test("after-image-required", "لطفا عکس بعد از اقدام را بارگذاری کنید!", function (value) { + const { subItem } = this.options.context; + const needsImage = subItem?.needs_image === 1; + if (needsImage) { + return !!value; + } + return true; + }), + start_point: mixed() + .test("start-point-required", "لطفاً نقطه شروع را مشخص کنید!", function (value) { + return !!value; // چک می‌کند که مقدار موجود است + }) + .required("لطفاً نقطه شروع را مشخص کنید!"), + end_point: mixed().test("end-point-required", "لطفاً نقطه پایان را مشخص کنید!", function (value) { + const { subItem } = this.options.context; + const needsEndPoint = subItem?.needs_end_point === 1; + if (needsEndPoint) { + return !!value; + } + return true; + }), +}); + +const EditFormCreate = ({ defaultData, subItem, onSubmitBase, defaultValues, setOpenEditDialog }) => { + const { + control, + getValues, + watch, + register, + handleSubmit, + setValue, + formState: { errors, isSubmitting }, + } = useForm({ + defaultValues, + resolver: yupResolver(validationSchema), + mode: "onBlur", + context: { subItem }, + }); + return ( + + + + + {subItem.needs_image === 1 ? ( + + ) : null} + + + { + if (!isNaN(event.target.value)) { + setValue("amount", event.target.value); + } else { + setValue("amount", watch("amount")); + } + }} + helperText={errors.amount ? errors.amount.message : null} + variant="outlined" + 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"} + /> + + + {subItem.needs_end_point === 1 ? ( + + ) : ( + + )} + + + + + + + + + ); +}; +export default EditFormCreate; diff --git a/src/components/dashboard/roadItems/operator/RowActions/EditForm/index.jsx b/src/components/dashboard/roadItems/operator/RowActions/EditForm/index.jsx index 888e166..9302918 100644 --- a/src/components/dashboard/roadItems/operator/RowActions/EditForm/index.jsx +++ b/src/components/dashboard/roadItems/operator/RowActions/EditForm/index.jsx @@ -19,19 +19,13 @@ const EditForm = ({ row, mutate, rowId }) => { - - ویرایش اطلاعات - - + ); }; diff --git a/src/components/dashboard/roadItems/operator/Toolbar.jsx b/src/components/dashboard/roadItems/operator/Toolbar.jsx index c98ae05..ae6691f 100644 --- a/src/components/dashboard/roadItems/operator/Toolbar.jsx +++ b/src/components/dashboard/roadItems/operator/Toolbar.jsx @@ -1,12 +1,14 @@ import PrintExcel from "./ExcelPrint"; import OperatorCreate from "./Actions/Create"; import { Stack } from "@mui/material"; +import ObservedGashtCreate from "./Actions/ObservedGashtCreate"; const Toolbar = ({ table, filterData, mutate }) => { return ( + {/**/} ); }; diff --git a/src/core/components/ActivityCodeLog.jsx b/src/core/components/ActivityCodeLog.jsx new file mode 100644 index 0000000..ef53b42 --- /dev/null +++ b/src/core/components/ActivityCodeLog.jsx @@ -0,0 +1,30 @@ +"use client"; +import useRequest from "@/lib/hooks/useRequest"; +import { useEffect } from "react"; +import { ACTIVITY_LOG } from "@/core/utils/routes"; + +const ActivityCodeLog = ({ activity_code }) => { + const requestServer = useRequest({ notificationShow: false }); + + useEffect(() => { + if (!activity_code) return; + + const fetchSubItems = async () => { + try { + await requestServer(ACTIVITY_LOG, "post", { + data: { + activityCode: activity_code, + }, + }); + } catch (error) { + console.error(error); // Always helpful to log the error for debugging. + } + }; + + fetchSubItems(); + }, [activity_code, requestServer]); + + return null; // Ensure the component still renders something. +}; + +export default ActivityCodeLog; diff --git a/src/core/components/CarCode.jsx b/src/core/components/CarCode.jsx index e765d24..8914acb 100644 --- a/src/core/components/CarCode.jsx +++ b/src/core/components/CarCode.jsx @@ -21,7 +21,10 @@ const CarCode = ({ carCode, setCarCode, inputValueDefault = "", error, multiple requestOptions: { signal: controller.signal }, }) .then((response) => { - setOptions(response.data.data || []); + const combinedArray = [...carCode, ...response.data.data]; + + const uniqueArray = Array.from(new Map(combinedArray.map((item) => [item.id, item])).values()); + setOptions(uniqueArray || []); }) .catch(() => { setOptions([]); @@ -38,7 +41,6 @@ const CarCode = ({ carCode, setCarCode, inputValueDefault = "", error, multiple fetchCarCodes(inputValue, controller); return () => controller.abort(); }, [inputValue]); - return ( requestOptions: { signal: controller.signal }, }) .then((response) => { - setOptions(response.data.data || []); + const combinedArray = [...rahdarsCode, ...response.data.data]; + const uniqueArray = Array.from(new Map(combinedArray.map((item) => [item.id, item])).values()); + setOptions(uniqueArray || []); }) .catch(() => { setOptions([]); diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index 44434f8..6c26cd2 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -51,3 +51,6 @@ export const DELETE_BY_SUPERVISOR = api + "/api/v3/road_items/delete"; export const RESTORE_BY_SUPERVISOR = api + "/api/v3/road_items/restore"; export const GET_CAR_LIST_SEARCH = api + "/api/v3/cmms_machines/search"; export const GET_RAHDARANS_LIST_SEARCH = api + "/api/v3/rahdaran/search"; + +// activity code log +export const ACTIVITY_LOG = api + "/api/v3/profile/add_activity";