From 2639ef3e1b1c7d3f7db65da129906dedd6f32a6f Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Sat, 15 Feb 2025 11:30:26 +0000 Subject: [PATCH] add observed item in road potrol --- .../Create/Forms/CreateFormContent.jsx | 1 - .../Forms/CreatePatrol/ActionInfo.jsx | 8 +- .../Forms/CreatePatrol/ActionsDurigPatrol.jsx | 54 +++-- .../Forms/CreatePatrol/CompeleteRequest.jsx | 41 ++-- .../CreateFormContentObservedItem.jsx | 203 ++++++++++++++++++ .../CreatePatrol/GetObservedItemInfo.jsx | 55 +++++ .../CreatePatrol/ModalActionsDuringPatrol.jsx | 2 +- .../CreatePatrol/ModalObservedItemPatrol.jsx | 16 ++ .../Forms/CreatePatrol/ObservedInfo.jsx | 37 ++++ .../PreviousStatesInfoInObservedItem.jsx | 43 ++++ 10 files changed, 431 insertions(+), 29 deletions(-) create mode 100644 src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/CreateFormContentObservedItem.jsx create mode 100644 src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/GetObservedItemInfo.jsx create mode 100644 src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ModalObservedItemPatrol.jsx create mode 100644 src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ObservedInfo.jsx create mode 100644 src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PreviousStatesInfoInObservedItem.jsx 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 cfe6c09..62bc6a8 100644 --- a/src/components/dashboard/roadItems/operator/Actions/Create/Forms/CreateFormContent.jsx +++ b/src/components/dashboard/roadItems/operator/Actions/Create/Forms/CreateFormContent.jsx @@ -249,7 +249,6 @@ const CreateFormContent = ({ setOpen, onSubmit, is_gasht = false }) => { diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionInfo.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionInfo.jsx index ae935b3..8ad27a7 100644 --- a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionInfo.jsx +++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionInfo.jsx @@ -2,7 +2,7 @@ import DeleteIcon from "@mui/icons-material/Delete"; import HandymanIcon from "@mui/icons-material/Handyman"; -import { Box, Card, CardActions, CardHeader, IconButton, Typography } from "@mui/material"; +import { Box, Card, CardActions, CardHeader, Chip, IconButton, Typography } from "@mui/material"; import EditActionDuringPatrol from "./EditActionDuringPatrol"; const ActionInfo = ({ action, setActionsList, index, deleteAction }) => { @@ -17,7 +17,11 @@ const ActionInfo = ({ action, setActionsList, index, deleteAction }) => { > } - title={{action.data.item_name}} + title={ + + {action.data.item_name} + + } subheader={action.data.sub_item_name} /> diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionsDurigPatrol.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionsDurigPatrol.jsx index 304391a..570c78f 100644 --- a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionsDurigPatrol.jsx +++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ActionsDurigPatrol.jsx @@ -6,12 +6,20 @@ import { Box, Button, Chip, DialogActions, DialogContent, Divider, Grid, Stack, import { useState } from "react"; import ActionInfo from "./ActionInfo"; import ModalActionsDuringPatrol from "./ModalActionsDuringPatrol"; +import ModalObservedItemPatrol from "./ModalObservedItemPatrol"; +import ObservedInfo from "./ObservedInfo"; const ActionsDuringPatrol = ({ allData, setAllData, handlePrev, setTabState }) => { const [actionsList, setActionsList] = useState(allData.observed_items); - const [open, setOpen] = useState(false); - const handleOpen = () => { - setOpen(true); + const [openAction, setOpenAction] = useState(false); + const [openObserved, setOpenObseved] = useState(false); + const handleOpenAction = () => { + setOpenAction(true); + }; + + + const handleOpenObserved = () => { + setOpenObseved(true); }; const deleteAction = (indexToRemove) => { @@ -28,17 +36,30 @@ const ActionsDuringPatrol = ({ allData, setAllData, handlePrev, setTabState }) = - - + + + @@ -56,12 +77,21 @@ const ActionsDuringPatrol = ({ allData, setAllData, handlePrev, setTabState }) = > {actionsList.map((action, index) => ( - deleteAction(index)} - /> + {action.instant_action == 1 ? ( + deleteAction(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 40f59da..0fa5919 100644 --- a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/CompeleteRequest.jsx +++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/CompeleteRequest.jsx @@ -109,19 +109,34 @@ const CompeleteRequest = ({ allData, handlePrev, mutate, setOpen }) => { 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, i) => - formData.append(`observed_items[${index}][road_item_rahdaran_id][]`, rahdar.id) - ); + if (observed_item.instant_action == 1) { + formData.append(`observed_items[${index}][instant_action]`, observed_item.instant_action); + formData.append(`observed_items[${index}][local_name]`, ""); + formData.append(`observed_items[${index}][start_point]`, observed_item.result.start_point); + if (observed_item.result.end_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, i) => + formData.append(`observed_items[${index}][road_item_rahdaran_id][]`, rahdar.id) + ); + } else { + formData.append(`observed_items[${index}][instant_action]`, observed_item.instant_action); + formData.append(`observed_items[${index}][local_name]`, observed_item.result.local_name); + formData.append(`observed_items[${index}][priority]`, observed_item.result.priority); + formData.append(`observed_items[${index}][start_point]`, observed_item.result.start_point); + if (observed_item.result.end_point) + formData.append(`observed_items[${index}][end_point]`, observed_item.result.end_point); + 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("start_time", allData.start_time); formData.append("end_time", allData.end_time); diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/CreateFormContentObservedItem.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/CreateFormContentObservedItem.jsx new file mode 100644 index 0000000..63b0ec9 --- /dev/null +++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/CreateFormContentObservedItem.jsx @@ -0,0 +1,203 @@ +import GetItemsForm from "@/components/dashboard/roadItems/operator/Actions/Create/Forms/GetItemsForm"; +import GetSubItemsForm from "@/components/dashboard/roadItems/operator/Actions/Create/Forms/GetSubItemsForm"; +import StyledForm from "@/core/components/StyledForm"; +import { useTheme } from "@emotion/react"; +import { yupResolver } from "@hookform/resolvers/yup"; +import BeenhereIcon from "@mui/icons-material/Beenhere"; +import ExitToAppIcon from "@mui/icons-material/ExitToApp"; +import FileCopyIcon from "@mui/icons-material/FileCopy"; +import InfoIcon from "@mui/icons-material/Info"; +import InsertDriveFileIcon from "@mui/icons-material/InsertDriveFile"; +import KeyboardDoubleArrowRightIcon from "@mui/icons-material/KeyboardDoubleArrowRight"; +import { Box, Button, DialogActions, DialogContent, Tab, Tabs, useMediaQuery } from "@mui/material"; +import { useState } from "react"; +import { useForm } from "react-hook-form"; +import { mixed, number, object, string } from "yup"; +import GetObservedItemInfo from "./GetObservedItemInfo"; + +function TabPanel(props) { + const { children, value, index } = props; + return ( + + ); +} + +const validationSchema = object({ + item_id: number().required("نوع آیتم را مشخص کنید!"), + sub_item_id: number().required("اقدام انجام شده را مشخص کنید!"), + local_name: string().required("نام محلی را مشخص کنید!"), + priority: string().required("اولویت را مشخص کنید!"), + start_point: mixed() + .test("start-point-required", "لطفاً نقطه شروع را مشخص کنید!", function (value) { + return !!value; // چک می‌کند که مقدار موجود است + }) + .required("لطفاً نقطه شروع را مشخص کنید!"), + end_point: mixed().test("end-point-required", "لطفاً نقطه پایان را مشخص کنید!", function (value) { + const { subItemsList } = this.options.context; + const needsEndPoint = subItemsList?.needs_end_point === 1; + if (needsEndPoint) { + return !!value; // چک می‌کند که مقدار موجود است + } + return true; + }), +}); + +const CreateFormContentObservedItem = ({ setOpen, onSubmit }) => { + const defaultValues = { + item_id: null, + sub_item_id: null, + local_name: "", + priority: "1", + start_point: "", + end_point: "", + }; + + 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); + }; + + const handleChangeTab = (event, newValue) => { + setTabState(newValue); + }; + + const handlePrev = () => { + if (tabState === 2) { + const fieldsToReset = ["local_name", "priority", "start_point", "end_point"]; + fieldsToReset.forEach((field) => resetField(field)); + } + if (tabState === 0) { + handleClose(); + } else { + setTabState(tabState - 1); + } + }; + const { + control, + watch, + getValues, + register, + handleSubmit, + setValue, + resetField, + formState: { errors, isSubmitting }, + } = useForm({ + defaultValues, + resolver: yupResolver(validationSchema), + mode: "onBlur", + context: { subItemsList }, + }); + const onSubmitBase = async (data) => { + let result = { ...data }; + + if (result.end_point === "") { + delete result.end_point; + delete data.end_point; + } else { + result.end_point = `${result.end_point.lat},${result.end_point.lng}`; + } + + if (result.start_point === "") { + delete result.start_point; + delete data.start_point; + } else { + result.start_point = `${result.start_point.lat},${result.start_point.lng}`; + } + + await onSubmit({ + result, + data: { + ...data, + item_name: itemsList.name, + sub_item_name: subItemsList.name, + unit_fa: subItemsList.unit, + }, + }); + }; + + return ( + + + } label="انتخاب آیتم" /> + } label="انتخاب اقدام مشاهده شده" /> + } label="اطلاعات فعالیت" /> + + + + + + + + + + + + + + + + + {tabState === 2 && ( + + )} + + + ); +}; +export default CreateFormContentObservedItem; diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/GetObservedItemInfo.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/GetObservedItemInfo.jsx new file mode 100644 index 0000000..63a1953 --- /dev/null +++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/GetObservedItemInfo.jsx @@ -0,0 +1,55 @@ +import MapInfoOneMarker from "@/core/components/MapInfoOneMarker"; +import MapInfoTwoMarker from "@/core/components/MapInfoTwoMarker"; +import { FormControl, InputLabel, MenuItem, OutlinedInput, Select, Stack, TextField } from "@mui/material"; +import PreviousStatesInfoInObservedItem from "./PreviousStatesInfoInObservedItem"; + +const GetObservedItemInfo = ({ register, itemsList, subItemsList, control, setValue, errors, watch, getValues }) => { + return ( + + + + + + + + + + + اولویت + + + + + + {subItemsList?.needs_end_point === 1 ? ( + + ) : ( + + )} + + + ); +}; +export default GetObservedItemInfo; diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ModalActionsDuringPatrol.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ModalActionsDuringPatrol.jsx index 073fd9e..97be471 100644 --- a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ModalActionsDuringPatrol.jsx +++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ModalActionsDuringPatrol.jsx @@ -3,7 +3,7 @@ import { Dialog } from "@mui/material"; const ModalActionsDuringPatrol = ({ open, setOpen, setActionsList }) => { const HandleSubmit = async (data) => { - setActionsList((prev) => [...prev, data]); + setActionsList((prev) => [...prev, { ...data, instant_action: 1 }]); setOpen(false); }; diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ModalObservedItemPatrol.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ModalObservedItemPatrol.jsx new file mode 100644 index 0000000..9a6c0fc --- /dev/null +++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ModalObservedItemPatrol.jsx @@ -0,0 +1,16 @@ +import { Dialog } from "@mui/material"; +import CreateFormContentObservedItem from "./CreateFormContentObservedItem"; + +const ModalObservedItemPatrol = ({ open, setOpen, setActionsList }) => { + const HandleSubmit = async (data) => { + setActionsList((prev) => [...prev, { ...data, instant_action: 0 }]); + setOpen(false); + }; + + return ( + + + + ); +}; +export default ModalObservedItemPatrol; diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ObservedInfo.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ObservedInfo.jsx new file mode 100644 index 0000000..16b9953 --- /dev/null +++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/ObservedInfo.jsx @@ -0,0 +1,37 @@ +"use client"; + +import DeleteIcon from "@mui/icons-material/Delete"; +import VisibilityIcon from "@mui/icons-material/Visibility"; +import { Box, Card, CardActions, CardHeader, Chip, IconButton, Typography } from "@mui/material"; + +const ObservedInfo = ({ action, deleteAction }) => { + return ( + + } + title={ + + {action.data.item_name} + + } + subheader={action.data.sub_item_name} + /> + + + + + + + + + ); +}; + +export default ObservedInfo; diff --git a/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PreviousStatesInfoInObservedItem.jsx b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PreviousStatesInfoInObservedItem.jsx new file mode 100644 index 0000000..7476631 --- /dev/null +++ b/src/components/dashboard/roadPatrols/operator/Forms/CreatePatrol/PreviousStatesInfoInObservedItem.jsx @@ -0,0 +1,43 @@ +import { Box, Chip, Divider, Grid, Typography } from "@mui/material"; +import InsertDriveFileIcon from "@mui/icons-material/InsertDriveFile"; +import FileCopyIcon from "@mui/icons-material/FileCopy"; + +const PreviousStatesInfoInObservedItem = ({ itemsList, subItemsList }) => { + return ( + + + + } + label={ + + آیتم انتخاب ‌شده + + } + /> + + + + {itemsList.name || "هیچ آیتمی انتخاب نشده است"} + + + + + } + label={ + + اقدام مشاهده شده + + } + /> + + + + {subItemsList?.name || "هیچ اقدامی انتخاب نشده است"} + + + + ); +}; +export default PreviousStatesInfoInObservedItem;