From 87f1a520eaa9ea7316f628cce7b4ebffb20d273b Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Sun, 9 Mar 2025 11:41:52 +0000 Subject: [PATCH] Feature/add user activiry crud --- .../{permission-table => permissions}/page.js | 0 .../dashboard/user-activities/page.js | 13 +++ .../fastReact/complaintList/index.jsx | 27 +++-- .../fastReact/operator/OperatorList.jsx | 2 + .../fastReact/supervisor/SupervisorList.jsx | 2 + .../Actions/Create/Form/CreateFormContent.jsx | 1 - .../Actions/Edit/EditController.jsx | 2 +- .../roadItems/operator/OperatorList.jsx | 7 +- .../roadItems/supervisor/SupervisorList.jsx | 32 +++--- .../Actions/Create/Form/ActionTypeList.jsx | 38 +++++++ .../Actions/Create/Form/CreateFormContent.jsx | 98 +++++++++++++++++++ .../Actions/Create/Form/index.jsx | 58 +++++++++++ .../userActivities/Actions/Create/index.jsx | 36 +++++++ .../Actions/Edit/EditController.jsx | 38 +++++++ .../userActivities/Actions/Edit/index.jsx | 51 ++++++++++ .../RowActions/DeleteDialog/DeleteContent.jsx | 39 ++++++++ .../RowActions/DeleteDialog/index.jsx | 34 +++++++ .../userActivities/RowActions/index.jsx | 12 +++ .../dashboard/userActivities/Toolbar.jsx | 9 ++ .../userActivities/UserActivitiesList.jsx | 83 ++++++++++++++++ .../dashboard/userActivities/index.jsx | 13 +++ .../Sidebar/SidebarBadge.jsx | 2 +- src/core/components/BlinkingCell.jsx | 12 +++ src/core/components/BlinkingCircle.jsx | 24 +++++ src/core/utils/errorResponse.js | 2 +- src/core/utils/pageMenu.js | 27 ++--- src/core/utils/routes.js | 10 +- src/core/utils/successRequest.js | 2 +- src/lib/hooks/useSidebarBadge.js | 2 +- 29 files changed, 630 insertions(+), 46 deletions(-) rename src/app/(withAuth)/dashboard/{permission-table => permissions}/page.js (100%) create mode 100644 src/app/(withAuth)/dashboard/user-activities/page.js create mode 100644 src/components/dashboard/userActivities/Actions/Create/Form/ActionTypeList.jsx create mode 100644 src/components/dashboard/userActivities/Actions/Create/Form/CreateFormContent.jsx create mode 100644 src/components/dashboard/userActivities/Actions/Create/Form/index.jsx create mode 100644 src/components/dashboard/userActivities/Actions/Create/index.jsx create mode 100644 src/components/dashboard/userActivities/Actions/Edit/EditController.jsx create mode 100644 src/components/dashboard/userActivities/Actions/Edit/index.jsx create mode 100644 src/components/dashboard/userActivities/RowActions/DeleteDialog/DeleteContent.jsx create mode 100644 src/components/dashboard/userActivities/RowActions/DeleteDialog/index.jsx create mode 100644 src/components/dashboard/userActivities/RowActions/index.jsx create mode 100644 src/components/dashboard/userActivities/Toolbar.jsx create mode 100644 src/components/dashboard/userActivities/UserActivitiesList.jsx create mode 100644 src/components/dashboard/userActivities/index.jsx create mode 100644 src/core/components/BlinkingCell.jsx create mode 100644 src/core/components/BlinkingCircle.jsx 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 }) => { ) : ( - + + )} 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 ( + + + نوع فعالیت + + + {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 ( + <> + + + + ( + + )} + /> + ( + + )} + /> + ( + + )} + /> + + + + + + + + + ); +}; +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 ( + + 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/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 ? ( + + + + ) : ( + + )} + + + ); +}; +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); + }} + > + + + + + setOpen(false)} + sx={(theme) => ({ + position: "absolute", + right: 8, + top: 8, + zIndex: 50, + color: theme.palette.grey[500], + })} + > + + + {open && } + + + ); +}; +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)}> + + + + 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/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(); }