From 97e6c509f0670f030592735136ef60c3ab405654 Mon Sep 17 00:00:00 2001 From: Amin Ghasempoor Date: Mon, 30 Dec 2024 10:03:53 +0000 Subject: [PATCH 1/2] Feature/gasht cartables --- .../roadPatrols/operator/OperatorList.jsx | 27 ++++++++- .../operator/RowActions/ReportForm/index.jsx | 3 +- .../roadPatrols/operator/RowActions/index.jsx | 7 +-- .../RowActions/DeleteForm/DeleteContent.jsx | 60 +++++++++++++------ .../RowActions/OfficerDescription/index.jsx | 32 +--------- .../RowActions/ReportForm/index.jsx | 3 +- .../supervisor/RowActions/index.jsx | 4 -- .../roadPatrols/supervisor/SupervisorList.jsx | 54 ++++++++++++++++- src/core/components/MapInfoOneMarker.jsx | 28 ++++----- src/core/components/MapInfoTwoMarker.jsx | 35 +++++------ src/core/utils/routes.js | 5 +- 11 files changed, 157 insertions(+), 101 deletions(-) diff --git a/src/components/dashboard/roadPatrols/operator/OperatorList.jsx b/src/components/dashboard/roadPatrols/operator/OperatorList.jsx index a68bdcc..589ba5d 100644 --- a/src/components/dashboard/roadPatrols/operator/OperatorList.jsx +++ b/src/components/dashboard/roadPatrols/operator/OperatorList.jsx @@ -1,11 +1,12 @@ "use client"; import { useMemo } from "react"; -import { Box, Typography } from "@mui/material"; +import { Box, Stack, Typography } from "@mui/material"; import DataTableWithAuth from "@/core/components/DataTableWithAuth"; import Toolbar from "./Toolbar"; import { GET_ROAD_PATROL_OPERATOR_LIST } from "@/core/utils/routes"; import moment from "jalali-moment"; import RowActions from "./RowActions"; +import ReportForm from "./RowActions/ReportForm"; const OperatorList = () => { const columns = useMemo( @@ -81,6 +82,29 @@ const OperatorList = () => { grow: false, size: 100, }, + { + header: "گزارش مامور", + enableColumnFilter: false, + datatype: "text", + grow: false, + size: 100, + muiTableBodyCellProps: { + sx: { + borderLeft: "1px solid #e1e1e1", + py: 0, + "&:first-of-type": { + borderLeft: "unset", + }, + }, + }, + Cell: ({ renderedCellValue, row }) => { + return ( + + + + ); + }, + }, ], [] ); @@ -89,7 +113,6 @@ const OperatorList = () => { <> { - const reportUrl = "https://rms.rmto.ir/v2/road_patrols/operator/report/96872"; // TODO replace id here - + const reportUrl = `https://rms.rmto.ir/v2/road_patrols/operator/report/${rowId}`; return ( { - return ( - - - - ); + return ; }; export default RowActions; diff --git a/src/components/dashboard/roadPatrols/supervisor/RowActions/DeleteForm/DeleteContent.jsx b/src/components/dashboard/roadPatrols/supervisor/RowActions/DeleteForm/DeleteContent.jsx index 52d266c..bb9303d 100644 --- a/src/components/dashboard/roadPatrols/supervisor/RowActions/DeleteForm/DeleteContent.jsx +++ b/src/components/dashboard/roadPatrols/supervisor/RowActions/DeleteForm/DeleteContent.jsx @@ -1,9 +1,45 @@ import { Button, DialogActions, DialogContent, Stack, Typography, List, ListItem } from "@mui/material"; import useRequest from "@/lib/hooks/useRequest"; -import React from "react"; +import React, { useState } from "react"; +import { DELETE_ROAD_PATROL_SUPERVISOR } from "@/core/utils/routes"; const DeleteContent = ({ rowId, mutate, setOpenDeleteDialog }) => { - const requestServer = useRequest(); + const requestServer = useRequest({ notificationSuccess: true }); + const [submittingPartial, setSubmittingPartial] = useState(false); + const [submittingGeneral, setSubmittingGeneral] = useState(false); + const handleGeneralDelete = () => { + setSubmittingGeneral(true); + requestServer(`${DELETE_ROAD_PATROL_SUPERVISOR}/${rowId}`, "post", { + data: { + type: 2, + }, + }) + .then(() => { + mutate(); + setOpenDeleteDialog(false); + setSubmittingGeneral(false); + }) + .catch(() => { + setSubmittingGeneral(false); + }); + }; + + const handlePartialDelete = () => { + setSubmittingPartial(true); + requestServer(`${DELETE_ROAD_PATROL_SUPERVISOR}/${rowId}`, "post", { + data: { + type: 1, + }, + }) + .then(() => { + mutate(); + setOpenDeleteDialog(false); + setSubmittingPartial(false); + }) + .catch(() => { + setSubmittingPartial(false); + }); + }; return ( <> @@ -42,23 +78,11 @@ const DeleteContent = ({ rowId, mutate, setOpenDeleteDialog }) => { - - diff --git a/src/components/dashboard/roadPatrols/supervisor/RowActions/OfficerDescription/index.jsx b/src/components/dashboard/roadPatrols/supervisor/RowActions/OfficerDescription/index.jsx index 8b3675b..04b5946 100644 --- a/src/components/dashboard/roadPatrols/supervisor/RowActions/OfficerDescription/index.jsx +++ b/src/components/dashboard/roadPatrols/supervisor/RowActions/OfficerDescription/index.jsx @@ -1,26 +1,10 @@ import { Dialog, DialogContent, DialogTitle, IconButton, Tooltip, Typography, Card, CardContent } from "@mui/material"; import { useState } from "react"; -import useRequest from "@/lib/hooks/useRequest"; import RemoveRedEyeIcon from "@mui/icons-material/RemoveRedEye"; import CloseIcon from "@mui/icons-material/Close"; -const OfficerDescriptionForm = ({ row }) => { +const OfficerDescriptionForm = ({ description }) => { const [openOfficerDescriptionDialog, setOpenOfficerDescriptionDialog] = useState(false); - const requestServer = useRequest(); - - const handleSubmit = () => { - // requestServer(`${RESERVE_PASSENGER_BOSS}/${rowId}`, "post", { description }) - // .then((response) => { - // setOpenOfficerDescriptionDialog(false); - // mutate(); - // }) - // .catch((error) => { - // console.error(error); - // }) - // .finally(() => { - // setIsSubmitting(false); - // }); - }; return ( <> @@ -55,18 +39,7 @@ const OfficerDescriptionForm = ({ row }) => { - - توضیحات : - - - {row.original.description || "هیچ توضیحی موجود نیست"}{" "} - {/* should replace row.original.description with the back end*/} - + {description || "هیچ توضیحی موجود نیست"} @@ -74,5 +47,4 @@ const OfficerDescriptionForm = ({ row }) => { ); }; - export default OfficerDescriptionForm; diff --git a/src/components/dashboard/roadPatrols/supervisor/RowActions/ReportForm/index.jsx b/src/components/dashboard/roadPatrols/supervisor/RowActions/ReportForm/index.jsx index 8abb152..0319aaf 100644 --- a/src/components/dashboard/roadPatrols/supervisor/RowActions/ReportForm/index.jsx +++ b/src/components/dashboard/roadPatrols/supervisor/RowActions/ReportForm/index.jsx @@ -2,8 +2,7 @@ import { Tooltip, IconButton } from "@mui/material"; import PrintIcon from "@mui/icons-material/Print"; const ReportForm = ({ rowId }) => { - const reportUrl = "https://rms.rmto.ir/v2/road_patrols/operator/report/96872"; // TODO replace id here - + const reportUrl = `https://rms.rmto.ir/v2/road_patrols/operator/report/${rowId}`; return ( { return ( - - ); diff --git a/src/components/dashboard/roadPatrols/supervisor/SupervisorList.jsx b/src/components/dashboard/roadPatrols/supervisor/SupervisorList.jsx index 5d71669..d653f21 100644 --- a/src/components/dashboard/roadPatrols/supervisor/SupervisorList.jsx +++ b/src/components/dashboard/roadPatrols/supervisor/SupervisorList.jsx @@ -1,15 +1,16 @@ "use client"; import { useMemo } from "react"; -import { Box, Typography } from "@mui/material"; +import { Box, Stack } from "@mui/material"; import DataTableWithAuth from "@/core/components/DataTableWithAuth"; import Toolbar from "./Toolbar"; import { GET_ROAD_PATROL_SUPERVISOR_LIST } from "@/core/utils/routes"; import moment from "jalali-moment"; import RowActions from "./RowActions"; import useProvinces from "@/lib/hooks/useProvince"; -import useRoadItemGetItems from "@/lib/hooks/useRoadItemGetItems"; import CustomSelectByDependency from "@/core/components/DataTable/filter/fieldsType/CustomSelectByDependency"; import useEdaratLists from "@/lib/hooks/useEdaratLists"; +import OfficerDescriptionForm from "./RowActions/OfficerDescription"; +import ReportForm from "./RowActions/ReportForm"; const OperatorList = () => { const columns = useMemo( @@ -151,6 +152,54 @@ const OperatorList = () => { grow: false, size: 100, }, + { + accessorKey: "description", + header: "توضیحات مامور", + id: "description", + enableColumnFilter: false, + datatype: "text", + grow: false, + size: 100, + muiTableBodyCellProps: { + sx: { + borderLeft: "1px solid #e1e1e1", + py: 0, + "&:first-of-type": { + borderLeft: "unset", + }, + }, + }, + Cell: ({ renderedCellValue }) => { + return ( + + + + ); + }, + }, + { + header: "گزارش مامور", + enableColumnFilter: false, + datatype: "text", + grow: false, + size: 100, + muiTableBodyCellProps: { + sx: { + borderLeft: "1px solid #e1e1e1", + py: 0, + "&:first-of-type": { + borderLeft: "unset", + }, + }, + }, + Cell: ({ renderedCellValue, row }) => { + return ( + + + + ); + }, + }, ], [] ); @@ -159,7 +208,6 @@ const OperatorList = () => { <> import("@/core/components/MapLayer"), { ssr: false, }); -const createCustomIcon = (size, iconUrl, labelText) => { +const createCustomIcon = (size, iconUrl, labelText, color) => { if (labelText) { return L.divIcon({ + className: "custom-marker", // Apply your custom CSS class html: ` -
- icon -
- ${labelText} +
+
+ ${labelText}
-
- `, - iconSize: size, - iconAnchor: [size[0] / 2, size[1]], - popupAnchor: [0, -size[1]], +
+
`, + iconSize: [100, 50], // Adjust icon size to fit your content + iconAnchor: [50, 25], // Adjust to position the marker correctly }); } @@ -45,6 +40,7 @@ const MAX_ZOOM_FOR_MARKER = 13; const MapInteraction = ({ setValue, startLat, startLng }) => { const [isMarkerLocked, setIsMarkerLocked] = useState(!!(startLat && startLng)); // وضعیت قفل مارکر const [enableSend, setEnableSend] = useState(false); + const [startIconColor, setStartIconColor] = useState(startLat ? "#1CAC66" : "#003d4f"); // رنگ آیکن شروع const [markerPosition, setMarkerPosition] = useState( startLat && startLng ? { lat: startLat, lng: startLng } : null ); @@ -79,6 +75,7 @@ const MapInteraction = ({ setValue, startLat, startLng }) => { setValue("start_point", { lat: center.lat.toString(), lng: center.lng.toString() }); setMarkerPosition({ lat: center.lat, lng: center.lng }); // به‌روزرسانی موقعیت مارکر setIsMarkerLocked(true); + setStartIconColor("#1CAC66"); } }; @@ -86,6 +83,7 @@ const MapInteraction = ({ setValue, startLat, startLng }) => { setValue("start_point", null); // حذف مقدار قبلی setIsMarkerLocked(false); // باز کردن قفل مارکر setMarkerPosition(null); // تنظیم مارکر به مرکز نقشه + setStartIconColor("#003d4f"); }; return ( @@ -93,7 +91,7 @@ const MapInteraction = ({ setValue, startLat, startLng }) => { import("@/core/components/MapLayer"), { loading: () => , ssr: false, }); -const createCustomIcon = (size, iconUrl, labelText) => { +const createCustomIcon = (size, iconUrl, labelText, color) => { if (labelText) { return L.divIcon({ + className: "custom-marker", // Apply your custom CSS class html: ` -
- icon -
- ${labelText} +
+
+ ${labelText}
-
- `, - iconSize: size, - iconAnchor: [size[0] / 2, size[1]], - popupAnchor: [0, -size[1]], +
+
`, + iconSize: [100, 50], // Adjust icon size to fit your content + iconAnchor: [50, 25], // Adjust to position the marker correctly }); } - return L.icon({ iconUrl: iconUrl, iconSize: size, @@ -48,6 +42,8 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => { const [startPosition, setStartPosition] = useState(startLat && startLng ? { lat: startLat, lng: startLng } : null); const [endPosition, setEndPosition] = useState(endLat && endLng ? { lat: endLat, lng: endLng } : null); const [enableSend, setEnableSend] = useState(false); + const [startIconColor, setStartIconColor] = useState(startLat ? "#1CAC66" : "#003d4f"); // رنگ آیکن شروع + const [endIconColor, setEndIconColor] = useState(endLat ? "#D13131" : "#003d4f"); // رنگ آیکن پایان const startRef = useRef(); const endRef = useRef(); @@ -86,6 +82,7 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => { setIsStartLocked(false); setStartPosition(null); setValue("start_point", null); + setStartIconColor("#003d4f"); }; const handleUnlockEnd = () => { @@ -95,6 +92,8 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => { setStartPosition(null); setValue("end_point", ""); setValue("start_point", null); + setStartIconColor("#003d4f"); + setEndIconColor("#003d4f"); }; return ( @@ -102,7 +101,7 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => { { if (!enableSend) return; @@ -111,6 +110,7 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => { setValue("start_point", { lat: center.lat.toString(), lng: center.lng.toString() }); setStartPosition({ lat: center.lat, lng: center.lng }); setIsStartLocked(true); + setStartIconColor("#1CAC66"); } }, }} @@ -172,7 +172,7 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => { { if (!enableSend) return; @@ -181,6 +181,7 @@ const MapInteraction = ({ setValue, startLat, startLng, endLat, endLng }) => { setValue("end_point", { lat: center.lat.toString(), lng: center.lng.toString() }); setEndPosition({ lat: center.lat, lng: center.lng }); setIsEndLocked(true); + setEndIconColor("#D13131"); } }, }} diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index db6c244..44434f8 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -30,9 +30,10 @@ 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.rmto.ir/v2/road_patrols/operator/cartable/report"; +export const EXPORT_ROAD_PATROL_OPERATOR_LIST = "https://rms.witel.ir/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.rmto.ir/v2/road_patrols/supervisor/cartable/report"; +export const EXPORT_ROAD_PATROL_SUPERVISOR_LIST = "https://rms.witel.ir/v2/road_patrols/supervisor/cartable/report"; +export const DELETE_ROAD_PATROL_SUPERVISOR = api + "/api/v3/road_patrols/delete"; // road items export const GET_ROAD_ITEMS_SUPERVISOR_LIST = api + "/api/v3/road_items/supervisor_index"; From 7671fddc848a93b6b189dba2df5b088fd1c91a76 Mon Sep 17 00:00:00 2001 From: Amin Ghasempoor Date: Wed, 1 Jan 2025 13:25:58 +0000 Subject: [PATCH 2/2] Feature/user log entrance --- src/app/(withAuth)/dashboard/azmayesh/page.js | 2 + .../dashboard/azmayesh_type/page.js | 2 + .../dashboard/road-items/operator/page.js | 2 + .../dashboard/road-items/supervisor/page.js | 2 + .../dashboard/road-patrols/operator/page.js | 2 + .../dashboard/road-patrols/supervisor/page.js | 2 + .../Create/Forms/CreateFormContent.jsx | 61 ++++- .../Actions/Create/Forms/GetItemInfo.jsx | 16 +- .../Actions/Create/Forms/GetItemsForm.jsx | 4 +- .../Actions/Create/Forms/GetSubItemsForm.jsx | 4 +- .../Create/Forms/PreviousStatesInfo.jsx | 2 +- .../operator/Actions/Create/Forms/index.jsx | 19 +- .../ObservedGashtCreate/GashtCreate.jsx | 17 ++ .../GashtCreateContent.jsx | 116 ++++++++ .../Actions/ObservedGashtCreate/index.jsx | 38 +++ .../RowActions/EditForm/EditController.jsx | 55 ++-- .../RowActions/EditForm/EditFormContent.jsx | 255 ++++-------------- .../RowActions/EditForm/EditFormCreate.jsx | 171 ++++++++++++ .../operator/RowActions/EditForm/index.jsx | 20 +- .../dashboard/roadItems/operator/Toolbar.jsx | 2 + src/core/components/ActivityCodeLog.jsx | 30 +++ src/core/components/CarCode.jsx | 6 +- src/core/components/RahdarCode.jsx | 4 +- src/core/utils/routes.js | 3 + 24 files changed, 558 insertions(+), 277 deletions(-) create mode 100644 src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreate.jsx create mode 100644 src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/GashtCreateContent.jsx create mode 100644 src/components/dashboard/roadItems/operator/Actions/ObservedGashtCreate/index.jsx create mode 100644 src/components/dashboard/roadItems/operator/RowActions/EditForm/EditFormCreate.jsx create mode 100644 src/core/components/ActivityCodeLog.jsx 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";