diff --git a/src/app/(withAuth)/dashboard/permission-table/page.js b/src/app/(withAuth)/dashboard/permissions/page.js
similarity index 100%
rename from src/app/(withAuth)/dashboard/permission-table/page.js
rename to src/app/(withAuth)/dashboard/permissions/page.js
diff --git a/src/app/(withAuth)/dashboard/user-activities/page.js b/src/app/(withAuth)/dashboard/user-activities/page.js
new file mode 100644
index 0000000..64f91e7
--- /dev/null
+++ b/src/app/(withAuth)/dashboard/user-activities/page.js
@@ -0,0 +1,13 @@
+import UserActivitiesPage from "@/components/dashboard/userActivities";
+import WithPermission from "@/core/middlewares/withPermission";
+export const metadata = {
+ title: "انواع فعالیت کاربران",
+};
+const Page = () => {
+ return (
+
+
+
+ );
+};
+export default Page;
diff --git a/src/components/dashboard/fastReact/complaintList/index.jsx b/src/components/dashboard/fastReact/complaintList/index.jsx
index 5c3edc6..cf2fb55 100644
--- a/src/components/dashboard/fastReact/complaintList/index.jsx
+++ b/src/components/dashboard/fastReact/complaintList/index.jsx
@@ -1,10 +1,13 @@
-import { Button, IconButton, useMediaQuery } from "@mui/material";
+import { Badge, Button, IconButton, useMediaQuery } from "@mui/material";
import ChecklistIcon from "@mui/icons-material/Checklist";
import { useTheme } from "@emotion/react";
import { useState } from "react";
import ComplaintListTable from "./ComplaintListTable";
+import { useSidebarBadge } from "@/lib/hooks/useSidebarBadge";
+import { getValueByPath } from "@/core/utils/getValueByPath";
const ComplaintList = ({ mutate }) => {
+ const { data } = useSidebarBadge();
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down("sm"));
const [open, setOpen] = useState(false);
@@ -19,15 +22,21 @@ const ComplaintList = ({ mutate }) => {
) : (
- }
- onClick={handleOpen}
+
- لیست شکایات
-
+ }
+ onClick={handleOpen}
+ >
+ لیست شکایات
+
+
)}
>
diff --git a/src/components/dashboard/fastReact/operator/OperatorList.jsx b/src/components/dashboard/fastReact/operator/OperatorList.jsx
index 867e15f..9b90b29 100644
--- a/src/components/dashboard/fastReact/operator/OperatorList.jsx
+++ b/src/components/dashboard/fastReact/operator/OperatorList.jsx
@@ -10,6 +10,7 @@ import DescriptionForm from "./RowActions/DescriptionDialog";
import ImageDialog from "./RowActions/ImageDialog";
import LocationForm from "./RowActions/LocationDialog";
import Toolbar from "./Toolbar";
+import BlinkingCell from "@/core/components/BlinkingCell";
const OperatorList = () => {
const statusOptions = [
@@ -32,6 +33,7 @@ const OperatorList = () => {
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
+ Cell: ({ row }) => ,
},
{
header: "اطلاعات ثبت شده در سامانه سوانح",
diff --git a/src/components/dashboard/fastReact/supervisor/SupervisorList.jsx b/src/components/dashboard/fastReact/supervisor/SupervisorList.jsx
index 09ab0e3..65525cc 100644
--- a/src/components/dashboard/fastReact/supervisor/SupervisorList.jsx
+++ b/src/components/dashboard/fastReact/supervisor/SupervisorList.jsx
@@ -15,6 +15,7 @@ import LocationForm from "./RowActions/LocationDialog";
import EngineeringIcon from "@mui/icons-material/Engineering";
import ThreePIcon from "@mui/icons-material/ThreeP";
import ImageDialog from "./RowActions/ImageDialog";
+import BlinkingCell from "@/core/components/BlinkingCell";
const SupervisorList = () => {
const { data: userPermissions } = usePermissions();
@@ -75,6 +76,7 @@ const SupervisorList = () => {
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
+ Cell: ({ row }) => ,
},
...(hasCountryPermission ? [dynamicColumns] : []),
{
diff --git a/src/components/dashboard/permissionTable/Actions/Create/Form/CreateFormContent.jsx b/src/components/dashboard/permissionTable/Actions/Create/Form/CreateFormContent.jsx
index 3a84a08..6cb55e8 100644
--- a/src/components/dashboard/permissionTable/Actions/Create/Form/CreateFormContent.jsx
+++ b/src/components/dashboard/permissionTable/Actions/Create/Form/CreateFormContent.jsx
@@ -18,7 +18,6 @@ import PersianTextField from "@/core/components/PersianTextField";
const validationSchema = object({
name: string().required("وارد کردن نام انگلیسی الزامیست!"),
name_fa: string().required("وارد کردن نام فارسی الزامیست!"),
- description: string().required("وارد کردن توضیحات الزامیست!"),
type: string().required("وارد کردن گروه (انگلیسی) الزامیست!"),
type_fa: string().required("وارد کردن گروه (فارسی) الزامیست!"),
});
diff --git a/src/components/dashboard/permissionTable/Actions/Edit/EditController.jsx b/src/components/dashboard/permissionTable/Actions/Edit/EditController.jsx
index b5ff432..d2baab2 100644
--- a/src/components/dashboard/permissionTable/Actions/Edit/EditController.jsx
+++ b/src/components/dashboard/permissionTable/Actions/Edit/EditController.jsx
@@ -37,7 +37,7 @@ const EditController = ({ rowId, mutate, setOpen, row }) => {
return (
<>
- ویرایش سطح دسترسی جدید
+ ویرایش سطح دسترسی
>
diff --git a/src/components/dashboard/roadItems/operator/OperatorList.jsx b/src/components/dashboard/roadItems/operator/OperatorList.jsx
index c895111..352fe65 100644
--- a/src/components/dashboard/roadItems/operator/OperatorList.jsx
+++ b/src/components/dashboard/roadItems/operator/OperatorList.jsx
@@ -1,4 +1,5 @@
"use client";
+import BlinkingCell from "@/core/components/BlinkingCell";
import CustomSelectByDependency from "@/core/components/DataTable/filter/fieldsType/CustomSelectByDependency";
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
import { GET_ROAD_ITEMS_OPERATOR_LIST } from "@/core/utils/routes";
@@ -8,12 +9,12 @@ import { Box, Stack, Typography } from "@mui/material";
import moment from "jalali-moment";
import { useEffect, useMemo, useState } from "react";
import RowActions from "./RowActions";
+import DescriptionForm from "./RowActions/DescriptionForm";
import ImageDialog from "./RowActions/ImageForm";
import LocationForm from "./RowActions/LocationForm";
+import MachinesCodeDialog from "./RowActions/MachinesCodeForm";
import RahdaranDialog from "./RowActions/RahdaranForm";
import Toolbar from "./Toolbar";
-import DescriptionForm from "./RowActions/DescriptionForm";
-import MachinesCodeDialog from "./RowActions/MachinesCodeForm";
const OperatorList = () => {
const statusOptions = [
@@ -25,7 +26,6 @@ const OperatorList = () => {
const columns = useMemo(
() => [
{
- accessorKey: "id",
header: "کد یکتا",
id: "id",
enableColumnFilter: true,
@@ -34,6 +34,7 @@ const OperatorList = () => {
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
+ Cell: ({ row }) => ,
},
{
header: "اطلاعات فعالیت",
diff --git a/src/components/dashboard/roadItems/supervisor/SupervisorList.jsx b/src/components/dashboard/roadItems/supervisor/SupervisorList.jsx
index a8fc3be..b2049cd 100644
--- a/src/components/dashboard/roadItems/supervisor/SupervisorList.jsx
+++ b/src/components/dashboard/roadItems/supervisor/SupervisorList.jsx
@@ -1,21 +1,22 @@
-import { useEffect, useMemo, useState } from "react";
-import { Box, Stack, Typography } from "@mui/material";
+import BlinkingCell from "@/core/components/BlinkingCell";
+import CustomSelectByDependency from "@/core/components/DataTable/filter/fieldsType/CustomSelectByDependency";
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
-import Toolbar from "./Toolbar";
import { GET_ROAD_ITEMS_SUPERVISOR_LIST } from "@/core/utils/routes";
+import { useAuth } from "@/lib/contexts/auth";
+import useEdaratLists from "@/lib/hooks/useEdaratLists";
+import { usePermissions } from "@/lib/hooks/usePermissions";
+import useProvinces from "@/lib/hooks/useProvince";
+import useRoadItemGetSubItems from "@/lib/hooks/useRoadItemGetISubtems";
+import useRoadItemGetItems from "@/lib/hooks/useRoadItemGetItems";
+import { Box, Stack, Typography } from "@mui/material";
import moment from "jalali-moment";
+import { useEffect, useMemo, useState } from "react";
+import ImageDialog from "../operator/RowActions/ImageForm";
+import MachinesCodeDialog from "../operator/RowActions/MachinesCodeForm";
+import RahdaranDialog from "../operator/RowActions/RahdaranForm";
import RowActions from "./RowActions";
import LocationForm from "./RowActions/LocationForm";
-import ImageDialog from "../operator/RowActions/ImageForm";
-import RahdaranDialog from "../operator/RowActions/RahdaranForm";
-import CustomSelectByDependency from "@/core/components/DataTable/filter/fieldsType/CustomSelectByDependency";
-import useProvinces from "@/lib/hooks/useProvince";
-import useRoadItemGetItems from "@/lib/hooks/useRoadItemGetItems";
-import useRoadItemGetSubItems from "@/lib/hooks/useRoadItemGetISubtems";
-import useEdaratLists from "@/lib/hooks/useEdaratLists";
-import MachinesCodeDialog from "../operator/RowActions/MachinesCodeForm";
-import { usePermissions } from "@/lib/hooks/usePermissions";
-import { useAuth } from "@/lib/contexts/auth";
+import Toolbar from "./Toolbar";
const SupervisorList = () => {
const statusOptions = [
@@ -65,8 +66,8 @@ const SupervisorList = () => {
};
return [
{
- accessorKey: "id",
- header: "کد یکتا", // Unique Code
+ // accessorKey: "id",
+ header: "کد یکتا",
id: "id",
enableColumnFilter: true,
datatype: "text",
@@ -75,6 +76,7 @@ const SupervisorList = () => {
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
+ Cell: ({ row }) => ,
},
...(hasCountryPermission ? [dynamicColumns] : []),
{
diff --git a/src/components/dashboard/userActivities/Actions/Create/Form/ActionTypeList.jsx b/src/components/dashboard/userActivities/Actions/Create/Form/ActionTypeList.jsx
new file mode 100644
index 0000000..0732896
--- /dev/null
+++ b/src/components/dashboard/userActivities/Actions/Create/Form/ActionTypeList.jsx
@@ -0,0 +1,38 @@
+import { FormControl, FormHelperText, InputLabel, MenuItem, OutlinedInput, Select } from "@mui/material";
+
+const ActionTypeList = ({ value, onChange, error }) => {
+ const statusOptions = [
+ { value: "show", label: "show" },
+ { value: "add", label: "add" },
+ { value: "edit", label: "edit" },
+ { value: "delete", label: "delete" },
+ { value: "report", label: "report" },
+ { value: "action", label: "action" },
+ ];
+
+ return (
+
+
+ نوع فعالیت
+
+ }
+ size="small"
+ onChange={(e) => onChange(e.target.value)}
+ displayEmpty
+ >
+ {statusOptions.map((option) => (
+
+ ))}
+
+ {error && {error.message}}
+
+ );
+};
+export default ActionTypeList;
diff --git a/src/components/dashboard/userActivities/Actions/Create/Form/CreateFormContent.jsx b/src/components/dashboard/userActivities/Actions/Create/Form/CreateFormContent.jsx
new file mode 100644
index 0000000..2898404
--- /dev/null
+++ b/src/components/dashboard/userActivities/Actions/Create/Form/CreateFormContent.jsx
@@ -0,0 +1,98 @@
+import PersianTextField from "@/core/components/PersianTextField";
+import StyledForm from "@/core/components/StyledForm";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { Beenhere, ExitToApp } from "@mui/icons-material";
+import { Button, DialogActions, DialogContent, Stack, TextField } from "@mui/material";
+import { Controller, useForm } from "react-hook-form";
+import { object, string } from "yup";
+import ActionTypeList from "./ActionTypeList";
+
+const validationSchema = object({
+ title: string().required("وارد کردن عنوان الزامیست!"),
+ log_unique_code: string().required("وارد کردن کد الزامیست!"),
+ action_type: string().required("وارد کردن نوع فعالیت الزامیست!"),
+});
+
+const CreateFormContent = ({ setOpen, defaultValues, onSubmitBase }) => {
+ const {
+ control,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = useForm({
+ defaultValues,
+ resolver: yupResolver(validationSchema),
+ mode: "onBlur",
+ });
+ const handleOnSubmit = async (data) => {
+ await onSubmitBase(data);
+ };
+
+ return (
+ <>
+
+
+
+ (
+
+ )}
+ />
+ (
+
+ )}
+ />
+ (
+
+ )}
+ />
+
+
+
+
+ }>
+ {" "}
+ {isSubmitting ? "در حال ثبت فعالیت کاربران" : "ثبت فعالیت کاربران"}{" "}
+
+
+
+ >
+ );
+};
+export default CreateFormContent;
diff --git a/src/components/dashboard/userActivities/Actions/Create/Form/index.jsx b/src/components/dashboard/userActivities/Actions/Create/Form/index.jsx
new file mode 100644
index 0000000..5275391
--- /dev/null
+++ b/src/components/dashboard/userActivities/Actions/Create/Form/index.jsx
@@ -0,0 +1,58 @@
+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_USER_ACTIVITY } 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 = {
+ title: "",
+ log_unique_code: "",
+ action_type: "",
+ };
+ const onSubmit = async (result) => {
+ const formData = new FormData();
+ formData.append("description", result.title);
+ formData.append("log_unique_code", result.log_unique_code);
+ formData.append("action_type", result.action_type);
+ await requestServer(CREATE_USER_ACTIVITY, "post", {
+ data: formData,
+ })
+ .then(() => {
+ mutate();
+ setOpen(false);
+ })
+ .catch(() => {});
+ };
+ return (
+
+ );
+};
+export default CreateForm;
diff --git a/src/components/dashboard/userActivities/Actions/Create/index.jsx b/src/components/dashboard/userActivities/Actions/Create/index.jsx
new file mode 100644
index 0000000..b26543a
--- /dev/null
+++ b/src/components/dashboard/userActivities/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 CreateUserActivity = ({ 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 CreateUserActivity;
diff --git a/src/components/dashboard/userActivities/Actions/Edit/EditController.jsx b/src/components/dashboard/userActivities/Actions/Edit/EditController.jsx
new file mode 100644
index 0000000..0486691
--- /dev/null
+++ b/src/components/dashboard/userActivities/Actions/Edit/EditController.jsx
@@ -0,0 +1,38 @@
+import useRequest from "@/lib/hooks/useRequest";
+import CreateFormContent from "../Create/Form/CreateFormContent";
+import { UPDATE_USER_ACTIVITY } from "@/core/utils/routes";
+import { DialogTitle } from "@mui/material";
+import { DialogHeader } from "next/dist/client/components/react-dev-overlay/internal/components/Dialog";
+
+const EditController = ({ rowId, mutate, setOpen, row }) => {
+ const requestServer = useRequest({ notificationSuccess: true });
+
+ const defaultData = {
+ title: row.original?.description || "",
+ log_unique_code: row.original?.log_unique_code || "",
+ action_type: row.original?.action_type || "",
+ };
+ const handleSubmit = async (result) => {
+ const formData = new FormData();
+ formData.append("description", result.title);
+ formData.append("log_unique_code", result.log_unique_code);
+ formData.append("action_type", result.action_type);
+ await requestServer(`${UPDATE_USER_ACTIVITY}/${rowId}`, "post", {
+ data: formData,
+ })
+ .then(() => {
+ mutate();
+ setOpen(false);
+ })
+ .catch(() => {});
+ };
+ return (
+ <>
+
+ ویرایش فعالیت کاربران
+
+
+ >
+ );
+};
+export default EditController;
diff --git a/src/components/dashboard/userActivities/Actions/Edit/index.jsx b/src/components/dashboard/userActivities/Actions/Edit/index.jsx
new file mode 100644
index 0000000..ca5f622
--- /dev/null
+++ b/src/components/dashboard/userActivities/Actions/Edit/index.jsx
@@ -0,0 +1,51 @@
+import { useState } from "react";
+import { Dialog, IconButton, Tooltip } from "@mui/material";
+import BorderColorIcon from "@mui/icons-material/BorderColor";
+import CloseIcon from "@mui/icons-material/Close";
+import EditController from "./EditController";
+
+const EditUserActivity = ({ mutate, row, rowId }) => {
+ const [open, setOpen] = useState(false);
+
+ return (
+ <>
+
+ {
+ setOpen(true);
+ }}
+ >
+
+
+
+
+ >
+ );
+};
+export default EditUserActivity;
diff --git a/src/components/dashboard/userActivities/RowActions/DeleteDialog/DeleteContent.jsx b/src/components/dashboard/userActivities/RowActions/DeleteDialog/DeleteContent.jsx
new file mode 100644
index 0000000..159746a
--- /dev/null
+++ b/src/components/dashboard/userActivities/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_USER_ACTIVITIES } 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_USER_ACTIVITIES}/${rowId}`, "delete")
+ .then(() => {
+ mutate();
+ setSubmitting(false);
+ setOpenDeleteDialog(false);
+ })
+ .catch(() => {
+ setSubmitting(false);
+ });
+ };
+ return (
+ <>
+
+
+ آیا از حذف این فعالیت کاربران اطمینان دارید؟
+
+
+
+
+
+
+ >
+ );
+};
+export default DeleteContent;
diff --git a/src/components/dashboard/userActivities/RowActions/DeleteDialog/index.jsx b/src/components/dashboard/userActivities/RowActions/DeleteDialog/index.jsx
new file mode 100644
index 0000000..7cbd3a1
--- /dev/null
+++ b/src/components/dashboard/userActivities/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/userActivities/RowActions/index.jsx b/src/components/dashboard/userActivities/RowActions/index.jsx
new file mode 100644
index 0000000..2f7f578
--- /dev/null
+++ b/src/components/dashboard/userActivities/RowActions/index.jsx
@@ -0,0 +1,12 @@
+import { Box } from "@mui/material";
+import EditUserActivity from "../Actions/Edit";
+import DeleteDialog from "./DeleteDialog";
+const RowActions = ({ row, mutate }) => {
+ return (
+
+
+
+
+ );
+};
+export default RowActions;
diff --git a/src/components/dashboard/userActivities/Toolbar.jsx b/src/components/dashboard/userActivities/Toolbar.jsx
new file mode 100644
index 0000000..7d3ce90
--- /dev/null
+++ b/src/components/dashboard/userActivities/Toolbar.jsx
@@ -0,0 +1,9 @@
+import CreateUserActivity from "./Actions/Create";
+const Toolbar = ({ mutate }) => {
+ return (
+ <>
+
+ >
+ );
+};
+export default Toolbar;
diff --git a/src/components/dashboard/userActivities/UserActivitiesList.jsx b/src/components/dashboard/userActivities/UserActivitiesList.jsx
new file mode 100644
index 0000000..cbdad72
--- /dev/null
+++ b/src/components/dashboard/userActivities/UserActivitiesList.jsx
@@ -0,0 +1,83 @@
+"use client";
+import DataTableWithAuth from "@/core/components/DataTableWithAuth";
+import { GET_USER_ACTIVITIES_LIST } from "@/core/utils/routes";
+import { Box } from "@mui/material";
+import { useMemo } from "react";
+import RowActions from "./RowActions";
+import Toolbar from "./Toolbar";
+
+const UserActivitiesList = () => {
+ const columns = useMemo(
+ () => [
+ {
+ accessorKey: "id",
+ header: "کد یکتا",
+ id: "id",
+ enableColumnFilter: true,
+ datatype: "text",
+ filterMode: "equals",
+ sortDescFirst: false,
+ columnFilterModeOptions: ["equals", "contains"],
+ grow: false,
+ size: 100,
+ },
+ {
+ accessorKey: "description",
+ header: "عنوان",
+ id: "description",
+ enableColumnFilter: true,
+ datatype: "text",
+ filterMode: "equals",
+ sortDescFirst: false,
+ columnFilterModeOptions: ["equals", "contains"],
+ grow: false,
+ size: 100,
+ },
+ {
+ accessorKey: "log_unique_code",
+ header: "کد",
+ id: "log_unique_code",
+ enableColumnFilter: true,
+ datatype: "text",
+ filterMode: "equals",
+ sortDescFirst: false,
+ columnFilterModeOptions: ["equals"],
+ grow: false,
+ size: 100,
+ },
+ {
+ accessorKey: "action_type",
+ header: "نوع فعالیت",
+ id: "action_type",
+ enableColumnFilter: false,
+ datatype: "text",
+ filterMode: "equals",
+ sortDescFirst: false,
+ columnFilterModeOptions: ["equals"],
+ grow: false,
+ size: 100,
+ },
+ ],
+ []
+ );
+
+ return (
+ <>
+
+
+
+ >
+ );
+};
+export default UserActivitiesList;
diff --git a/src/components/dashboard/userActivities/index.jsx b/src/components/dashboard/userActivities/index.jsx
new file mode 100644
index 0000000..321001d
--- /dev/null
+++ b/src/components/dashboard/userActivities/index.jsx
@@ -0,0 +1,13 @@
+import PageTitle from "@/core/components/PageTitle";
+import { Stack } from "@mui/material";
+import UserActivitiesList from "./UserActivitiesList";
+
+const UserActivitiesPage = () => {
+ return (
+
+
+
+
+ );
+};
+export default UserActivitiesPage;
diff --git a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarBadge.jsx b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarBadge.jsx
index 4ee1a83..5f0fa7a 100644
--- a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarBadge.jsx
+++ b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarBadge.jsx
@@ -14,6 +14,6 @@ const SidebarBadge = ({ badge, chipProps = {} }) => {
if (!data) return null;
if (!value) return null;
- return ;
+ return ;
};
export default SidebarBadge;
diff --git a/src/core/components/BlinkingCell.jsx b/src/core/components/BlinkingCell.jsx
new file mode 100644
index 0000000..3b1eed2
--- /dev/null
+++ b/src/core/components/BlinkingCell.jsx
@@ -0,0 +1,12 @@
+import { Box, Stack } from "@mui/material";
+import BlinkingCircle from "./BlinkingCircle";
+
+const BlinkingCell = ({ visible = false, value }) => {
+ return (
+
+ {value}
+ {visible && }
+
+ );
+};
+export default BlinkingCell;
diff --git a/src/core/components/BlinkingCircle.jsx b/src/core/components/BlinkingCircle.jsx
new file mode 100644
index 0000000..0d377e1
--- /dev/null
+++ b/src/core/components/BlinkingCircle.jsx
@@ -0,0 +1,24 @@
+import { keyframes } from "@emotion/react";
+import { Box } from "@mui/material";
+
+const blink = keyframes`
+ 0% { opacity: 1; }
+ 50% { opacity: 0.3; }
+ 100% { opacity: 1; }
+`;
+
+const BlinkingCircle = () => {
+ return (
+ theme.palette.warning.main,
+ animation: `${blink} 1.3s infinite ease-in-out`,
+ }}
+ />
+ );
+};
+
+export default BlinkingCircle;
diff --git a/src/core/utils/errorResponse.js b/src/core/utils/errorResponse.js
index 5de1e77..2a147ed 100644
--- a/src/core/utils/errorResponse.js
+++ b/src/core/utils/errorResponse.js
@@ -56,7 +56,7 @@ const errorClient = (response, notification, toastContainer, logout) => {
};
export const errorResponse = (response, notification, toastContainer, logout) => {
- if (notification) toast.dismiss({ container: toastContainer });
+ if (notification) toast.dismiss({ containerId: toastContainer });
if (isServerError(response.status)) {
errorServer(response, notification, toastContainer);
} else if (isClientError(response.status)) {
diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js
index f6d458a..5be659e 100644
--- a/src/core/utils/pageMenu.js
+++ b/src/core/utils/pageMenu.js
@@ -95,7 +95,7 @@ export const pageMenu = [
type: "menu",
icon: ,
hasSubitems: true,
- badges: ["road_items.total"],
+ badges: ["roadItem.total"],
Subitems: [
{
id: "roadItemManagmentSupervisor",
@@ -103,7 +103,7 @@ export const pageMenu = [
type: "menu",
icon: ,
hasSubitems: true,
- badges: ["road_items.supervise_cnt"],
+ badges: ["roadItem.supervise_cnt"],
Subitems: [
{
id: "roadItemManagmentSupervisorCartable",
@@ -123,7 +123,7 @@ export const pageMenu = [
type: "menu",
icon: ,
hasSubitems: true,
- badges: ["road_items.operation_cnt"],
+ badges: ["roadItem.operation_cnt"],
Subitems: [
{
id: "roadItemManagmentOparationCartable",
@@ -185,7 +185,6 @@ export const pageMenu = [
type: "menu",
icon: ,
hasSubitems: true,
- badges: ["road_patrols.total"],
Subitems: [
{
id: "roadPatrolManagmentSupervisor",
@@ -193,7 +192,6 @@ export const pageMenu = [
type: "menu",
icon: ,
hasSubitems: true,
- badges: ["road_patrols.supervise_cnt"],
Subitems: [
{
id: "roadPatrolManagmentSupervisorCartable",
@@ -213,7 +211,6 @@ export const pageMenu = [
type: "menu",
icon: ,
hasSubitems: true,
- badges: ["road_patrols.operation_cnt"],
Subitems: [
{
id: "roadPatrolManagmentOparationCartable",
@@ -293,7 +290,7 @@ export const pageMenu = [
type: "menu",
icon: ,
hasSubitems: true,
- badges: ["safety_and_privacy.step_one", "safety_and_privacy.step_two"],
+ badges: ["safetyAndPrivacy.step_one", "safetyAndPrivacy.step_two"],
Subitems: [
{
id: "safetyAndPrivacyManagmentOparation",
@@ -347,7 +344,7 @@ export const pageMenu = [
type: "menu",
icon: ,
hasSubitems: true,
- badges: ["road_observations.total"],
+ badges: ["roadObserved.total"],
Subitems: [
{
id: "roadObservationsManagmentSupervisor",
@@ -355,7 +352,7 @@ export const pageMenu = [
type: "menu",
icon: ,
hasSubitems: true,
- badges: ["road_observations.supervise_cnt"],
+ badges: ["roadObserved.supervise_cnt", "roadObserved.complaint_cnt"],
Subitems: [
{
id: "roadObservationsManagmentSupervisorCartable",
@@ -372,7 +369,7 @@ export const pageMenu = [
type: "menu",
icon: ,
hasSubitems: true,
- badges: ["road_observations.operation_cnt"],
+ badges: ["roadObserved.operation_cnt", "roadObserved.complaint_cnt"],
Subitems: [
{
id: "roadObservationsManagmentOparationCartable",
@@ -495,10 +492,18 @@ export const pageMenu = [
id: "permissionItem",
label: "سطح دسترسی ها",
type: "page",
- route: "/dashboard/permission-table",
+ route: "/dashboard/permissions",
icon: ,
permissions: ["show-permissions-page"],
},
+ {
+ id: "userActivities",
+ label: "انواع فعالیت کاربران",
+ type: "page",
+ route: "/dashboard/user-activities",
+ icon: ,
+ permissions: ["show-user-activities-page"],
+ },
{
id: "CarDetails",
label: "اطلاعات خودرو",
diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js
index 7cfb764..36947c4 100644
--- a/src/core/utils/routes.js
+++ b/src/core/utils/routes.js
@@ -6,7 +6,7 @@ export const UPDATE_USER_ROUTE = api + "/api/v3/profile/edit";
export const CHANGE_USER_PASSWORD = api + "/api/v3/profile/change_password";
export const GET_LOGIN_ROUTE = api + "/login_dev";
export const GET_PERMISSIONS_ROUTE = api + "/webapi/user/get-permission";
-export const GET_SIDEBAR_BADGE_ROUTE = api + "/v2/activity_statistics";
+export const GET_SIDEBAR_BADGE_ROUTE = api + "/api/v3/notifications";
export const REFER_ADMIN_PROVINCE = "/v3/api/fake-submit";
export const REFER_ADMIN_CITY = "/v3/api/fake-submit";
export const GET_CITY_LISTS = "/v3/api/fake-cities";
@@ -140,8 +140,14 @@ export const EXPORT_OPERATOR_ROAD_SAFETY = api + "/api/v3/safety_and_privacy/exc
export const GET_ROAD_SAFETY_PROVINCE_ACTIVITY_REPORT = api + "/api/v3/safety_and_privacy_report/country_activity";
export const GET_ROAD_SAFETY_CITY_ACTIVITY_REPORT = api + "/api/v3/safety_and_privacy_report/province_activity";
-//permission table
+// permission table
export const GET_PERMISSION_TABLE_LIST = api + "/api/v3/permissions";
export const DELETE_PERMISSION = api + "/api/v3/permissions";
export const UPDATE_PERMISSION = api + "/api/v3/permissions";
export const CREATE_PERMISSION = api + "/api/v3/permissions";
+
+// user activities
+export const GET_USER_ACTIVITIES_LIST = api + "/api/v3/log_list";
+export const CREATE_USER_ACTIVITY = api + "/api/v3/log_list";
+export const UPDATE_USER_ACTIVITY = api + "/api/v3/log_list";
+export const DELETE_USER_ACTIVITIES = api + "/api/v3/log_list";
diff --git a/src/core/utils/successRequest.js b/src/core/utils/successRequest.js
index b06d83d..7fbde71 100644
--- a/src/core/utils/successRequest.js
+++ b/src/core/utils/successRequest.js
@@ -4,7 +4,7 @@ import { successToast } from "@/core/components/Toasts/success";
export const successRequest = (notification, toastContainer) => {
if (notification) {
- toast.dismiss({ container: toastContainer });
+ toast.dismiss({ containerId: toastContainer });
successToast(toastContainer);
}
};
diff --git a/src/lib/hooks/useSidebarBadge.js b/src/lib/hooks/useSidebarBadge.js
index 29e5fed..994cf21 100644
--- a/src/lib/hooks/useSidebarBadge.js
+++ b/src/lib/hooks/useSidebarBadge.js
@@ -8,7 +8,7 @@ export const useSidebarBadge = () => {
const fetcher = async (url) => {
try {
const response = await request(url);
- return response.data;
+ return response.data.data;
} catch (error) {
throw new Error();
}