diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/rahdaran/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/rahdaran/page.js
new file mode 100644
index 0000000..67311d9
--- /dev/null
+++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/rahdaran/page.js
@@ -0,0 +1,10 @@
+import RahdaranTablePage from "@/components/dashboard/rahdaran";
+import WithPermission from "@/core/middlewares/withPermission";
+
+export default function page() {
+ return (
+
+
+
+ );
+}
diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/operator/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/operator/page.js
index a788616..417937a 100644
--- a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/operator/page.js
+++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/operator/page.js
@@ -7,7 +7,13 @@ export const metadata = {
const Page = () => {
return (
<>
-
+
{/* */}
diff --git a/src/components/dashboard/rahdaran/Actions/Create/Form/CreateFormContent.jsx b/src/components/dashboard/rahdaran/Actions/Create/Form/CreateFormContent.jsx
new file mode 100644
index 0000000..74a2e76
--- /dev/null
+++ b/src/components/dashboard/rahdaran/Actions/Create/Form/CreateFormContent.jsx
@@ -0,0 +1,105 @@
+import PersianTextField from "@/core/components/PersianTextField";
+import StyledForm from "@/core/components/StyledForm";
+import validateNationalCode from "@/core/utils/nationalCodeValidation";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { Beenhere, ExitToApp } from "@mui/icons-material";
+import { Button, DialogActions, DialogContent, Grid, Stack } from "@mui/material";
+import { Controller, useForm } from "react-hook-form";
+import { object, string } from "yup";
+
+const validationSchema = object({
+ name: string().required("وارد کردن نام فارسی الزامیست!"),
+ code: string()
+ .required("لطفا کد ملی را وارد کنید!!!")
+ .test("max", "کد ملی باید شامل 10 رقم باشد", (value) => value.toString().length === 10)
+ .test("validation", "کد ملی صحیح نمی باشد", (value) => validateNationalCode(value)),
+});
+
+const CreateFormContent = ({ setOpen, defaultValues, onSubmitBase }) => {
+ const {
+ control,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = useForm({
+ defaultValues,
+ resolver: yupResolver(validationSchema),
+ mode: "all",
+ });
+ const handleOnSubmit = async (data) => {
+ await onSubmitBase(data);
+ };
+
+ return (
+ <>
+
+
+
+
+
+
+ (
+
+ )}
+ />
+
+
+
+
+
+
+ (
+
+ )}
+ />
+
+
+
+
+
+
+
+ }>
+ {" "}
+ {isSubmitting ? "در حال ثبت راهدار" : "ثبت راهدار"}{" "}
+
+
+
+ >
+ );
+};
+export default CreateFormContent;
diff --git a/src/components/dashboard/rahdaran/Actions/Create/Form/index.jsx b/src/components/dashboard/rahdaran/Actions/Create/Form/index.jsx
new file mode 100644
index 0000000..5cb292d
--- /dev/null
+++ b/src/components/dashboard/rahdaran/Actions/Create/Form/index.jsx
@@ -0,0 +1,57 @@
+import { Dialog, DialogTitle, IconButton } from "@mui/material";
+import CreateFormContent from "./CreateFormContent";
+import CloseIcon from "@mui/icons-material/Close";
+import useRequest from "@/lib/hooks/useRequest";
+import { CREATE_RAHDARAN_ITEM } from "@/core/utils/routes";
+import { DialogHeader } from "next/dist/client/components/react-dev-overlay/internal/components/Dialog";
+
+const CreateForm = ({ open, setOpen, mutate }) => {
+ const requestServer = useRequest({ notificationSuccess: true });
+ const defaultValues = {
+ name: "",
+ code: "",
+ };
+ const onSubmit = async (result) => {
+ const formData = new FormData();
+ formData.append("name", result.name);
+ formData.append("code", result.code);
+
+ await requestServer(CREATE_RAHDARAN_ITEM, "post", {
+ data: formData,
+ })
+ .then(() => {
+ mutate();
+ setOpen(false);
+ })
+ .catch(() => {});
+ };
+ return (
+
+ );
+};
+export default CreateForm;
diff --git a/src/components/dashboard/rahdaran/Actions/Create/index.jsx b/src/components/dashboard/rahdaran/Actions/Create/index.jsx
new file mode 100644
index 0000000..8417fd5
--- /dev/null
+++ b/src/components/dashboard/rahdaran/Actions/Create/index.jsx
@@ -0,0 +1,36 @@
+import { AddCircle } from "@mui/icons-material";
+import { Button, IconButton, useMediaQuery, useTheme } from "@mui/material";
+import CreateForm from "./Form";
+import { useState } from "react";
+
+const CreateRahdar = ({ mutate }) => {
+ const theme = useTheme();
+ const isMobile = useMediaQuery(theme.breakpoints.down("sm"));
+ const [open, setOpen] = useState(false);
+
+ const handleOpen = () => {
+ setOpen(true);
+ };
+
+ return (
+ <>
+ {isMobile ? (
+
+
+
+ ) : (
+ }
+ onClick={handleOpen}
+ >
+ ثبت راهدار
+
+ )}
+
+ >
+ );
+};
+export default CreateRahdar;
diff --git a/src/components/dashboard/rahdaran/Actions/Edit/EditController.jsx b/src/components/dashboard/rahdaran/Actions/Edit/EditController.jsx
new file mode 100644
index 0000000..61bb336
--- /dev/null
+++ b/src/components/dashboard/rahdaran/Actions/Edit/EditController.jsx
@@ -0,0 +1,37 @@
+import { UPDATE_RAHDARAN_ITEM } from "@/core/utils/routes";
+import useRequest from "@/lib/hooks/useRequest";
+import { DialogTitle } from "@mui/material";
+import { DialogHeader } from "next/dist/client/components/react-dev-overlay/internal/components/Dialog";
+import CreateFormContent from "../Create/Form/CreateFormContent";
+
+const EditController = ({ rowId, mutate, setOpen, row }) => {
+ const requestServer = useRequest({ notificationSuccess: true });
+
+ const defaultData = {
+ name: row.original?.name || "",
+ code: row.original?.code || "",
+ };
+ const handleSubmit = async (result) => {
+ const formData = new FormData();
+ formData.append("name", result.name);
+ formData.append("code", result.code);
+
+ await requestServer(`${UPDATE_RAHDARAN_ITEM}/${rowId}`, "post", {
+ data: formData,
+ })
+ .then(() => {
+ mutate();
+ setOpen(false);
+ })
+ .catch(() => {});
+ };
+ return (
+ <>
+
+ ویرایش راهدار
+
+
+ >
+ );
+};
+export default EditController;
diff --git a/src/components/dashboard/rahdaran/Actions/Edit/index.jsx b/src/components/dashboard/rahdaran/Actions/Edit/index.jsx
new file mode 100644
index 0000000..2a47c4c
--- /dev/null
+++ b/src/components/dashboard/rahdaran/Actions/Edit/index.jsx
@@ -0,0 +1,51 @@
+import BorderColorIcon from "@mui/icons-material/BorderColor";
+import CloseIcon from "@mui/icons-material/Close";
+import { Dialog, IconButton, Tooltip } from "@mui/material";
+import { useState } from "react";
+import EditController from "./EditController";
+
+const EditRahdar = ({ mutate, row, rowId }) => {
+ const [open, setOpen] = useState(false);
+
+ return (
+ <>
+
+ {
+ setOpen(true);
+ }}
+ >
+
+
+
+
+ >
+ );
+};
+export default EditRahdar;
diff --git a/src/components/dashboard/rahdaran/RahdaranList.jsx b/src/components/dashboard/rahdaran/RahdaranList.jsx
new file mode 100644
index 0000000..90df9e9
--- /dev/null
+++ b/src/components/dashboard/rahdaran/RahdaranList.jsx
@@ -0,0 +1,69 @@
+"use client";
+import DataTableWithAuth from "@/core/components/DataTableWithAuth";
+import { GET_RAHDARAN_TABLE_LIST } from "@/core/utils/routes";
+import { Box } from "@mui/material";
+import { useMemo } from "react";
+import RowActions from "./RowActions";
+import Toolbar from "./Toolbar";
+
+const RahdaranList = () => {
+ const columns = useMemo(
+ () => [
+ {
+ accessorKey: "id",
+ header: "کد یکتا",
+ id: "id",
+ enableColumnFilter: true,
+ datatype: "text",
+ filterMode: "equals",
+ sortDescFirst: false,
+ columnFilterModeOptions: ["equals", "contains"],
+ grow: false,
+ size: 100,
+ },
+ {
+ accessorKey: "name",
+ header: "نام و نام خانوادگی",
+ id: "name",
+ enableColumnFilter: true,
+ datatype: "text",
+ filterMode: "equals",
+ columnFilterModeOptions: ["equals", "contains"],
+ grow: false,
+ size: 100,
+ },
+ {
+ accessorKey: "code",
+ header: "کد ملی",
+ id: "code",
+ enableColumnFilter: true,
+ datatype: "text",
+ filterMode: "equals",
+ columnFilterModeOptions: ["equals", "contains"],
+ grow: false,
+ size: 100,
+ },
+ ],
+ []
+ );
+
+ return (
+ <>
+
+
+
+ >
+ );
+};
+export default RahdaranList;
diff --git a/src/components/dashboard/rahdaran/RowActions/DeleteDialog/DeleteContent.jsx b/src/components/dashboard/rahdaran/RowActions/DeleteDialog/DeleteContent.jsx
new file mode 100644
index 0000000..ef1c300
--- /dev/null
+++ b/src/components/dashboard/rahdaran/RowActions/DeleteDialog/DeleteContent.jsx
@@ -0,0 +1,39 @@
+import { Button, DialogActions, DialogContent, Stack, Typography } from "@mui/material";
+import React, { useState } from "react";
+import useRequest from "@/lib/hooks/useRequest";
+import { DELETE_RAHDARAN_ITEM } from "@/core/utils/routes";
+
+const DeleteContent = ({ rowId, mutate, setOpenDeleteDialog }) => {
+ const [submitting, setSubmitting] = useState(false);
+ const requestServer = useRequest({ notificationSuccess: true });
+ const handleClick = () => {
+ setSubmitting(true);
+ requestServer(`${DELETE_RAHDARAN_ITEM}/${rowId}`, "delete")
+ .then(() => {
+ mutate();
+ setSubmitting(false);
+ setOpenDeleteDialog(false);
+ })
+ .catch(() => {
+ setSubmitting(false);
+ });
+ };
+ return (
+ <>
+
+
+ آیا از حذف راهدار اطمینان دارید؟
+
+
+
+
+
+
+ >
+ );
+};
+export default DeleteContent;
diff --git a/src/components/dashboard/rahdaran/RowActions/DeleteDialog/index.jsx b/src/components/dashboard/rahdaran/RowActions/DeleteDialog/index.jsx
new file mode 100644
index 0000000..3cf143b
--- /dev/null
+++ b/src/components/dashboard/rahdaran/RowActions/DeleteDialog/index.jsx
@@ -0,0 +1,34 @@
+import DeleteIcon from "@mui/icons-material/Delete";
+import { Dialog, DialogTitle, IconButton, Tooltip } from "@mui/material";
+import { useState } from "react";
+import DeleteContent from "./DeleteContent";
+const DeleteDialog = ({ rowId, mutate }) => {
+ const [openDeleteDialog, setOpenDeleteDialog] = useState(false);
+
+ return (
+ <>
+
+ setOpenDeleteDialog(true)}>
+
+
+
+
+ >
+ );
+};
+export default DeleteDialog;
diff --git a/src/components/dashboard/rahdaran/RowActions/index.jsx b/src/components/dashboard/rahdaran/RowActions/index.jsx
new file mode 100644
index 0000000..88602aa
--- /dev/null
+++ b/src/components/dashboard/rahdaran/RowActions/index.jsx
@@ -0,0 +1,12 @@
+import { Box } from "@mui/material";
+import EditRahdar from "../Actions/Edit";
+import DeleteDialog from "./DeleteDialog";
+const RowActions = ({ row, mutate }) => {
+ return (
+
+
+
+
+ );
+};
+export default RowActions;
diff --git a/src/components/dashboard/rahdaran/Toolbar.jsx b/src/components/dashboard/rahdaran/Toolbar.jsx
new file mode 100644
index 0000000..18b0315
--- /dev/null
+++ b/src/components/dashboard/rahdaran/Toolbar.jsx
@@ -0,0 +1,9 @@
+import CreateRahdar from "./Actions/Create";
+const Toolbar = ({ mutate }) => {
+ return (
+ <>
+
+ >
+ );
+};
+export default Toolbar;
diff --git a/src/components/dashboard/rahdaran/index.jsx b/src/components/dashboard/rahdaran/index.jsx
new file mode 100644
index 0000000..bfcce4d
--- /dev/null
+++ b/src/components/dashboard/rahdaran/index.jsx
@@ -0,0 +1,13 @@
+import PageTitle from "@/core/components/PageTitle";
+import { Stack } from "@mui/material";
+import RahdaranList from "./RahdaranList";
+
+const RahdaranTablePage = () => {
+ return (
+
+
+
+
+ );
+};
+export default RahdaranTablePage;
diff --git a/src/components/dashboard/roadMissions/operator/Actions/Create/index.jsx b/src/components/dashboard/roadMissions/operator/Actions/Create/index.jsx
index 236e38c..27d3e0c 100644
--- a/src/components/dashboard/roadMissions/operator/Actions/Create/index.jsx
+++ b/src/components/dashboard/roadMissions/operator/Actions/Create/index.jsx
@@ -32,13 +32,13 @@ const Create = ({ mutate }) => {
end_point: result.end_point,
...(result.type == 1
? {
- start_date: `${result.start_date} ${moment(result.start_time).format("HH:mm")}`,
- end_date: `${result.end_date} ${moment(result.end_time).format("HH:mm")}`,
- }
+ start_date: `${result.start_date} ${moment(result.start_time).format("HH:mm")}`,
+ end_date: `${result.end_date} ${moment(result.end_time).format("HH:mm")}`,
+ }
: {
- start_date: result.start_date,
- end_date: result.end_date,
- }),
+ start_date: result.start_date,
+ end_date: result.end_date,
+ }),
},
hasSidebarUpdate: true,
})
@@ -46,7 +46,7 @@ const Create = ({ mutate }) => {
mutate();
setOpen(false);
})
- .catch((error) => { })
+ .catch((error) => {})
.finally(() => {
setSubmitting(false);
});
diff --git a/src/components/dashboard/roadMissions/operator/RowActions/Edit/EditController/index.jsx b/src/components/dashboard/roadMissions/operator/RowActions/Edit/EditController/index.jsx
index 612bac4..6fd0c7f 100644
--- a/src/components/dashboard/roadMissions/operator/RowActions/Edit/EditController/index.jsx
+++ b/src/components/dashboard/roadMissions/operator/RowActions/Edit/EditController/index.jsx
@@ -40,13 +40,13 @@ const EditController = ({ row, mutate, openEditDialog, setOpenEditDialog }) => {
end_point: result.end_point,
...(result.type == 1
? {
- start_date: `${result.start_date} ${moment(result.start_time).format("HH:mm")}`,
- end_date: `${result.end_date} ${moment(result.end_time).format("HH:mm")}`,
- }
+ start_date: `${result.start_date} ${moment(result.start_time).format("HH:mm")}`,
+ end_date: `${result.end_date} ${moment(result.end_time).format("HH:mm")}`,
+ }
: {
- start_date: result.start_date,
- end_date: result.end_date,
- }),
+ start_date: result.start_date,
+ end_date: result.end_date,
+ }),
},
hasSidebarUpdate: true,
notificationSuccess: true,
@@ -55,7 +55,7 @@ const EditController = ({ row, mutate, openEditDialog, setOpenEditDialog }) => {
mutate();
setOpenEditDialog(false);
})
- .catch((error) => { })
+ .catch((error) => {})
.finally(() => {
setSubmitting(false);
});
diff --git a/src/core/components/NotificationDesign/AskForKeepData.jsx b/src/core/components/NotificationDesign/AskForKeepData.jsx
index e6fa9f3..7bedb50 100644
--- a/src/core/components/NotificationDesign/AskForKeepData.jsx
+++ b/src/core/components/NotificationDesign/AskForKeepData.jsx
@@ -13,7 +13,7 @@ function filterFalseValues(obj) {
for (const [key, value] of Object.entries(obj)) {
if (value === false) {
result[key] = false;
- } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
+ } else if (typeof value === "object" && value !== null && !Array.isArray(value)) {
const nested = filterFalseValues(value);
if (Object.keys(nested).length > 0) {
result[key] = nested;
diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js
index 7a3c1ea..acffb1d 100644
--- a/src/core/utils/pageMenu.js
+++ b/src/core/utils/pageMenu.js
@@ -103,7 +103,11 @@ export const pageMenu = [
label: "کارتابل",
type: "page",
route: "/dashboard/road-missions/operator",
- permissions: ["manage-request-portal-country", "manage-request-portal-province", "manage-request-portal-city"],
+ permissions: [
+ "manage-request-portal-country",
+ "manage-request-portal-province",
+ "manage-request-portal-city",
+ ],
},
{
id: "roadMissionsManagemnetNaqlie",
diff --git a/src/core/utils/pageMenuDev.js b/src/core/utils/pageMenuDev.js
index 74977f9..63c4ac1 100644
--- a/src/core/utils/pageMenuDev.js
+++ b/src/core/utils/pageMenuDev.js
@@ -1,28 +1,29 @@
-import SpaceDashboardIcon from "@mui/icons-material/SpaceDashboard";
-import GroupsIcon from "@mui/icons-material/Groups";
+import { Mediation } from "@mui/icons-material";
import AccountTreeIcon from "@mui/icons-material/AccountTree";
-import FactCheckIcon from "@mui/icons-material/FactCheck";
-import FireTruckIcon from "@mui/icons-material/FireTruck";
-import RouteIcon from "@mui/icons-material/Route";
-import DoorbellIcon from "@mui/icons-material/Doorbell";
-import ElectricBoltIcon from "@mui/icons-material/ElectricBolt";
-import CottageIcon from "@mui/icons-material/Cottage";
-import GppMaybeIcon from "@mui/icons-material/GppMaybe";
-import GavelIcon from "@mui/icons-material/Gavel";
-import BallotIcon from "@mui/icons-material/Ballot";
-import AssistantIcon from "@mui/icons-material/Assistant";
import AdminPanelSettingsIcon from "@mui/icons-material/AdminPanelSettings";
-import MapIcon from "@mui/icons-material/Map";
-import SpeedIcon from "@mui/icons-material/Speed";
-import EngineeringIcon from "@mui/icons-material/Engineering";
import AssessmentIcon from "@mui/icons-material/Assessment";
import AssignmentLateIcon from "@mui/icons-material/AssignmentLate";
-import LockPersonIcon from "@mui/icons-material/LockPerson";
-import LineAxisIcon from "@mui/icons-material/LineAxis";
-import ScienceIcon from "@mui/icons-material/Science";
-import DriveEtaIcon from "@mui/icons-material/DriveEta";
+import AssistantIcon from "@mui/icons-material/Assistant";
+import BallotIcon from "@mui/icons-material/Ballot";
import BiotechIcon from "@mui/icons-material/Biotech";
-import { Mediation } from "@mui/icons-material";
+import CottageIcon from "@mui/icons-material/Cottage";
+import DoorbellIcon from "@mui/icons-material/Doorbell";
+import DriveEtaIcon from "@mui/icons-material/DriveEta";
+import ElectricBoltIcon from "@mui/icons-material/ElectricBolt";
+import EngineeringIcon from "@mui/icons-material/Engineering";
+import FactCheckIcon from "@mui/icons-material/FactCheck";
+import FireTruckIcon from "@mui/icons-material/FireTruck";
+import GavelIcon from "@mui/icons-material/Gavel";
+import GppMaybeIcon from "@mui/icons-material/GppMaybe";
+import GroupsIcon from "@mui/icons-material/Groups";
+import HandymanIcon from "@mui/icons-material/Handyman";
+import LineAxisIcon from "@mui/icons-material/LineAxis";
+import LockPersonIcon from "@mui/icons-material/LockPerson";
+import MapIcon from "@mui/icons-material/Map";
+import RouteIcon from "@mui/icons-material/Route";
+import ScienceIcon from "@mui/icons-material/Science";
+import SpaceDashboardIcon from "@mui/icons-material/SpaceDashboard";
+import SpeedIcon from "@mui/icons-material/Speed";
export const pageMenuDev = [
{
@@ -102,7 +103,11 @@ export const pageMenuDev = [
label: "کارتابل",
type: "page",
route: "/dashboard/road-missions/operator",
- permissions: ["manage-request-portal-country", "manage-request-portal-province", "manage-request-portal-city"],
+ permissions: [
+ "manage-request-portal-country",
+ "manage-request-portal-province",
+ "manage-request-portal-city",
+ ],
},
{
id: "roadMissionsManagemnetNaqlie",
@@ -535,6 +540,14 @@ export const pageMenuDev = [
icon: ,
permissions: ["azmayesh-type-management"],
},
+ {
+ id: "rahdaran",
+ label: "راهداران",
+ type: "page",
+ route: "/dashboard/rahdaran",
+ icon: ,
+ permissions: ["all"],
+ },
{
id: "adminManagement",
label: "مدیریت سامانه",
@@ -572,7 +585,7 @@ export const pageMenuDev = [
type: "page",
route: "/dashboard/car-details",
icon: ,
- permissions: [""],
+ permissions: ["show-rahdaran"],
},
],
},
diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js
index 741127c..d65335c 100644
--- a/src/core/utils/routes.js
+++ b/src/core/utils/routes.js
@@ -191,3 +191,9 @@ export const START_MISSION = api + "/api/v3/missions/control_unit/start";
export const FINISH_MISSION = api + "/api/v3/missions/control_unit/finish";
export const GET_MACHINES_TABLE_LIST = api + "/api/v3/cmms_machines";
+
+// rahdaran
+export const GET_RAHDARAN_TABLE_LIST = api + "/api/v3/rahdaran";
+export const DELETE_RAHDARAN_ITEM = api + "/api/v3/rahdaran";
+export const UPDATE_RAHDARAN_ITEM = api + "/api/v3/rahdaran";
+export const CREATE_RAHDARAN_ITEM = api + "/api/v3/rahdaran";