Feature/add user activiry crud
This commit is contained in:
13
src/app/(withAuth)/dashboard/user-activities/page.js
Normal file
13
src/app/(withAuth)/dashboard/user-activities/page.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import UserActivitiesPage from "@/components/dashboard/userActivities";
|
||||||
|
import WithPermission from "@/core/middlewares/withPermission";
|
||||||
|
export const metadata = {
|
||||||
|
title: "انواع فعالیت کاربران",
|
||||||
|
};
|
||||||
|
const Page = () => {
|
||||||
|
return (
|
||||||
|
<WithPermission permission_name={["show-user-activities-page"]}>
|
||||||
|
<UserActivitiesPage />
|
||||||
|
</WithPermission>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default Page;
|
||||||
@@ -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 ChecklistIcon from "@mui/icons-material/Checklist";
|
||||||
import { useTheme } from "@emotion/react";
|
import { useTheme } from "@emotion/react";
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import ComplaintListTable from "./ComplaintListTable";
|
import ComplaintListTable from "./ComplaintListTable";
|
||||||
|
import { useSidebarBadge } from "@/lib/hooks/useSidebarBadge";
|
||||||
|
import { getValueByPath } from "@/core/utils/getValueByPath";
|
||||||
|
|
||||||
const ComplaintList = ({ mutate }) => {
|
const ComplaintList = ({ mutate }) => {
|
||||||
|
const { data } = useSidebarBadge();
|
||||||
const theme = useTheme();
|
const theme = useTheme();
|
||||||
const isMobile = useMediaQuery(theme.breakpoints.down("sm"));
|
const isMobile = useMediaQuery(theme.breakpoints.down("sm"));
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
@@ -19,15 +22,21 @@ const ComplaintList = ({ mutate }) => {
|
|||||||
<ChecklistIcon sx={{ fontSize: "25px" }} />
|
<ChecklistIcon sx={{ fontSize: "25px" }} />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
) : (
|
) : (
|
||||||
<Button
|
<Badge
|
||||||
size={"small"}
|
badgeContent={data ? getValueByPath(data, "roadObserved.complaint_cnt").toLocaleString() : 0}
|
||||||
variant="contained"
|
max={999999}
|
||||||
color="primary"
|
color="warning"
|
||||||
startIcon={<ChecklistIcon />}
|
|
||||||
onClick={handleOpen}
|
|
||||||
>
|
>
|
||||||
لیست شکایات
|
<Button
|
||||||
</Button>
|
size={"small"}
|
||||||
|
variant="contained"
|
||||||
|
color="primary"
|
||||||
|
startIcon={<ChecklistIcon />}
|
||||||
|
onClick={handleOpen}
|
||||||
|
>
|
||||||
|
لیست شکایات
|
||||||
|
</Button>
|
||||||
|
</Badge>
|
||||||
)}
|
)}
|
||||||
<ComplaintListTable open={open} setOpen={setOpen} mutate={mutate} />
|
<ComplaintListTable open={open} setOpen={setOpen} mutate={mutate} />
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import DescriptionForm from "./RowActions/DescriptionDialog";
|
|||||||
import ImageDialog from "./RowActions/ImageDialog";
|
import ImageDialog from "./RowActions/ImageDialog";
|
||||||
import LocationForm from "./RowActions/LocationDialog";
|
import LocationForm from "./RowActions/LocationDialog";
|
||||||
import Toolbar from "./Toolbar";
|
import Toolbar from "./Toolbar";
|
||||||
|
import BlinkingCell from "@/core/components/BlinkingCell";
|
||||||
|
|
||||||
const OperatorList = () => {
|
const OperatorList = () => {
|
||||||
const statusOptions = [
|
const statusOptions = [
|
||||||
@@ -32,6 +33,7 @@ const OperatorList = () => {
|
|||||||
columnFilterModeOptions: ["equals", "contains"],
|
columnFilterModeOptions: ["equals", "contains"],
|
||||||
grow: false,
|
grow: false,
|
||||||
size: 100,
|
size: 100,
|
||||||
|
Cell: ({ row }) => <BlinkingCell value={row.original.id} visible={row.original.status == 2} />,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
header: "اطلاعات ثبت شده در سامانه سوانح",
|
header: "اطلاعات ثبت شده در سامانه سوانح",
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import LocationForm from "./RowActions/LocationDialog";
|
|||||||
import EngineeringIcon from "@mui/icons-material/Engineering";
|
import EngineeringIcon from "@mui/icons-material/Engineering";
|
||||||
import ThreePIcon from "@mui/icons-material/ThreeP";
|
import ThreePIcon from "@mui/icons-material/ThreeP";
|
||||||
import ImageDialog from "./RowActions/ImageDialog";
|
import ImageDialog from "./RowActions/ImageDialog";
|
||||||
|
import BlinkingCell from "@/core/components/BlinkingCell";
|
||||||
|
|
||||||
const SupervisorList = () => {
|
const SupervisorList = () => {
|
||||||
const { data: userPermissions } = usePermissions();
|
const { data: userPermissions } = usePermissions();
|
||||||
@@ -75,6 +76,7 @@ const SupervisorList = () => {
|
|||||||
columnFilterModeOptions: ["equals", "contains"],
|
columnFilterModeOptions: ["equals", "contains"],
|
||||||
grow: false,
|
grow: false,
|
||||||
size: 100,
|
size: 100,
|
||||||
|
Cell: ({ row }) => <BlinkingCell value={row.original.id} visible={row.original.status == 0} />,
|
||||||
},
|
},
|
||||||
...(hasCountryPermission ? [dynamicColumns] : []),
|
...(hasCountryPermission ? [dynamicColumns] : []),
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import PersianTextField from "@/core/components/PersianTextField";
|
|||||||
const validationSchema = object({
|
const validationSchema = object({
|
||||||
name: string().required("وارد کردن نام انگلیسی الزامیست!"),
|
name: string().required("وارد کردن نام انگلیسی الزامیست!"),
|
||||||
name_fa: string().required("وارد کردن نام فارسی الزامیست!"),
|
name_fa: string().required("وارد کردن نام فارسی الزامیست!"),
|
||||||
description: string().required("وارد کردن توضیحات الزامیست!"),
|
|
||||||
type: string().required("وارد کردن گروه (انگلیسی) الزامیست!"),
|
type: string().required("وارد کردن گروه (انگلیسی) الزامیست!"),
|
||||||
type_fa: string().required("وارد کردن گروه (فارسی) الزامیست!"),
|
type_fa: string().required("وارد کردن گروه (فارسی) الزامیست!"),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ const EditController = ({ rowId, mutate, setOpen, row }) => {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<DialogHeader>
|
<DialogHeader>
|
||||||
<DialogTitle>ویرایش سطح دسترسی جدید</DialogTitle>
|
<DialogTitle>ویرایش سطح دسترسی</DialogTitle>
|
||||||
</DialogHeader>
|
</DialogHeader>
|
||||||
<CreateFormContent setOpen={setOpen} defaultValues={defaultData} onSubmitBase={handleSubmit} />
|
<CreateFormContent setOpen={setOpen} defaultValues={defaultData} onSubmitBase={handleSubmit} />
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
import BlinkingCell from "@/core/components/BlinkingCell";
|
||||||
import CustomSelectByDependency from "@/core/components/DataTable/filter/fieldsType/CustomSelectByDependency";
|
import CustomSelectByDependency from "@/core/components/DataTable/filter/fieldsType/CustomSelectByDependency";
|
||||||
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
|
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
|
||||||
import { GET_ROAD_ITEMS_OPERATOR_LIST } from "@/core/utils/routes";
|
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 moment from "jalali-moment";
|
||||||
import { useEffect, useMemo, useState } from "react";
|
import { useEffect, useMemo, useState } from "react";
|
||||||
import RowActions from "./RowActions";
|
import RowActions from "./RowActions";
|
||||||
|
import DescriptionForm from "./RowActions/DescriptionForm";
|
||||||
import ImageDialog from "./RowActions/ImageForm";
|
import ImageDialog from "./RowActions/ImageForm";
|
||||||
import LocationForm from "./RowActions/LocationForm";
|
import LocationForm from "./RowActions/LocationForm";
|
||||||
|
import MachinesCodeDialog from "./RowActions/MachinesCodeForm";
|
||||||
import RahdaranDialog from "./RowActions/RahdaranForm";
|
import RahdaranDialog from "./RowActions/RahdaranForm";
|
||||||
import Toolbar from "./Toolbar";
|
import Toolbar from "./Toolbar";
|
||||||
import DescriptionForm from "./RowActions/DescriptionForm";
|
|
||||||
import MachinesCodeDialog from "./RowActions/MachinesCodeForm";
|
|
||||||
|
|
||||||
const OperatorList = () => {
|
const OperatorList = () => {
|
||||||
const statusOptions = [
|
const statusOptions = [
|
||||||
@@ -25,7 +26,6 @@ const OperatorList = () => {
|
|||||||
const columns = useMemo(
|
const columns = useMemo(
|
||||||
() => [
|
() => [
|
||||||
{
|
{
|
||||||
accessorKey: "id",
|
|
||||||
header: "کد یکتا",
|
header: "کد یکتا",
|
||||||
id: "id",
|
id: "id",
|
||||||
enableColumnFilter: true,
|
enableColumnFilter: true,
|
||||||
@@ -34,6 +34,7 @@ const OperatorList = () => {
|
|||||||
columnFilterModeOptions: ["equals", "contains"],
|
columnFilterModeOptions: ["equals", "contains"],
|
||||||
grow: false,
|
grow: false,
|
||||||
size: 100,
|
size: 100,
|
||||||
|
Cell: ({ row }) => <BlinkingCell value={row.original.id} visible={row.original.status == 2} />,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
header: "اطلاعات فعالیت",
|
header: "اطلاعات فعالیت",
|
||||||
|
|||||||
@@ -1,21 +1,22 @@
|
|||||||
import { useEffect, useMemo, useState } from "react";
|
import BlinkingCell from "@/core/components/BlinkingCell";
|
||||||
import { Box, Stack, Typography } from "@mui/material";
|
import CustomSelectByDependency from "@/core/components/DataTable/filter/fieldsType/CustomSelectByDependency";
|
||||||
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
|
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
|
||||||
import Toolbar from "./Toolbar";
|
|
||||||
import { GET_ROAD_ITEMS_SUPERVISOR_LIST } from "@/core/utils/routes";
|
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 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 RowActions from "./RowActions";
|
||||||
import LocationForm from "./RowActions/LocationForm";
|
import LocationForm from "./RowActions/LocationForm";
|
||||||
import ImageDialog from "../operator/RowActions/ImageForm";
|
import Toolbar from "./Toolbar";
|
||||||
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";
|
|
||||||
|
|
||||||
const SupervisorList = () => {
|
const SupervisorList = () => {
|
||||||
const statusOptions = [
|
const statusOptions = [
|
||||||
@@ -65,8 +66,8 @@ const SupervisorList = () => {
|
|||||||
};
|
};
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
accessorKey: "id",
|
// accessorKey: "id",
|
||||||
header: "کد یکتا", // Unique Code
|
header: "کد یکتا",
|
||||||
id: "id",
|
id: "id",
|
||||||
enableColumnFilter: true,
|
enableColumnFilter: true,
|
||||||
datatype: "text",
|
datatype: "text",
|
||||||
@@ -75,6 +76,7 @@ const SupervisorList = () => {
|
|||||||
columnFilterModeOptions: ["equals", "contains"],
|
columnFilterModeOptions: ["equals", "contains"],
|
||||||
grow: false,
|
grow: false,
|
||||||
size: 100,
|
size: 100,
|
||||||
|
Cell: ({ row }) => <BlinkingCell value={row.original.id} visible={row.original.status == 0} />,
|
||||||
},
|
},
|
||||||
...(hasCountryPermission ? [dynamicColumns] : []),
|
...(hasCountryPermission ? [dynamicColumns] : []),
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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 (
|
||||||
|
<FormControl error={!!error} fullWidth size="small">
|
||||||
|
<InputLabel id={`label-action-type`} shrink>
|
||||||
|
نوع فعالیت
|
||||||
|
</InputLabel>
|
||||||
|
<Select
|
||||||
|
labelId={`label-action-type`}
|
||||||
|
id={"action_type"}
|
||||||
|
name={`action_type`}
|
||||||
|
value={value}
|
||||||
|
input={<OutlinedInput label="نوع فعالیت" />}
|
||||||
|
size="small"
|
||||||
|
onChange={(e) => onChange(e.target.value)}
|
||||||
|
displayEmpty
|
||||||
|
>
|
||||||
|
{statusOptions.map((option) => (
|
||||||
|
<MenuItem key={option.value} value={option.value}>
|
||||||
|
{option.label}
|
||||||
|
</MenuItem>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
{error && <FormHelperText>{error.message}</FormHelperText>}
|
||||||
|
</FormControl>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default ActionTypeList;
|
||||||
@@ -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 (
|
||||||
|
<>
|
||||||
|
<StyledForm onSubmit={handleSubmit(handleOnSubmit)}>
|
||||||
|
<DialogContent dividers>
|
||||||
|
<Stack spacing={3}>
|
||||||
|
<Controller
|
||||||
|
name="title"
|
||||||
|
control={control}
|
||||||
|
render={({ field: { onChange, value }, fieldState: { error } }) => (
|
||||||
|
<PersianTextField
|
||||||
|
fullWidth
|
||||||
|
size="small"
|
||||||
|
label="عنوان"
|
||||||
|
value={value}
|
||||||
|
onChange={onChange}
|
||||||
|
placeholder="عنوان را وارد کنید"
|
||||||
|
error={!!error}
|
||||||
|
helperText={error ? error.message : null}
|
||||||
|
variant="outlined"
|
||||||
|
InputLabelProps={{ shrink: true }}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<Controller
|
||||||
|
name="log_unique_code"
|
||||||
|
control={control}
|
||||||
|
render={({ field: { onChange, value }, fieldState: { error } }) => (
|
||||||
|
<TextField
|
||||||
|
fullWidth
|
||||||
|
size="small"
|
||||||
|
label="کد"
|
||||||
|
value={value}
|
||||||
|
onChange={onChange}
|
||||||
|
placeholder="کد را وارد کنید"
|
||||||
|
error={!!error}
|
||||||
|
helperText={error ? error.message : null}
|
||||||
|
variant="outlined"
|
||||||
|
InputLabelProps={{ shrink: true }}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
<Controller
|
||||||
|
name="action_type"
|
||||||
|
control={control}
|
||||||
|
render={({ field: { onChange, value }, fieldState: { error } }) => (
|
||||||
|
<ActionTypeList value={value} onChange={onChange} error={error} />
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</Stack>
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<Button
|
||||||
|
onClick={() => setOpen(false)}
|
||||||
|
variant="outlined"
|
||||||
|
color="secondary"
|
||||||
|
startIcon={<ExitToApp />}
|
||||||
|
>
|
||||||
|
بستن
|
||||||
|
</Button>
|
||||||
|
<Button variant="contained" disabled={isSubmitting} type="submit" endIcon={<Beenhere />}>
|
||||||
|
{" "}
|
||||||
|
{isSubmitting ? "در حال ثبت فعالیت کاربران" : "ثبت فعالیت کاربران"}{" "}
|
||||||
|
</Button>
|
||||||
|
</DialogActions>
|
||||||
|
</StyledForm>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default CreateFormContent;
|
||||||
@@ -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 (
|
||||||
|
<Dialog open={open} fullWidth maxWidth={"xs"}>
|
||||||
|
<IconButton
|
||||||
|
aria-label="close"
|
||||||
|
onClick={() => setOpen(false)}
|
||||||
|
sx={(theme) => ({
|
||||||
|
position: "absolute",
|
||||||
|
right: 8,
|
||||||
|
top: 8,
|
||||||
|
zIndex: 50,
|
||||||
|
color: theme.palette.grey[500],
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
<CloseIcon />
|
||||||
|
</IconButton>
|
||||||
|
<DialogHeader>
|
||||||
|
<DialogTitle>ثبت فعالیت کاربران</DialogTitle>
|
||||||
|
</DialogHeader>
|
||||||
|
{open && (
|
||||||
|
<CreateFormContent
|
||||||
|
defaultValues={defaultValues}
|
||||||
|
onSubmitBase={onSubmit}
|
||||||
|
setOpen={setOpen}
|
||||||
|
mutate={mutate}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
</Dialog>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default CreateForm;
|
||||||
@@ -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 ? (
|
||||||
|
<IconButton aria-label="ثبت فعالیت کاربران" color="primary" onClick={handleOpen}>
|
||||||
|
<AddCircle sx={{ fontSize: "25px" }} />
|
||||||
|
</IconButton>
|
||||||
|
) : (
|
||||||
|
<Button
|
||||||
|
size={"small"}
|
||||||
|
variant="contained"
|
||||||
|
color="primary"
|
||||||
|
startIcon={<AddCircle />}
|
||||||
|
onClick={handleOpen}
|
||||||
|
>
|
||||||
|
ثبت فعالیت کاربران
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
<CreateForm open={open} setOpen={setOpen} mutate={mutate} />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default CreateUserActivity;
|
||||||
@@ -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 (
|
||||||
|
<>
|
||||||
|
<DialogHeader>
|
||||||
|
<DialogTitle>ویرایش فعالیت کاربران</DialogTitle>
|
||||||
|
</DialogHeader>
|
||||||
|
<CreateFormContent setOpen={setOpen} defaultValues={defaultData} onSubmitBase={handleSubmit} />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default EditController;
|
||||||
@@ -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 (
|
||||||
|
<>
|
||||||
|
<Tooltip title="ویرایش فعالیت کاربران" arrow placement="right">
|
||||||
|
<IconButton
|
||||||
|
color="primary"
|
||||||
|
sx={{ textTransform: "unset", alignSelf: "center" }}
|
||||||
|
onClick={() => {
|
||||||
|
setOpen(true);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<BorderColorIcon />
|
||||||
|
</IconButton>
|
||||||
|
</Tooltip>
|
||||||
|
<Dialog
|
||||||
|
fullWidth
|
||||||
|
open={open}
|
||||||
|
maxWidth={"xs"}
|
||||||
|
PaperProps={{
|
||||||
|
sx: {
|
||||||
|
boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px",
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<IconButton
|
||||||
|
aria-label="close"
|
||||||
|
onClick={() => setOpen(false)}
|
||||||
|
sx={(theme) => ({
|
||||||
|
position: "absolute",
|
||||||
|
right: 8,
|
||||||
|
top: 8,
|
||||||
|
zIndex: 50,
|
||||||
|
color: theme.palette.grey[500],
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
<CloseIcon />
|
||||||
|
</IconButton>
|
||||||
|
{open && <EditController setOpen={setOpen} rowId={rowId} row={row} mutate={mutate} />}
|
||||||
|
</Dialog>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default EditUserActivity;
|
||||||
@@ -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 (
|
||||||
|
<>
|
||||||
|
<DialogContent>
|
||||||
|
<Stack alignItems="center" spacing={2}>
|
||||||
|
<Typography mt={2}>آیا از حذف این فعالیت کاربران اطمینان دارید؟</Typography>
|
||||||
|
</Stack>
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions sx={{ justifyContent: "center", paddingBottom: 2, width: "100%" }}>
|
||||||
|
<Button onClick={() => setOpenDeleteDialog(false)} variant="outlined" color="secondary">
|
||||||
|
خیر !
|
||||||
|
</Button>
|
||||||
|
<Button onClick={handleClick} variant="contained" color="error" disabled={submitting}>
|
||||||
|
{submitting ? "درحال حذف..." : "بله اطمینان دارم"}
|
||||||
|
</Button>
|
||||||
|
</DialogActions>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default DeleteContent;
|
||||||
@@ -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 (
|
||||||
|
<>
|
||||||
|
<Tooltip title="حذف">
|
||||||
|
<IconButton color="error" onClick={() => setOpenDeleteDialog(true)}>
|
||||||
|
<DeleteIcon />
|
||||||
|
</IconButton>
|
||||||
|
</Tooltip>
|
||||||
|
<Dialog
|
||||||
|
open={openDeleteDialog}
|
||||||
|
onClose={() => 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"}
|
||||||
|
>
|
||||||
|
<DialogTitle>حذف فعالیت کاربران</DialogTitle>
|
||||||
|
{openDeleteDialog && (
|
||||||
|
<DeleteContent rowId={rowId} mutate={mutate} setOpenDeleteDialog={setOpenDeleteDialog} />
|
||||||
|
)}
|
||||||
|
</Dialog>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default DeleteDialog;
|
||||||
12
src/components/dashboard/userActivities/RowActions/index.jsx
Normal file
12
src/components/dashboard/userActivities/RowActions/index.jsx
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { Box } from "@mui/material";
|
||||||
|
import EditUserActivity from "../Actions/Edit";
|
||||||
|
import DeleteDialog from "./DeleteDialog";
|
||||||
|
const RowActions = ({ row, mutate }) => {
|
||||||
|
return (
|
||||||
|
<Box sx={{ display: "flex", gap: 1, alignItems: "center" }}>
|
||||||
|
<EditUserActivity row={row} mutate={mutate} rowId={row.getValue("id")} />
|
||||||
|
<DeleteDialog mutate={mutate} rowId={row.getValue("id")} />
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default RowActions;
|
||||||
9
src/components/dashboard/userActivities/Toolbar.jsx
Normal file
9
src/components/dashboard/userActivities/Toolbar.jsx
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import CreateUserActivity from "./Actions/Create";
|
||||||
|
const Toolbar = ({ mutate }) => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<CreateUserActivity mutate={mutate} />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default Toolbar;
|
||||||
@@ -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 (
|
||||||
|
<>
|
||||||
|
<Box sx={{ p: 1, border: 1, borderColor: "divider", borderRadius: 1 }}>
|
||||||
|
<DataTableWithAuth
|
||||||
|
need_filter={true}
|
||||||
|
columns={columns}
|
||||||
|
sorting={[{ id: "id", desc: true }]}
|
||||||
|
table_url={GET_USER_ACTIVITIES_LIST}
|
||||||
|
page_name={"userActivitiesPage"}
|
||||||
|
table_name={"userActivitiesList"}
|
||||||
|
TableToolbar={Toolbar}
|
||||||
|
enableRowActions
|
||||||
|
positionActionsColumn={"last"}
|
||||||
|
RowActions={RowActions}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default UserActivitiesList;
|
||||||
13
src/components/dashboard/userActivities/index.jsx
Normal file
13
src/components/dashboard/userActivities/index.jsx
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import PageTitle from "@/core/components/PageTitle";
|
||||||
|
import { Stack } from "@mui/material";
|
||||||
|
import UserActivitiesList from "./UserActivitiesList";
|
||||||
|
|
||||||
|
const UserActivitiesPage = () => {
|
||||||
|
return (
|
||||||
|
<Stack spacing={1}>
|
||||||
|
<PageTitle title={"انواع فعالیت کاربران"} />
|
||||||
|
<UserActivitiesList />
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default UserActivitiesPage;
|
||||||
@@ -14,6 +14,6 @@ const SidebarBadge = ({ badge, chipProps = {} }) => {
|
|||||||
if (!data) return null;
|
if (!data) return null;
|
||||||
if (!value) return null;
|
if (!value) return null;
|
||||||
|
|
||||||
return <Chip label={value.toLocaleString("fa-IR")} size="small" {...chipProps} />;
|
return <Chip label={value.toLocaleString()} size="small" {...chipProps} />;
|
||||||
};
|
};
|
||||||
export default SidebarBadge;
|
export default SidebarBadge;
|
||||||
|
|||||||
12
src/core/components/BlinkingCell.jsx
Normal file
12
src/core/components/BlinkingCell.jsx
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { Box, Stack } from "@mui/material";
|
||||||
|
import BlinkingCircle from "./BlinkingCircle";
|
||||||
|
|
||||||
|
const BlinkingCell = ({ visible = false, value }) => {
|
||||||
|
return (
|
||||||
|
<Stack direction={"row"} alignItems={"center"} spacing={0.5}>
|
||||||
|
<Box>{value}</Box>
|
||||||
|
{visible && <BlinkingCircle />}
|
||||||
|
</Stack>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
export default BlinkingCell;
|
||||||
24
src/core/components/BlinkingCircle.jsx
Normal file
24
src/core/components/BlinkingCircle.jsx
Normal file
@@ -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 (
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
width: 6,
|
||||||
|
height: 6,
|
||||||
|
borderRadius: "50%",
|
||||||
|
backgroundColor: (theme) => theme.palette.warning.main,
|
||||||
|
animation: `${blink} 1.3s infinite ease-in-out`,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default BlinkingCircle;
|
||||||
@@ -56,7 +56,7 @@ const errorClient = (response, notification, toastContainer, logout) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const errorResponse = (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)) {
|
if (isServerError(response.status)) {
|
||||||
errorServer(response, notification, toastContainer);
|
errorServer(response, notification, toastContainer);
|
||||||
} else if (isClientError(response.status)) {
|
} else if (isClientError(response.status)) {
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ export const pageMenu = [
|
|||||||
type: "menu",
|
type: "menu",
|
||||||
icon: <FactCheckIcon sx={{ width: "inherit", height: "inherit" }} />,
|
icon: <FactCheckIcon sx={{ width: "inherit", height: "inherit" }} />,
|
||||||
hasSubitems: true,
|
hasSubitems: true,
|
||||||
badges: ["road_items.total"],
|
badges: ["roadItem.total"],
|
||||||
Subitems: [
|
Subitems: [
|
||||||
{
|
{
|
||||||
id: "roadItemManagmentSupervisor",
|
id: "roadItemManagmentSupervisor",
|
||||||
@@ -103,7 +103,7 @@ export const pageMenu = [
|
|||||||
type: "menu",
|
type: "menu",
|
||||||
icon: <SpeedIcon sx={{ width: "inherit", height: "inherit" }} />,
|
icon: <SpeedIcon sx={{ width: "inherit", height: "inherit" }} />,
|
||||||
hasSubitems: true,
|
hasSubitems: true,
|
||||||
badges: ["road_items.supervise_cnt"],
|
badges: ["roadItem.supervise_cnt"],
|
||||||
Subitems: [
|
Subitems: [
|
||||||
{
|
{
|
||||||
id: "roadItemManagmentSupervisorCartable",
|
id: "roadItemManagmentSupervisorCartable",
|
||||||
@@ -123,7 +123,7 @@ export const pageMenu = [
|
|||||||
type: "menu",
|
type: "menu",
|
||||||
icon: <EngineeringIcon sx={{ width: "inherit", height: "inherit" }} />,
|
icon: <EngineeringIcon sx={{ width: "inherit", height: "inherit" }} />,
|
||||||
hasSubitems: true,
|
hasSubitems: true,
|
||||||
badges: ["road_items.operation_cnt"],
|
badges: ["roadItem.operation_cnt"],
|
||||||
Subitems: [
|
Subitems: [
|
||||||
{
|
{
|
||||||
id: "roadItemManagmentOparationCartable",
|
id: "roadItemManagmentOparationCartable",
|
||||||
@@ -185,7 +185,6 @@ export const pageMenu = [
|
|||||||
type: "menu",
|
type: "menu",
|
||||||
icon: <FireTruckIcon sx={{ width: "inherit", height: "inherit" }} />,
|
icon: <FireTruckIcon sx={{ width: "inherit", height: "inherit" }} />,
|
||||||
hasSubitems: true,
|
hasSubitems: true,
|
||||||
badges: ["road_patrols.total"],
|
|
||||||
Subitems: [
|
Subitems: [
|
||||||
{
|
{
|
||||||
id: "roadPatrolManagmentSupervisor",
|
id: "roadPatrolManagmentSupervisor",
|
||||||
@@ -193,7 +192,6 @@ export const pageMenu = [
|
|||||||
type: "menu",
|
type: "menu",
|
||||||
icon: <SpeedIcon sx={{ width: "inherit", height: "inherit" }} />,
|
icon: <SpeedIcon sx={{ width: "inherit", height: "inherit" }} />,
|
||||||
hasSubitems: true,
|
hasSubitems: true,
|
||||||
badges: ["road_patrols.supervise_cnt"],
|
|
||||||
Subitems: [
|
Subitems: [
|
||||||
{
|
{
|
||||||
id: "roadPatrolManagmentSupervisorCartable",
|
id: "roadPatrolManagmentSupervisorCartable",
|
||||||
@@ -213,7 +211,6 @@ export const pageMenu = [
|
|||||||
type: "menu",
|
type: "menu",
|
||||||
icon: <EngineeringIcon sx={{ width: "inherit", height: "inherit" }} />,
|
icon: <EngineeringIcon sx={{ width: "inherit", height: "inherit" }} />,
|
||||||
hasSubitems: true,
|
hasSubitems: true,
|
||||||
badges: ["road_patrols.operation_cnt"],
|
|
||||||
Subitems: [
|
Subitems: [
|
||||||
{
|
{
|
||||||
id: "roadPatrolManagmentOparationCartable",
|
id: "roadPatrolManagmentOparationCartable",
|
||||||
@@ -293,7 +290,7 @@ export const pageMenu = [
|
|||||||
type: "menu",
|
type: "menu",
|
||||||
icon: <RouteIcon sx={{ width: "inherit", height: "inherit" }} />,
|
icon: <RouteIcon sx={{ width: "inherit", height: "inherit" }} />,
|
||||||
hasSubitems: true,
|
hasSubitems: true,
|
||||||
badges: ["safety_and_privacy.step_one", "safety_and_privacy.step_two"],
|
badges: ["safetyAndPrivacy.step_one", "safetyAndPrivacy.step_two"],
|
||||||
Subitems: [
|
Subitems: [
|
||||||
{
|
{
|
||||||
id: "safetyAndPrivacyManagmentOparation",
|
id: "safetyAndPrivacyManagmentOparation",
|
||||||
@@ -347,7 +344,7 @@ export const pageMenu = [
|
|||||||
type: "menu",
|
type: "menu",
|
||||||
icon: <ElectricBoltIcon sx={{ width: "inherit", height: "inherit" }} />,
|
icon: <ElectricBoltIcon sx={{ width: "inherit", height: "inherit" }} />,
|
||||||
hasSubitems: true,
|
hasSubitems: true,
|
||||||
badges: ["road_observations.total"],
|
badges: ["roadObserved.total"],
|
||||||
Subitems: [
|
Subitems: [
|
||||||
{
|
{
|
||||||
id: "roadObservationsManagmentSupervisor",
|
id: "roadObservationsManagmentSupervisor",
|
||||||
@@ -355,7 +352,7 @@ export const pageMenu = [
|
|||||||
type: "menu",
|
type: "menu",
|
||||||
icon: <SpeedIcon sx={{ width: "inherit", height: "inherit" }} />,
|
icon: <SpeedIcon sx={{ width: "inherit", height: "inherit" }} />,
|
||||||
hasSubitems: true,
|
hasSubitems: true,
|
||||||
badges: ["road_observations.supervise_cnt"],
|
badges: ["roadObserved.supervise_cnt", "roadObserved.complaint_cnt"],
|
||||||
Subitems: [
|
Subitems: [
|
||||||
{
|
{
|
||||||
id: "roadObservationsManagmentSupervisorCartable",
|
id: "roadObservationsManagmentSupervisorCartable",
|
||||||
@@ -372,7 +369,7 @@ export const pageMenu = [
|
|||||||
type: "menu",
|
type: "menu",
|
||||||
icon: <EngineeringIcon sx={{ width: "inherit", height: "inherit" }} />,
|
icon: <EngineeringIcon sx={{ width: "inherit", height: "inherit" }} />,
|
||||||
hasSubitems: true,
|
hasSubitems: true,
|
||||||
badges: ["road_observations.operation_cnt"],
|
badges: ["roadObserved.operation_cnt", "roadObserved.complaint_cnt"],
|
||||||
Subitems: [
|
Subitems: [
|
||||||
{
|
{
|
||||||
id: "roadObservationsManagmentOparationCartable",
|
id: "roadObservationsManagmentOparationCartable",
|
||||||
@@ -495,10 +492,18 @@ export const pageMenu = [
|
|||||||
id: "permissionItem",
|
id: "permissionItem",
|
||||||
label: "سطح دسترسی ها",
|
label: "سطح دسترسی ها",
|
||||||
type: "page",
|
type: "page",
|
||||||
route: "/dashboard/permission-table",
|
route: "/dashboard/permissions",
|
||||||
icon: <LockPersonIcon sx={{ width: "inherit", height: "inherit" }} />,
|
icon: <LockPersonIcon sx={{ width: "inherit", height: "inherit" }} />,
|
||||||
permissions: ["show-permissions-page"],
|
permissions: ["show-permissions-page"],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: "userActivities",
|
||||||
|
label: "انواع فعالیت کاربران",
|
||||||
|
type: "page",
|
||||||
|
route: "/dashboard/user-activities",
|
||||||
|
icon: <AssignmentLateIcon sx={{ width: "inherit", height: "inherit" }} />,
|
||||||
|
permissions: ["show-user-activities-page"],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "CarDetails",
|
id: "CarDetails",
|
||||||
label: "اطلاعات خودرو",
|
label: "اطلاعات خودرو",
|
||||||
|
|||||||
@@ -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 CHANGE_USER_PASSWORD = api + "/api/v3/profile/change_password";
|
||||||
export const GET_LOGIN_ROUTE = api + "/login_dev";
|
export const GET_LOGIN_ROUTE = api + "/login_dev";
|
||||||
export const GET_PERMISSIONS_ROUTE = api + "/webapi/user/get-permission";
|
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_PROVINCE = "/v3/api/fake-submit";
|
||||||
export const REFER_ADMIN_CITY = "/v3/api/fake-submit";
|
export const REFER_ADMIN_CITY = "/v3/api/fake-submit";
|
||||||
export const GET_CITY_LISTS = "/v3/api/fake-cities";
|
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_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";
|
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 GET_PERMISSION_TABLE_LIST = api + "/api/v3/permissions";
|
||||||
export const DELETE_PERMISSION = api + "/api/v3/permissions";
|
export const DELETE_PERMISSION = api + "/api/v3/permissions";
|
||||||
export const UPDATE_PERMISSION = api + "/api/v3/permissions";
|
export const UPDATE_PERMISSION = api + "/api/v3/permissions";
|
||||||
export const CREATE_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";
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { successToast } from "@/core/components/Toasts/success";
|
|||||||
|
|
||||||
export const successRequest = (notification, toastContainer) => {
|
export const successRequest = (notification, toastContainer) => {
|
||||||
if (notification) {
|
if (notification) {
|
||||||
toast.dismiss({ container: toastContainer });
|
toast.dismiss({ containerId: toastContainer });
|
||||||
successToast(toastContainer);
|
successToast(toastContainer);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ export const useSidebarBadge = () => {
|
|||||||
const fetcher = async (url) => {
|
const fetcher = async (url) => {
|
||||||
try {
|
try {
|
||||||
const response = await request(url);
|
const response = await request(url);
|
||||||
return response.data;
|
return response.data.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new Error();
|
throw new Error();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user