diff --git a/public/locales/fa/app.json b/public/locales/fa/app.json
index bf4d7d2..fde5626 100644
--- a/public/locales/fa/app.json
+++ b/public/locales/fa/app.json
@@ -96,7 +96,8 @@
"development_assistant_page": "معاون توسعه",
"inspector_expert_page": "بازدید کارشناس",
"commercial_chief_page": "رئیس اداره بازرگانی",
- "edit_profile": "ویرایش پروفایل"
+ "edit_profile": "ویرایش پروفایل",
+ "expert_management": "مدیریت کارشناسان"
},
"MuiDatePicker": {
"date_picker_birthday": "تاریخ"
@@ -324,6 +325,55 @@
"uploadfile_error": "حجم فایل بیشتر از 2 مگابایت می باشد"
},
"ExpertMangement": {
- "id": "کد یکتا"
+ "id": "کد یکتا",
+ "name": "نام",
+ "username": "نام کاربری",
+ "email": "پست الکترونیک",
+ "phone_number": "شماره همراه",
+ "national_id": "کد ملی",
+ "position": "سمت",
+ "province_name": "استان",
+ "city_name": "شهر",
+ "role_name": "نقش",
+ "updated_at": "آخرین بروزرسانی",
+ "button_while_submiting": "درحال افزودن کارشناس",
+ "button_submit": "افزودن کارشناس",
+ "button_close": "بستن",
+ "button_delete": "حذف",
+ "add": "افزودن کارشناس",
+ "button-cancel": "بستن",
+ "button-confirm": "ثبت",
+ "create": "افزودن کارشناس",
+ "update": "ویرایش کارشناس",
+ "text_field_name": "نام",
+ "text_field_username": "نام کاربری",
+ "text_field_email": "پست الکترونیک",
+ "text_field_phone_number": "شماره همراه",
+ "text_field_national_id": "کد ملی",
+ "text_field_password": "رمز عبور",
+ "text_field_position": "سمت",
+ "text_field_province_id": "استان",
+ "text_field_city_id": "شهر",
+ "text_field_role_id": "نقش",
+ "text_field_please_select_province": "ابتدا استان خود را انتخاب کنید",
+ "text_field_loading_cities_list": "درحال دریافت شهر ها",
+ "text_field_error_fetching_cities": "خطا در دریافت شهر ها",
+ "error_message_name": "نام خود را وارد کنید",
+ "error_message_username": "نام کاربری خود را وارد کنید",
+ "error_message_email": "پست الکترونیک خود را وارد کنید",
+ "error_message_phone_number": "شماره همراه خود را وارد کنید",
+ "error_message_national_id": "کد ملی خود را وارد کنید",
+ "error_message_password": "رمز عبور خود را وارد کنید",
+ "error_message_position": "سمت خود را وارد کنید",
+ "error_message_province_id": "استان خود را وارد کنید",
+ "error_message_city_id": "شهر خود را وارد کنید",
+ "error_message_role_id": "نقش خود را وارد کنید",
+ "personal_info": "مشخصات کارشناس",
+ "user_info": "اطلاعات کاربری",
+ "rest_info": "اطلاعات تکمیلی",
+ "delete_tooltip": "حذف",
+ "update_tooltip": "ویرایش کارشناس",
+ "delete_expert": "حذف کارشناس",
+ "are_you_sure_text": "آیا از انجام این عملیات اطمینان دارید؟"
}
}
diff --git a/src/components/dashboard/expert-management/Form/CreateForm/CreateContent.jsx b/src/components/dashboard/expert-management/Form/CreateForm/CreateContent.jsx
new file mode 100644
index 0000000..82d8a58
--- /dev/null
+++ b/src/components/dashboard/expert-management/Form/CreateForm/CreateContent.jsx
@@ -0,0 +1,367 @@
+import {
+ Box,
+ Button,
+ Chip,
+ DialogActions,
+ DialogContent,
+ Divider,
+ FormControl,
+ FormHelperText,
+ Grid,
+ InputLabel,
+ MenuItem,
+ Select,
+ TextField,
+} from "@mui/material";
+import {useFormik} from "formik";
+import {useTranslations} from "next-intl";
+import * as Yup from "yup";
+import {useEffect, useState} from "react";
+import {CREATE_EXPERT_MANAGEMENT, GET_CITY_LIST, GET_PROVINCE_LIST, GET_ROLE_LIST} from "@/core/data/apiRoutes";
+import useRequest from "@/lib/app/hooks/useRequest";
+
+const CreateContent = ({setOpenCreateDialog, mutate, fetchUrl}) => {
+ const t = useTranslations();
+ const requestServer = useRequest()
+ const [provinceList, setProvinceList] = useState([]);
+ const [cityList, setCityList] = useState([]);
+ const [roleList, setRoleList] = useState([]);
+ const [cityTextField, setCityTextField] = useState(t("ExpertMangement.text_field_please_select_province"));
+
+ useEffect(() => {
+ requestServer(GET_PROVINCE_LIST, "get", {auth: true, notification: false})
+ .then(({data}) => {
+ const formattedData = data.map((province, index) => ({
+ id: index,
+ name: province.name,
+ value: province.id,
+ }));
+ setProvinceList(formattedData);
+ }).catch(() => {
+ });
+ }, []);
+
+ useEffect(() => {
+ requestServer(GET_ROLE_LIST, "get", {auth: true, notification: false})
+ .then(({data}) => {
+ const result = data.data;
+ const formattedData = result.map((role, index) => ({
+ id: index,
+ name: role.name,
+ name_fa: role.name_fa,
+ value: role.id,
+ }));
+ setRoleList(formattedData);
+ }).catch(() => {
+ });
+ }, []);
+
+ function getCities(province_id) {
+ formik.setFieldTouched("city_id", false, false);
+ formik.setFieldValue("city_id", "")
+ setCityTextField(t("ExpertMangement.text_field_loading_cities_list"))
+ requestServer(`${GET_CITY_LIST}?province_id=${province_id}`, "get", {auth: true, notification: false})
+ .then(({data}) => {
+ const result = data.data;
+ const formattedData = result.map((city, index) => ({
+ id: index,
+ name: city.name,
+ value: city.id,
+ }));
+ setCityList(formattedData);
+ setCityTextField(t("ExpertMangement.text_field_city_id"))
+ }).catch(() => {
+ setCityTextField(t("ExpertMangement.text_field_error_fetching_cities"))
+ });
+ }
+
+
+ const validationSchema = Yup.object().shape({
+ name: Yup.string().required(t("ExpertMangement.error_message_name")),
+ username: Yup.string().required(t("ExpertMangement.error_message_username")),
+ email: Yup.string().required(t("ExpertMangement.error_message_email")),
+ phone_number: Yup.string().required(t("ExpertMangement.error_message_phone_number")),
+ national_id: Yup.string().required(t("ExpertMangement.error_message_national_id")),
+ password: Yup.string().required(t("ExpertMangement.error_message_password")),
+ position: Yup.string().required(t("ExpertMangement.error_message_position")),
+ province_id: Yup.string().required(t("ExpertMangement.error_message_province_id")),
+ city_id: Yup.string().required(t("ExpertMangement.error_message_city_id")),
+ role_id: Yup.string().required(t("ExpertMangement.error_message_role_id"))
+ });
+
+ const formik = useFormik({
+ initialValues: {
+ name: "",
+ username: "",
+ email: "",
+ phone_number: "",
+ national_id: "",
+ password: "",
+ position: "",
+ province_id: "",
+ city_id: "",
+ role_id: ""
+ },
+ validationSchema,
+ onSubmit: (values, {setSubmitting}) => {
+ const formData = new FormData();
+ formData.append("name", values.name);
+ formData.append("national_id", values.national_id);
+ formData.append("phone_number", values.phone_number);
+ formData.append("email", values.email);
+ formData.append("username", values.username);
+ formData.append("password", values.password);
+ formData.append("province_id", values.province_id);
+ formData.append("city_id", values.city_id);
+ formData.append("position", values.position);
+ formData.append("role_id", values.role_id);
+
+ requestServer(`${CREATE_EXPERT_MANAGEMENT}`, 'post', {auth: true, data: formData})
+ .then((response) => {
+ mutate(fetchUrl)
+ setOpenCreateDialog(false)
+ }).catch(() => {
+ }).finally(() => {
+ setSubmitting(false);
+ });
+ },
+ });
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t("ExpertMangement.text_field_province_id")}
+
+
+ {formik.touched.province_id && formik.errors.province_id ? formik.errors.province_id : ""}
+
+
+
+
+
+ {cityTextField}
+
+
+ {formik.touched.city_id && formik.errors.city_id ? formik.errors.city_id : ""}
+
+
+
+
+
+
+
+
+
+
+ {t("ExpertMangement.text_field_role_id")}
+
+
+ {formik.touched.role_id && formik.errors.role_id ? formik.errors.role_id : ""}
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+export default CreateContent;
diff --git a/src/components/dashboard/expert-management/Form/CreateForm/index.jsx b/src/components/dashboard/expert-management/Form/CreateForm/index.jsx
new file mode 100644
index 0000000..8556b11
--- /dev/null
+++ b/src/components/dashboard/expert-management/Form/CreateForm/index.jsx
@@ -0,0 +1,39 @@
+import {Button, Dialog, DialogTitle, Stack, Tooltip,} from "@mui/material";
+import {useTranslations} from "next-intl";
+import DataSaverOnIcon from "@mui/icons-material/DataSaverOn";
+import {useState} from "react";
+import CreateContent from "./CreateContent";
+
+const Create = ({mutate, fetchUrl}) => {
+ const t = useTranslations();
+ const [openCreateDialog, setOpenCreateDialog] = useState(false);
+
+ return (
+ <>
+
+
+
+
+
+
+ >
+ );
+};
+
+export default Create;
diff --git a/src/components/dashboard/expert-management/Form/DeleteForm.jsx b/src/components/dashboard/expert-management/Form/DeleteForm.jsx
index eb5b4c0..87a097c 100644
--- a/src/components/dashboard/expert-management/Form/DeleteForm.jsx
+++ b/src/components/dashboard/expert-management/Form/DeleteForm.jsx
@@ -1,84 +1,72 @@
-import {useTranslations} from "next-intl";
-import {useState} from "react";
import {
Button,
Dialog,
DialogActions,
DialogContent,
+ DialogContentText,
DialogTitle,
- FormControl,
- FormHelperText,
IconButton,
- InputLabel,
- MenuItem,
- Select,
- Stack,
- TextField,
Tooltip
} from "@mui/material";
-import {useFormik} from "formik";
-import ChangeCircleIcon from '@mui/icons-material/ChangeCircle';
-import {UPDATE_LOAN_MANAGEMENT_REFAHI} from "@/core/data/apiRoutes";
+import DeleteIcon from '@mui/icons-material/Delete';
+import {useState} from "react";
+import {DELETE_EXPERT_MANAGEMENT} from "@/core/data/apiRoutes";
import useRequest from "@/lib/app/hooks/useRequest";
-import useNotification from "@/lib/app/hooks/useNotification";
-import * as Yup from "yup";
-import useLoanStateRefahi from "@/lib/prefetchDataTable/hooks/useLoanStateRefahi";
-
+import {useTranslations} from "next-intl";
const Delete = ({rowId, fetchUrl, mutate}) => {
const t = useTranslations();
- const {loan_state_refahi} = useLoanStateRefahi()
- const [openConfirmDialog, setOpenConfirmDialog] = useState(false);
- const requestServer = useRequest({auth: true})
- const {update_notification} = useNotification()
+ const requestServer = useRequest({auth: true});
+ const [openDeleteDialog, setOpenDeleteDialog] = useState(false);
+ const [isSubmitting, setIsSubmitting] = useState(false);
- const validationSchema = Yup.object().shape({
- description: Yup.string().required(t("UpdateDialog.description_error")),
- next_state_id: Yup.number().required(t("UpdateDialog.next-state-id-error"))
- });
-
- const formik = useFormik({
- initialValues: {
- description: "",
- next_state_id: ""
- },
- validationSchema,
- onSubmit: (values, {setSubmitting}) => {
- const formData = new FormData();
- formData.append("description", values.description);
- formData.append("next_state_id", values.next_state_id);
-
- requestServer(`${UPDATE_LOAN_MANAGEMENT_REFAHI}/${rowId}`, 'post', {
- data: formData,
- }).then((response) => {
+ const handleDelete = () => {
+ setIsSubmitting(true)
+ requestServer(`${DELETE_EXPERT_MANAGEMENT}/${rowId}`, 'post')
+ .then((response) => {
mutate(fetchUrl)
- update_notification()
- }).catch(() => {
- }).finally(() => {
- setSubmitting(false);
+ })
+ .catch(() => {
+ })
+ .finally(() => {
+ setIsSubmitting(false)
+ setOpenDeleteDialog(false);
});
- },
- });
-
- const handleDescriptionChange = (event) => {
- formik.setFieldValue("description", event.target.value)
- };
- const handleNextStateIDChange = (event) => {
- formik.setFieldValue("next_state_id", event.target.value)
};
return (
<>
-
+
{
- setOpenConfirmDialog(true)
+ setOpenDeleteDialog(true);
}}
>
-
+
+
>
);
};
diff --git a/src/components/dashboard/expert-management/Form/UpdateForm.jsx b/src/components/dashboard/expert-management/Form/UpdateForm.jsx
deleted file mode 100644
index a456677..0000000
--- a/src/components/dashboard/expert-management/Form/UpdateForm.jsx
+++ /dev/null
@@ -1,24 +0,0 @@
-import {useTranslations} from "next-intl";
-import {IconButton, Tooltip} from "@mui/material";
-import ChangeCircleIcon from '@mui/icons-material/ChangeCircle';
-
-
-const Update = ({rowId, fetchUrl, mutate}) => {
- const t = useTranslations();
-
- return (
- <>
-
- {
- setOpenConfirmDialog(true)
- }}
- >
-
-
-
- >
- );
-};
-export default Update;
\ No newline at end of file
diff --git a/src/components/dashboard/expert-management/Form/UpdateForm/UpdateContent.jsx b/src/components/dashboard/expert-management/Form/UpdateForm/UpdateContent.jsx
new file mode 100644
index 0000000..39a8a6b
--- /dev/null
+++ b/src/components/dashboard/expert-management/Form/UpdateForm/UpdateContent.jsx
@@ -0,0 +1,348 @@
+import {useTranslations} from "next-intl";
+import {
+ Box,
+ Button,
+ Chip,
+ DialogActions,
+ DialogContent,
+ Divider,
+ FormControl,
+ FormHelperText,
+ Grid,
+ InputLabel,
+ MenuItem,
+ Select,
+ TextField
+} from "@mui/material";
+import {useEffect, useState} from "react";
+import {useFormik} from "formik";
+import {GET_CITY_LIST, GET_PROVINCE_LIST, GET_ROLE_LIST, UPDATE_EXPERT_MANAGEMENT} from "@/core/data/apiRoutes";
+import * as Yup from "yup";
+import useRequest from "@/lib/app/hooks/useRequest";
+
+
+const UpdateContent = ({row, fetchUrl, mutate, setOpenUpdateDialog}) => {
+ const t = useTranslations();
+ const requestServer = useRequest();
+ const [provinceList, setProvinceList] = useState([]);
+ const [cityList, setCityList] = useState([]);
+ const [roleList, setRoleList] = useState([]);
+ const [cityTextField, setCityTextField] = useState(t("ExpertMangement.text_field_please_select_province"));
+
+ useEffect(() => {
+ requestServer(GET_PROVINCE_LIST, "get", {auth: true, notification: false})
+ .then(({data}) => {
+ const formattedData = data.map((province, index) => ({
+ id: index,
+ name: province.name,
+ value: province.id,
+ }));
+ setProvinceList(formattedData);
+ }).catch(() => {
+ });
+ }, []);
+
+ useEffect(() => {
+ requestServer(GET_ROLE_LIST, "get", {auth: true, notification: false})
+ .then(({data}) => {
+ const result = data.data;
+ const formattedData = result.map((role, index) => ({
+ id: index,
+ name: role.name,
+ name_fa: role.name_fa,
+ value: role.id,
+ }));
+ setRoleList(formattedData);
+ }).catch(() => {
+ });
+ }, []);
+
+ function getCities(province_id) {
+ formik.setFieldTouched("city_id", false, false);
+ // formik.setFieldValue("city_id", "")
+ setCityTextField(t("ExpertMangement.text_field_loading_cities_list"))
+ requestServer(`${GET_CITY_LIST}?province_id=${province_id}`, "get", {auth: true, notification: false})
+ .then(({data}) => {
+ const result = data.data;
+ const formattedData = result.map((city, index) => ({
+ id: index,
+ name: city.name,
+ value: city.id,
+ }));
+ setCityList(formattedData);
+ setCityTextField(t("ExpertMangement.text_field_city_id"))
+ }).catch(() => {
+ setCityTextField(t("ExpertMangement.text_field_error_fetching_cities"))
+ });
+ }
+
+
+ const validationSchema = Yup.object().shape({
+ name: Yup.string().required(t("ExpertMangement.error_message_name")),
+ username: Yup.string().required(t("ExpertMangement.error_message_username")),
+ email: Yup.string().required(t("ExpertMangement.error_message_email")),
+ phone_number: Yup.string().required(t("ExpertMangement.error_message_phone_number")),
+ national_id: Yup.string().required(t("ExpertMangement.error_message_national_id")),
+ password: Yup.string().required(t("ExpertMangement.error_message_password")),
+ position: Yup.string().required(t("ExpertMangement.error_message_position")),
+ province_id: Yup.string().required(t("ExpertMangement.error_message_province_id")),
+ city_id: Yup.string().required(t("ExpertMangement.error_message_city_id")),
+ role_id: Yup.string().required(t("ExpertMangement.error_message_role_id"))
+ });
+ const formik = useFormik({
+ initialValues: {
+ name: row.original.name,
+ username: row.original.username,
+ email: row.original.email,
+ phone_number: row.original.phone_number,
+ national_id: row.original.national_id,
+ position: row.original.position,
+ province_id: row.original.province_id,
+ city_id: row.original.city_id,
+ role_id: row.original.role_id
+ },
+ validationSchema,
+ onSubmit: (values, {setSubmitting}) => {
+ const formData = new FormData();
+ formData.append("name", values.name);
+ formData.append("national_id", values.national_id);
+ formData.append("phone_number", values.phone_number);
+ formData.append("email", values.email);
+ formData.append("username", values.username);
+ formData.append("province_id", values.province_id);
+ formData.append("city_id", values.city_id);
+ formData.append("position", values.position);
+ formData.append("role_id", values.role_id);
+
+ requestServer(`${UPDATE_EXPERT_MANAGEMENT}/${row.original.id}`, 'post', {auth: true, data: formData})
+ .then((response) => {
+ mutate(fetchUrl)
+ }).catch(() => {
+ }).finally(() => {
+ setSubmitting(false);
+ });
+ },
+ });
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t("ExpertMangement.text_field_province_id")}
+
+
+ {formik.touched.province_id && formik.errors.province_id ? formik.errors.province_id : ""}
+
+
+
+
+
+ {cityTextField}
+
+
+ {formik.touched.city_id && formik.errors.city_id ? formik.errors.city_id : ""}
+
+
+
+
+
+
+
+
+
+
+ {t("ExpertMangement.text_field_role_id")}
+
+
+ {formik.touched.role_id && formik.errors.role_id ? formik.errors.role_id : ""}
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+export default UpdateContent;
\ No newline at end of file
diff --git a/src/components/dashboard/expert-management/Form/UpdateForm/index.jsx b/src/components/dashboard/expert-management/Form/UpdateForm/index.jsx
new file mode 100644
index 0000000..56760f1
--- /dev/null
+++ b/src/components/dashboard/expert-management/Form/UpdateForm/index.jsx
@@ -0,0 +1,55 @@
+import {useTranslations} from "next-intl";
+import {Dialog, DialogTitle, IconButton, Tooltip} from "@mui/material";
+import EditIcon from '@mui/icons-material/Edit';
+import {useState} from "react";
+import useRequest from "@/lib/app/hooks/useRequest";
+import UpdateContent from "./UpdateContent";
+import {GET_CITY_LIST} from "@/core/data/apiRoutes";
+
+
+const Update = ({row, fetchUrl, mutate}) => {
+ const t = useTranslations();
+ const requestServer = useRequest();
+ const [openUpdateDialog, setOpenUpdateDialog] = useState(false);
+
+ // function getCities(province_id) {
+ // formik.setFieldTouched("city_id", false, false);
+ // // formik.setFieldValue("city_id", "")
+ // setCityTextField(t("ExpertMangement.text_field_loading_cities_list"))
+ // requestServer(`${GET_CITY_LIST}?province_id=${province_id}`, "get", {auth: true, notification: false})
+ // .then(({data}) => {
+ // const result = data.data;
+ // const formattedData = result.map((city, index) => ({
+ // id: index,
+ // name: city.name,
+ // value: city.id,
+ // }));
+ // setCityList(formattedData);
+ // setCityTextField(t("ExpertMangement.text_field_city_id"))
+ // }).catch(() => {
+ // setCityTextField(t("ExpertMangement.text_field_error_fetching_cities"))
+ // });
+ // }
+
+ return (
+ <>
+
+ {
+ setOpenUpdateDialog(true)
+ // getCities(row.original.province_id)
+ }}
+ >
+
+
+
+
+ >
+ );
+};
+export default Update;
\ No newline at end of file
diff --git a/src/components/dashboard/expert-management/TableRowActions.jsx b/src/components/dashboard/expert-management/TableRowActions.jsx
index fd599f9..4458fad 100644
--- a/src/components/dashboard/expert-management/TableRowActions.jsx
+++ b/src/components/dashboard/expert-management/TableRowActions.jsx
@@ -1,11 +1,16 @@
import {Box} from "@mui/material";
import Update from "./Form/UpdateForm"
+import Delete from "./Form/DeleteForm";
const TableRowActions = ({row, mutate, fetchUrl}) => {
-
return (
+
+
+ >
+ );
+}
+
+export default TableToolbar;
diff --git a/src/components/dashboard/expert-management/index.jsx b/src/components/dashboard/expert-management/index.jsx
index a792cb6..3497091 100644
--- a/src/components/dashboard/expert-management/index.jsx
+++ b/src/components/dashboard/expert-management/index.jsx
@@ -5,6 +5,9 @@ import {GET_EXPERT_MANAGEMENT} from "@/core/data/apiRoutes";
import {useTranslations} from "next-intl";
import TableRowActions from "./TableRowActions";
import DataTable from "@/core/components/DataTable";
+import TableToolbar from "@/components/dashboard/expert-management/TableToolbar";
+import moment from "jalali-moment";
+import MuiDatePicker from "@/core/components/MuiDatePicker";
function DashboardExpertManagementComponent() {
const t = useTranslations();
@@ -29,6 +32,133 @@ function DashboardExpertManagementComponent() {
{renderedCellValue}
),
},
+ {
+ accessorFn: (row) => row.name,
+ id: "name",
+ header: t("ExpertMangement.name"),
+ enableColumnFilter: true,
+ datatype: "text",
+ filterFn: "contains",
+ columnFilterModeOptions: ["contains", "equals", "notEquals"],
+ Cell: ({renderedCellValue}) => (
+ {renderedCellValue}
+ ),
+ },
+ {
+ accessorFn: (row) => row.username,
+ id: "username",
+ header: t("ExpertMangement.username"),
+ enableColumnFilter: true,
+ datatype: "text",
+ filterFn: "contains",
+ columnFilterModeOptions: ["contains", "equals", "notEquals"],
+ Cell: ({renderedCellValue}) => (
+ {renderedCellValue}
+ ),
+ },
+ {
+ accessorFn: (row) => row.email,
+ id: "email",
+ header: t("ExpertMangement.email"),
+ enableColumnFilter: true,
+ datatype: "text",
+ filterFn: "contains",
+ columnFilterModeOptions: ["contains", "equals", "notEquals"],
+ Cell: ({renderedCellValue}) => (
+ {renderedCellValue}
+ ),
+ },
+ {
+ accessorFn: (row) => row.phone_number,
+ id: "phone_number",
+ header: t("ExpertMangement.phone_number"),
+ enableColumnFilter: true,
+ datatype: "numeric",
+ filterFn: "equals",
+ columnFilterModeOptions: ["contains", "equals", "notEquals"],
+ Cell: ({renderedCellValue}) => (
+ {renderedCellValue}
+ ),
+ },
+ {
+ accessorFn: (row) => row.national_id,
+ id: "national_id",
+ header: t("ExpertMangement.national_id"),
+ enableColumnFilter: true,
+ datatype: "numeric",
+ filterFn: "equals",
+ columnFilterModeOptions: ["contains", "equals", "notEquals"],
+ Cell: ({renderedCellValue}) => (
+ {renderedCellValue}
+ ),
+ },
+ {
+ accessorFn: (row) => row.position,
+ id: "position",
+ header: t("ExpertMangement.position"),
+ enableColumnFilter: true,
+ datatype: "text",
+ filterFn: "contains",
+ columnFilterModeOptions: ["contains", "equals", "notEquals"],
+ Cell: ({renderedCellValue}) => (
+ {renderedCellValue}
+ ),
+ },
+ {
+ accessorFn: (row) => row.province_name,
+ id: "province_id",
+ header: t("ExpertMangement.province_name"),
+ enableColumnFilter: true,
+ datatype: "text",
+ filterFn: "contains",
+ columnFilterModeOptions: ["contains", "equals", "notEquals"],
+ Cell: ({renderedCellValue}) => (
+ {renderedCellValue}
+ ),
+ },
+ {
+ accessorFn: (row) => row.city_name,
+ id: "city_id",
+ header: t("ExpertMangement.city_name"),
+ enableColumnFilter: true,
+ datatype: "text",
+ filterFn: "contains",
+ columnFilterModeOptions: ["contains", "equals", "notEquals"],
+ Cell: ({renderedCellValue}) => (
+ {renderedCellValue}
+ ),
+ },
+ {
+ accessorFn: (row) => row.role_name,
+ id: "role_id",
+ header: t("ExpertMangement.role_name"),
+ enableColumnFilter: true,
+ datatype: "text",
+ filterFn: "contains",
+ columnFilterModeOptions: ["contains", "equals", "notEquals"],
+ Cell: ({renderedCellValue}) => (
+ {renderedCellValue}
+ ),
+ },
+ {
+ accessorFn: (row) =>
+ moment(row.updated_at).locale("fa").format("HH:mm | yyyy/MM/DD"),
+ id: "updated_at",
+ header: t("ExpertMangement.updated_at"),
+ enableColumnFilter: true,
+ datatype: "date",
+ filterFn: "lessThan",
+ columnFilterModeOptions: ["lessThan", "greaterThan"],
+ Cell: ({renderedCellValue}) => {
+ return {renderedCellValue};
+ },
+ Header: ({column}) => <>{column.columnDef.header}>,
+ Filter: ({column}) => {
+ return (
+
+ );
+ },
+ },
],
[]
);
@@ -39,6 +169,7 @@ function DashboardExpertManagementComponent() {
tableUrl={GET_EXPERT_MANAGEMENT}
columns={columns}
selectableRow={false}
+ CustomToolbar={TableToolbar}
enableCustomToolbar={true}
enableLastUpdate={true}
enablePinning={true}
diff --git a/src/components/dashboard/passenger-boss/index.jsx b/src/components/dashboard/passenger-boss/index.jsx
index ad6848f..c90b28a 100644
--- a/src/components/dashboard/passenger-boss/index.jsx
+++ b/src/components/dashboard/passenger-boss/index.jsx
@@ -175,6 +175,7 @@ function DashboardPassengerOfficeComponent() {
enableGlobalFilter={false}
enableColumnResizing={false} // if you want true this you shold change renderRowActions props ** see https://www.material-react-table.com/docs/guides/row-actions
enableRowActions={true}
+ renderMainAction={TableToolbar}
TableRowAction={TableRowActions}
/>
diff --git a/src/core/components/DataTable.jsx b/src/core/components/DataTable.jsx
index b3b0f26..8d06a02 100644
--- a/src/core/components/DataTable.jsx
+++ b/src/core/components/DataTable.jsx
@@ -134,7 +134,7 @@ function DataTable(props) {
renderTopToolbarCustomActions={({table}) => (
<>
{props.enableCustomToolbar /* send condition */
- ? props.CustomToolbar /* send component */
+ ? /* send component */
: ""}
>
)}
diff --git a/src/core/data/apiRoutes.js b/src/core/data/apiRoutes.js
index d7d728a..0cdaaff 100644
--- a/src/core/data/apiRoutes.js
+++ b/src/core/data/apiRoutes.js
@@ -163,3 +163,12 @@ export const DELETE_EXPERT_MANAGEMENT =
export const CHANGE_PASSWORD_EXPERT_MANAGEMENT =
BASE_URL + "/dashboard/experts/change_password"
//expert management
+
+// province/city list
+export const GET_PROVINCE_LIST = BASE_URL + "/api/provinces";
+export const GET_CITY_LIST = BASE_URL + "/api/cities";
+// province/city list
+
+// role list
+export const GET_ROLE_LIST = BASE_URL + "/dashboard/roles/list";
+// role list
diff --git a/src/pages/dashboard/expert-management/index.jsx b/src/pages/dashboard/expert-management/index.jsx
index 84518f7..ce91ee6 100644
--- a/src/pages/dashboard/expert-management/index.jsx
+++ b/src/pages/dashboard/expert-management/index.jsx
@@ -4,7 +4,7 @@ import {parse} from "next-useragent";
import DashboardExpertManagementComponent from "@/components/dashboard/expert-management";
const requiredPermissions = ["manage_transportation_navgan"];
-export default function ExpertMangement() {
+export default function ExpertManagement() {
return (