From 8f7368585d0cb779a769e7fa0462f75750d8a823 Mon Sep 17 00:00:00 2001 From: Amin Ghasempoor Date: Sat, 1 Mar 2025 10:56:22 +0000 Subject: [PATCH] Feature/edit complaint --- .../complaintList/ComplaintListTable.jsx | 4 +- .../complaintList/ExcelPrint/index.jsx | 74 +++++++++++++++++++ .../registerAction/RegisterActionContent.jsx | 4 +- .../registerAction/RegisterActionDone.jsx | 2 +- .../complaintList/RowActions/index.jsx | 6 +- .../fastReact/complaintList/Toolbar.jsx | 7 +- .../fastReact/operator/ExcelPrint/index.jsx | 6 +- .../operator/Form/EditForm/EditController.jsx | 72 ++++++++++++++++++ .../operator/Form/EditForm/index.jsx | 59 +++++++++++++++ .../fastReact/operator/OperatorList.jsx | 14 +++- .../fastReact/operator/RowActions/index.jsx | 9 ++- .../fastReact/supervisor/ExcelPrint/index.jsx | 6 +- .../fastReact/supervisor/SupervisorList.jsx | 10 ++- src/core/utils/routes.js | 5 ++ 14 files changed, 255 insertions(+), 23 deletions(-) create mode 100644 src/components/dashboard/fastReact/complaintList/ExcelPrint/index.jsx create mode 100644 src/components/dashboard/fastReact/operator/Form/EditForm/EditController.jsx create mode 100644 src/components/dashboard/fastReact/operator/Form/EditForm/index.jsx diff --git a/src/components/dashboard/fastReact/complaintList/ComplaintListTable.jsx b/src/components/dashboard/fastReact/complaintList/ComplaintListTable.jsx index 82083b5..be9a79c 100644 --- a/src/components/dashboard/fastReact/complaintList/ComplaintListTable.jsx +++ b/src/components/dashboard/fastReact/complaintList/ComplaintListTable.jsx @@ -57,7 +57,7 @@ const ComplaintListTable = ({ open, setOpen, mutate }) => { { accessorKey: "id", header: "کد یکتا", - id: "id", + id: "road_observeds__id", enableColumnFilter: true, datatype: "text", filterMode: "equals", @@ -81,7 +81,7 @@ const ComplaintListTable = ({ open, setOpen, mutate }) => { ...(hasCountryPermission ? [dynamicColumns] : []), { header: "اداره", - id: "edarat_id", + id: "road_observeds__edarate_shahri_id", enableColumnFilter: true, datatype: "numeric", filterMode: "equals", diff --git a/src/components/dashboard/fastReact/complaintList/ExcelPrint/index.jsx b/src/components/dashboard/fastReact/complaintList/ExcelPrint/index.jsx new file mode 100644 index 0000000..05f3362 --- /dev/null +++ b/src/components/dashboard/fastReact/complaintList/ExcelPrint/index.jsx @@ -0,0 +1,74 @@ +import { Button, CircularProgress, IconButton, useMediaQuery } from "@mui/material"; +import { useMemo, useState } from "react"; +import moment from "jalali-moment"; +import FileSaver from "file-saver"; +import DescriptionIcon from "@mui/icons-material/Description"; +import useRequest from "@/lib/hooks/useRequest"; +import { EXPORT_FAST_REACT_COMPLAINT_LIST } from "@/core/utils/routes"; +import { useTheme } from "@emotion/react"; +import DataTableFilterDataStructure from "@/core/utils/DataTableFilterDataStructure"; +import isArrayEmpty from "@/core/utils/isArrayEmpty"; + +const PrintExcel = ({ table, filterData }) => { + const [loading, setLoading] = useState(false); + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const requestServer = useRequest(); + const activeFilters = Object.entries(filterData).reduce((acc, [key, filter]) => { + if (filter.value && (!Array.isArray(filter.value) || filter.value.some((item) => item.trim() !== ""))) { + acc.push({ id: key, value: filter.value }); + } + return acc; + }, []); + + const filterParams = useMemo(() => { + const params = new URLSearchParams(); + if (activeFilters.length > 0) { + activeFilters.map((filter, index) => { + const filteredFilterData = DataTableFilterDataStructure(filterData, isArrayEmpty); + params.set("filters", JSON.stringify(filteredFilterData.length === 0 ? [] : filteredFilterData)); + }); + } else { + params.set("filters", JSON.stringify([])); + } + return params; + }, [activeFilters]); + + const clickHandler = () => { + setLoading(true); + requestServer(`${EXPORT_FAST_REACT_COMPLAINT_LIST}?${filterParams}`, "get", { + requestOptions: { responseType: "blob" }, + }) + .then((response) => { + const filename = `خروجی لیست شکایات واکنش سریع تاریخ_${moment().format("jYYYY_jMM_jDD")}.xlsx`; + FileSaver.saveAs(response.data, filename); + }) + .catch(() => {}) + .finally(() => { + setLoading(false); + }); + }; + + return ( + <> + {isMobile ? ( + + + + ) : ( + + )} + + ); +}; +export default PrintExcel; diff --git a/src/components/dashboard/fastReact/complaintList/Form/registerAction/RegisterActionContent.jsx b/src/components/dashboard/fastReact/complaintList/Form/registerAction/RegisterActionContent.jsx index 5e57e5a..34d4130 100644 --- a/src/components/dashboard/fastReact/complaintList/Form/registerAction/RegisterActionContent.jsx +++ b/src/components/dashboard/fastReact/complaintList/Form/registerAction/RegisterActionContent.jsx @@ -10,7 +10,7 @@ import { mixed, object, string } from "yup"; import BeenhereIcon from "@mui/icons-material/Beenhere"; const RegisterActionContent = ({ setOpen, defaultValues, onBaseSubmit }) => { - const [selectedOption, setSelectedOption] = useState("1"); + const [selectedOption, setSelectedOption] = useState(defaultValues?.rms_status || "1"); const handleOptionChange = (e) => { setSelectedOption(e.target.value); @@ -46,10 +46,8 @@ const RegisterActionContent = ({ setOpen, defaultValues, onBaseSubmit }) => { }); const onSubmit = async (data) => { - console.log(data); await onBaseSubmit(data); }; - return ( diff --git a/src/components/dashboard/fastReact/complaintList/Form/registerAction/RegisterActionDone.jsx b/src/components/dashboard/fastReact/complaintList/Form/registerAction/RegisterActionDone.jsx index 8ba2616..567832d 100644 --- a/src/components/dashboard/fastReact/complaintList/Form/registerAction/RegisterActionDone.jsx +++ b/src/components/dashboard/fastReact/complaintList/Form/registerAction/RegisterActionDone.jsx @@ -4,7 +4,7 @@ import ImageUpload from "./ImageUpload"; import MapInfoOneMarker from "@/core/components/MapInfoOneMarker"; const RegisterActionDone = ({ control, setValue, errors }) => { - const StartPoint = useWatch({ control, name: "rms_start_latlng" }); + const StartPoint = useWatch({ control, name: "start_point" }); return ( diff --git a/src/components/dashboard/fastReact/complaintList/RowActions/index.jsx b/src/components/dashboard/fastReact/complaintList/RowActions/index.jsx index 71874db..0cae4b8 100644 --- a/src/components/dashboard/fastReact/complaintList/RowActions/index.jsx +++ b/src/components/dashboard/fastReact/complaintList/RowActions/index.jsx @@ -6,9 +6,9 @@ import Refer from "./Refer"; const RowActions = ({ row, mutate }) => { return ( - - - + + + ); }; diff --git a/src/components/dashboard/fastReact/complaintList/Toolbar.jsx b/src/components/dashboard/fastReact/complaintList/Toolbar.jsx index 1f291d1..22d8bd3 100644 --- a/src/components/dashboard/fastReact/complaintList/Toolbar.jsx +++ b/src/components/dashboard/fastReact/complaintList/Toolbar.jsx @@ -1,6 +1,11 @@ import { Stack } from "@mui/material"; +import PrintExcel from "./ExcelPrint"; const Toolbar = ({ table, filterData, mutate }) => { - return ; + return ( + + + + ); }; export default Toolbar; diff --git a/src/components/dashboard/fastReact/operator/ExcelPrint/index.jsx b/src/components/dashboard/fastReact/operator/ExcelPrint/index.jsx index ae703fa..c1e2bea 100644 --- a/src/components/dashboard/fastReact/operator/ExcelPrint/index.jsx +++ b/src/components/dashboard/fastReact/operator/ExcelPrint/index.jsx @@ -4,7 +4,7 @@ import moment from "jalali-moment"; import FileSaver from "file-saver"; import DescriptionIcon from "@mui/icons-material/Description"; import useRequest from "@/lib/hooks/useRequest"; -import { EXPORT_ROAD_ITEMS_SUPERVISOR_LIST } from "@/core/utils/routes"; +import { EXPORT_FAST_REACT_OPERATOR_LIST } from "@/core/utils/routes"; import { useTheme } from "@emotion/react"; import DataTableFilterDataStructure from "@/core/utils/DataTableFilterDataStructure"; import isArrayEmpty from "@/core/utils/isArrayEmpty"; @@ -36,11 +36,11 @@ const PrintExcel = ({ table, filterData }) => { const clickHandler = () => { setLoading(true); - requestServer(`${EXPORT_ROAD_ITEMS_SUPERVISOR_LIST}?${filterParams}`, "get", { + requestServer(`${EXPORT_FAST_REACT_OPERATOR_LIST}?${filterParams}`, "get", { requestOptions: { responseType: "blob" }, }) .then((response) => { - const filename = `خروجی کارتابل ارزیابی فعالیت روزانه تاریخ_${moment().format("jYYYY_jMM_jDD")}.xlsx`; + const filename = `خروجی کارتابل عملیات واکنش سریع تاریخ_${moment().format("jYYYY_jMM_jDD")}.xlsx`; FileSaver.saveAs(response.data, filename); }) .catch(() => {}) diff --git a/src/components/dashboard/fastReact/operator/Form/EditForm/EditController.jsx b/src/components/dashboard/fastReact/operator/Form/EditForm/EditController.jsx new file mode 100644 index 0000000..5025d54 --- /dev/null +++ b/src/components/dashboard/fastReact/operator/Form/EditForm/EditController.jsx @@ -0,0 +1,72 @@ +import useRequest from "@/lib/hooks/useRequest"; +import { useEffect, useState } from "react"; +import { GET_FAST_REACT_ITEM_DETAIL, UPDATE_FAST_REACT } from "@/core/utils/routes"; +import DialogLoading from "@/core/components/DialogLoading"; +import RegisterActionContent from "@/components/dashboard/fastReact/complaintList/Form/registerAction/RegisterActionContent"; + +const EditController = ({ rowId, mutate, setOpenEditDialog }) => { + const requestServer = useRequest(); + const [fastReactItemDetails, setFastReactItemDetails] = useState(null); + const [fastReactItemDetailsLoading, setFastReactItemDetailsLoading] = useState(false); + + useEffect(() => { + setFastReactItemDetailsLoading(true); + requestServer(`${GET_FAST_REACT_ITEM_DETAIL}/${rowId}`, "get") + .then((response) => { + setFastReactItemDetails(response.data.data); + setFastReactItemDetailsLoading(false); + }) + .catch((e) => { + setFastReactItemDetailsLoading(false); + }); + }, [rowId]); + const startPoint = fastReactItemDetails?.rms_start_latlng + ? { lat: fastReactItemDetails?.rms_start_latlng[0], lng: fastReactItemDetails?.rms_start_latlng[1] } + : { lat: "", lng: "" }; + const defaultData = { + rms_status: `${fastReactItemDetails?.rms_status || "1"}`, + description: fastReactItemDetails?.rms_description || "", + start_point: startPoint, + image_before_1: fastReactItemDetails?.image_before || null, + image_after_1: fastReactItemDetails?.image_after || null, + }; + const HandleSubmit = async (result) => { + console.log("result", result); + const formData = new FormData(); + const rmsLatLng = `${result.start_point.lat},${result.start_point.lng}`; + if (result.rms_status === "1") { + formData.append("rms_description", result.description); + formData.append("rms_status", 1); + formData.append("start_point", rmsLatLng); + result.image_before_1 !== defaultData.image_before_1 && + formData.append("image_before", result.image_before_1); + result.image_after_1 !== defaultData.image_after_1 && formData.append("image_after", result.image_after_1); + } else { + formData.append("rms_description", result.description); + formData.append("rms_status", 2); + } + + await requestServer(`${UPDATE_FAST_REACT}/${rowId}`, "post", { + data: formData, + }) + .then(() => { + mutate(); + setOpenEditDialog(false); + }) + .catch(() => {}); + }; + return ( + <> + {fastReactItemDetailsLoading ? ( + + ) : ( + + )} + + ); +}; +export default EditController; diff --git a/src/components/dashboard/fastReact/operator/Form/EditForm/index.jsx b/src/components/dashboard/fastReact/operator/Form/EditForm/index.jsx new file mode 100644 index 0000000..e608b32 --- /dev/null +++ b/src/components/dashboard/fastReact/operator/Form/EditForm/index.jsx @@ -0,0 +1,59 @@ +import { Dialog, DialogTitle, IconButton, Tooltip } from "@mui/material"; +import { useState } from "react"; +import BorderColorIcon from "@mui/icons-material/BorderColor"; +import EditController from "./EditController"; +import CloseIcon from "@mui/icons-material/Close"; + +const EditForm = ({ row, mutate, rowId }) => { + const [openEditDialog, setOpenEditDialog] = useState(false); + + return ( + <> + + { + setOpenEditDialog(true); + }} + > + + + + + setOpenEditDialog(false)} + sx={(theme) => ({ + position: "absolute", + right: 8, + top: 8, + zIndex: 50, + color: theme.palette.grey[500], + })} + > + + + {openEditDialog && ( + + )} + + + ); +}; +export default EditForm; diff --git a/src/components/dashboard/fastReact/operator/OperatorList.jsx b/src/components/dashboard/fastReact/operator/OperatorList.jsx index 0234f2b..cc837b7 100644 --- a/src/components/dashboard/fastReact/operator/OperatorList.jsx +++ b/src/components/dashboard/fastReact/operator/OperatorList.jsx @@ -118,9 +118,13 @@ const OperatorList = () => { }, }, Cell: ({ row }) => { + if (!row.original.rms_start_latlng) return <>بدون موقعیت; return ( - + ); }, @@ -171,7 +175,7 @@ const OperatorList = () => { { accessorFn: (row) => moment(row.created_at).locale("fa").format("HH:mm | yyyy/MM/DD"), header: "تاریخ ثبت", - id: "created_at", + id: "road_observeds__created_at", enableColumnFilter: true, datatype: "date", filterMode: "between", @@ -179,7 +183,11 @@ const OperatorList = () => { size: 100, }, { - accessorFn: (row) => moment(row.rms_last_activity).locale("fa").format("HH:mm | yyyy/MM/DD"), + accessorFn: (row) => { + return row.rms_last_activity + ? moment(row?.rms_last_activity).locale("fa").format("HH:mm | yyyy/MM/DD") + : "بدون تاریخ"; + }, header: "تاریخ اقدام", id: "rms_last_activity", enableColumnFilter: true, diff --git a/src/components/dashboard/fastReact/operator/RowActions/index.jsx b/src/components/dashboard/fastReact/operator/RowActions/index.jsx index 9fb298d..5b632d6 100644 --- a/src/components/dashboard/fastReact/operator/RowActions/index.jsx +++ b/src/components/dashboard/fastReact/operator/RowActions/index.jsx @@ -1,6 +1,13 @@ import { Box } from "@mui/material"; +import EditForm from "../Form/EditForm"; const RowActions = ({ row, mutate }) => { - return ; + return ( + + {row.original.status === 2 && ( + + )} + + ); }; export default RowActions; diff --git a/src/components/dashboard/fastReact/supervisor/ExcelPrint/index.jsx b/src/components/dashboard/fastReact/supervisor/ExcelPrint/index.jsx index ae703fa..120a8f0 100644 --- a/src/components/dashboard/fastReact/supervisor/ExcelPrint/index.jsx +++ b/src/components/dashboard/fastReact/supervisor/ExcelPrint/index.jsx @@ -4,7 +4,7 @@ import moment from "jalali-moment"; import FileSaver from "file-saver"; import DescriptionIcon from "@mui/icons-material/Description"; import useRequest from "@/lib/hooks/useRequest"; -import { EXPORT_ROAD_ITEMS_SUPERVISOR_LIST } from "@/core/utils/routes"; +import { EXPORT_FAST_REACT_SUPERVISOR_LIST } from "@/core/utils/routes"; import { useTheme } from "@emotion/react"; import DataTableFilterDataStructure from "@/core/utils/DataTableFilterDataStructure"; import isArrayEmpty from "@/core/utils/isArrayEmpty"; @@ -36,11 +36,11 @@ const PrintExcel = ({ table, filterData }) => { const clickHandler = () => { setLoading(true); - requestServer(`${EXPORT_ROAD_ITEMS_SUPERVISOR_LIST}?${filterParams}`, "get", { + requestServer(`${EXPORT_FAST_REACT_SUPERVISOR_LIST}?${filterParams}`, "get", { requestOptions: { responseType: "blob" }, }) .then((response) => { - const filename = `خروجی کارتابل ارزیابی فعالیت روزانه تاریخ_${moment().format("jYYYY_jMM_jDD")}.xlsx`; + const filename = `خروجی کارتابل ارزیابی واکنش سریع تاریخ_${moment().format("jYYYY_jMM_jDD")}.xlsx`; FileSaver.saveAs(response.data, filename); }) .catch(() => {}) diff --git a/src/components/dashboard/fastReact/supervisor/SupervisorList.jsx b/src/components/dashboard/fastReact/supervisor/SupervisorList.jsx index 3a607c2..be912f1 100644 --- a/src/components/dashboard/fastReact/supervisor/SupervisorList.jsx +++ b/src/components/dashboard/fastReact/supervisor/SupervisorList.jsx @@ -91,7 +91,7 @@ const SupervisorList = () => { ...(hasCountryPermission ? [dynamicColumns] : []), { header: "اداره", - id: "city_id", + id: "edarate_shahri_id", enableColumnFilter: true, datatype: "numeric", filterMode: "equals", @@ -144,7 +144,7 @@ const SupervisorList = () => { /> ); }, - Cell: ({ renderedCellValue, row }) => <>{row.original.city_fa}, + Cell: ({ renderedCellValue, row }) => <>{row.original.name_fa}, }, { accessorKey: "Title", @@ -219,9 +219,13 @@ const SupervisorList = () => { }, }, Cell: ({ row }) => { + if (!row.original.rms_start_latlng) return <>بدون موقعیت; return ( - + ); }, diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index ebcf2ce..d7d4193 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -121,3 +121,8 @@ export const GET_FAST_REACT_OPERATOR = api + "/api/v3/road_observations/operator export const GET_FAST_REACT_REFER_LIST = api + "/api/v3/road_observations/refer_list"; export const REFER_FAST_REACT = api + "/api/v3/road_observations/refer"; export const RESTORE_FAST_REACT = api + "/api/v3/road_observations/restore"; +export const GET_FAST_REACT_ITEM_DETAIL = api + "/api/v3/road_observations"; +export const UPDATE_FAST_REACT = api + "/api/v3/road_observations/modify_registration"; +export const EXPORT_FAST_REACT_SUPERVISOR_LIST = api + "/api/v3/road_observations/supervisor_report"; +export const EXPORT_FAST_REACT_OPERATOR_LIST = api + "/api/v3/road_observations/operator_report"; +export const EXPORT_FAST_REACT_COMPLAINT_LIST = api + "/api/v3/road_observations/complaints_report";