From fb84d5a188accd305f3d3921fea1f91c8223a7a2 Mon Sep 17 00:00:00 2001 From: baslani Date: Sun, 13 Jul 2025 16:51:43 +0330 Subject: [PATCH] implemented rahdaran's page --- .../dashboard/rahdaran/page.js | 10 ++ .../dashboard/road-missions/operator/page.js | 8 +- .../Actions/Create/Form/CreateFormContent.jsx | 105 ++++++++++++++++++ .../rahdaran/Actions/Create/Form/index.jsx | 57 ++++++++++ .../rahdaran/Actions/Create/index.jsx | 36 ++++++ .../rahdaran/Actions/Edit/EditController.jsx | 37 ++++++ .../dashboard/rahdaran/Actions/Edit/index.jsx | 51 +++++++++ .../dashboard/rahdaran/RahdaranList.jsx | 69 ++++++++++++ .../RowActions/DeleteDialog/DeleteContent.jsx | 39 +++++++ .../RowActions/DeleteDialog/index.jsx | 34 ++++++ .../dashboard/rahdaran/RowActions/index.jsx | 12 ++ src/components/dashboard/rahdaran/Toolbar.jsx | 9 ++ src/components/dashboard/rahdaran/index.jsx | 13 +++ .../operator/Actions/Create/index.jsx | 14 +-- .../RowActions/Edit/EditController/index.jsx | 14 +-- .../NotificationDesign/AskForKeepData.jsx | 2 +- src/core/utils/pageMenu.js | 6 +- src/core/utils/pageMenuDev.js | 57 ++++++---- src/core/utils/routes.js | 6 + 19 files changed, 540 insertions(+), 39 deletions(-) create mode 100644 src/app/(withAuth)/(dashboardLayout)/dashboard/rahdaran/page.js create mode 100644 src/components/dashboard/rahdaran/Actions/Create/Form/CreateFormContent.jsx create mode 100644 src/components/dashboard/rahdaran/Actions/Create/Form/index.jsx create mode 100644 src/components/dashboard/rahdaran/Actions/Create/index.jsx create mode 100644 src/components/dashboard/rahdaran/Actions/Edit/EditController.jsx create mode 100644 src/components/dashboard/rahdaran/Actions/Edit/index.jsx create mode 100644 src/components/dashboard/rahdaran/RahdaranList.jsx create mode 100644 src/components/dashboard/rahdaran/RowActions/DeleteDialog/DeleteContent.jsx create mode 100644 src/components/dashboard/rahdaran/RowActions/DeleteDialog/index.jsx create mode 100644 src/components/dashboard/rahdaran/RowActions/index.jsx create mode 100644 src/components/dashboard/rahdaran/Toolbar.jsx create mode 100644 src/components/dashboard/rahdaran/index.jsx 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 ( + <> + + + + + + + ( + + )} + /> + + + + + + + ( + + )} + /> + + + + + + + + + + + + ); +}; +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 ( + + setOpen(false)} + sx={(theme) => ({ + position: "absolute", + right: 8, + top: 8, + zIndex: 50, + color: theme.palette.grey[500], + })} + > + + + + ثبت راهدار جدید + + {open && ( + + )} + + ); +}; +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 ? ( + + + + ) : ( + + )} + + + ); +}; +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); + }} + > + + + + + setOpen(false)} + sx={(theme) => ({ + position: "absolute", + right: 8, + top: 8, + zIndex: 50, + color: theme.palette.grey[500], + })} + > + + + {open && } + + + ); +}; +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)}> + + + + setOpenDeleteDialog(false)} + PaperProps={{ + sx: { + boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px", + }, + }} + dir="rtl" + maxWidth={"md"} + > + حذف راهدار + {openDeleteDialog && ( + + )} + + + ); +}; +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";