From b602ac5dd2ecdf277cf361944f15ab17b24772ae Mon Sep 17 00:00:00 2001 From: Amirhossein Mahmoodi Date: Sat, 17 Aug 2024 13:10:01 +0330 Subject: [PATCH 01/31] fixed bug --- .../components/DataTable/body/TableBodyCell.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/core/components/DataTable/body/TableBodyCell.js b/src/core/components/DataTable/body/TableBodyCell.js index 902f9c7..f6b6b13 100644 --- a/src/core/components/DataTable/body/TableBodyCell.js +++ b/src/core/components/DataTable/body/TableBodyCell.js @@ -1,11 +1,10 @@ -import { isCellEditable, openEditingCell } from "material-react-table"; - -const { parseFromValuesOrFunc, getCommonMRTCellStyles } = require("@/core/utils/utils"); -const { useTheme } = require("@emotion/react"); -const { TableCell, Skeleton } = require("@mui/material"); -const { useState, useEffect, useMemo, memo } = require("react"); -const { default: DataTable_CopyButton } = require("../buttons/CopyButton"); -const { default: DataTable_TableBodyCellValue } = require("./TableBodyCellValue"); +import { getCommonMRTCellStyles, parseFromValuesOrFunc } from '@/utils/utils'; +import { useTheme } from '@emotion/react'; +import { Skeleton, TableCell } from '@mui/material'; +import { isCellEditable, openEditingCell } from 'material-react-table'; +import { memo, useEffect, useMemo, useState } from 'react'; +import DataTable_CopyButton from '../buttons/CopyButton'; +import DataTable_TableBodyCellValue from './TableBodyCellValue'; const DataTable_TableBodyCell = ({ cell, numRows, rowRef, staticColumnIndex, staticRowIndex, table, ...rest }) => { const theme = useTheme(); From a467ebe39960fefeb5cc5e7622b546b5fc173b7c Mon Sep 17 00:00:00 2001 From: Amirhossein Mahmoodi Date: Sat, 17 Aug 2024 13:16:01 +0330 Subject: [PATCH 02/31] fixed bug --- src/core/components/DataTable/body/TableBodyCell.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/components/DataTable/body/TableBodyCell.js b/src/core/components/DataTable/body/TableBodyCell.js index f6b6b13..43f76f7 100644 --- a/src/core/components/DataTable/body/TableBodyCell.js +++ b/src/core/components/DataTable/body/TableBodyCell.js @@ -1,4 +1,4 @@ -import { getCommonMRTCellStyles, parseFromValuesOrFunc } from '@/utils/utils'; +import { getCommonMRTCellStyles, parseFromValuesOrFunc } from '@/core/utils/utils'; import { useTheme } from '@emotion/react'; import { Skeleton, TableCell } from '@mui/material'; import { isCellEditable, openEditingCell } from 'material-react-table'; From f7c93d040456eed344226b4485505a6136713237 Mon Sep 17 00:00:00 2001 From: Amirhossein Mahmoodi Date: Sat, 17 Aug 2024 13:42:29 +0330 Subject: [PATCH 03/31] add version app --- .../dashboard/headerWithSidebar/index.jsx | 3 +- src/core/components/SidebarMenu.jsx | 62 +++++++++---------- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/src/components/layouts/dashboard/headerWithSidebar/index.jsx b/src/components/layouts/dashboard/headerWithSidebar/index.jsx index 68f4bc6..0b77983 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/index.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/index.jsx @@ -2,7 +2,7 @@ import SidebarMenu from "@/core/components/SidebarMenu"; import ChevronRightIcon from "@mui/icons-material/ChevronRight"; import MenuIcon from "@mui/icons-material/Menu"; -import { Box, Drawer, IconButton, Stack, styled, Toolbar } from "@mui/material"; +import { Box, Drawer, IconButton, Stack, styled, Toolbar, Typography } from "@mui/material"; import MuiAppBar from "@mui/material/AppBar"; import { useState } from "react"; import HeaderMenu from "./HeaderMenu"; @@ -103,6 +103,7 @@ const HeaderWithSidebar = ({ children }) => { + v{process.env.NEXT_PUBLIC_VERSION}
diff --git a/src/core/components/SidebarMenu.jsx b/src/core/components/SidebarMenu.jsx index 625972a..736b032 100644 --- a/src/core/components/SidebarMenu.jsx +++ b/src/core/components/SidebarMenu.jsx @@ -35,48 +35,48 @@ function reducer(state, action) { return state.map((item) => action.id == item.id ? { - ...item, - showSubitems: !item.showSubitems, - } + ...item, + showSubitems: !item.showSubitems, + } : item ); case "COLLAPSE_SUB_ITEMS": return state.map((item) => { return item.hasSubitems ? { - ...item, - Subitems: item.Subitems.map((subitem) => - action.id === subitem.id - ? { - ...subitem, - showSubitems: !subitem.showSubitems, - } - : subitem - ), - } + ...item, + Subitems: item.Subitems.map((subitem) => + action.id === subitem.id + ? { + ...subitem, + showSubitems: !subitem.showSubitems, + } + : subitem + ), + } : item; }); case "COLLAPSE_SUB_SECOND_ITEMS": return state.map((item) => { return item.hasSubitems ? { - ...item, - Subitems: item.Subitems.map((subitem) => { - return subitem.hasSubitems - ? { - ...subitem, - Subitems: subitem.Subitems.map((secondSubitem) => - action.id === secondSubitem.id - ? { - ...secondSubitem, - showSubitems: !secondSubitem.showSubitems, - } - : secondSubitem - ), - } - : subitem; - }), - } + ...item, + Subitems: item.Subitems.map((subitem) => { + return subitem.hasSubitems + ? { + ...subitem, + Subitems: subitem.Subitems.map((secondSubitem) => + action.id === secondSubitem.id + ? { + ...secondSubitem, + showSubitems: !secondSubitem.showSubitems, + } + : secondSubitem + ), + } + : subitem; + }), + } : item; }); case "SELECTED": @@ -113,7 +113,7 @@ const SidebarMenu = () => { return ( userPermissions && ( - + {menuItems.map((menuItem) => { return ; })} From aaf885bc4d346420e0a4f2ec560318fb846fad44 Mon Sep 17 00:00:00 2001 From: Mohammad Jalali Date: Sat, 17 Aug 2024 15:32:22 +0330 Subject: [PATCH 04/31] change icons of page menu --- src/core/utils/pageMenu.js | 93 +++++++++++++++++++++++--------------- 1 file changed, 56 insertions(+), 37 deletions(-) diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js index 75f7828..5718053 100644 --- a/src/core/utils/pageMenu.js +++ b/src/core/utils/pageMenu.js @@ -1,4 +1,23 @@ -import { Security } from "@mui/icons-material"; +import SpaceDashboardIcon from "@mui/icons-material/SpaceDashboard"; +import GroupsIcon from "@mui/icons-material/Groups"; +import AccountTreeIcon from "@mui/icons-material/AccountTree"; +import FactCheckIcon from "@mui/icons-material/FactCheck"; +import FireTruckIcon from "@mui/icons-material/FireTruck"; +import RouteIcon from "@mui/icons-material/Route"; +import DoorbellIcon from "@mui/icons-material/Doorbell"; +import ElectricBoltIcon from "@mui/icons-material/ElectricBolt"; +import CottageIcon from "@mui/icons-material/Cottage"; +import GppMaybeIcon from "@mui/icons-material/GppMaybe"; +import GavelIcon from "@mui/icons-material/Gavel"; +import BallotIcon from "@mui/icons-material/Ballot"; +import AssistantIcon from "@mui/icons-material/Assistant"; +import AdminPanelSettingsIcon from "@mui/icons-material/AdminPanelSettings"; +import MapIcon from "@mui/icons-material/Map"; +import SpeedIcon from "@mui/icons-material/Speed"; +import EngineeringIcon from "@mui/icons-material/Engineering"; +import ReportIcon from "@mui/icons-material/Report"; +import AssignmentLateIcon from "@mui/icons-material/AssignmentLate"; +import LineAxisIcon from "@mui/icons-material/LineAxis"; export const pageMenu = [ { @@ -6,7 +25,7 @@ export const pageMenu = [ label: "پیشخوان", type: "page", route: "/dashboard", - icon: , + icon: , permissions: ["all"], }, { @@ -14,14 +33,14 @@ export const pageMenu = [ label: "مدیریت کاربران", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/user_management", - icon: , + icon: , permissions: ["full-user-management", "limited-user-management"], }, { id: "projectsManagment", label: "پروژه های راهداری", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -29,7 +48,7 @@ export const pageMenu = [ label: "ثبت قرارداد و پروژه", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/rahdari_projects/finance", - icon: , + icon: , permissions: ["show-contract", "show-contract-province"], }, { @@ -37,7 +56,7 @@ export const pageMenu = [ label: "لیست پروژه ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/rahdari_projects/projects_list", - icon: , + icon: , permissions: ["all"], }, { @@ -45,7 +64,7 @@ export const pageMenu = [ label: "پروژه های پیشنهادی", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/rahdari_projects/proposal", - icon: , + icon: , permissions: ["show-proposal", "show-proposal-province"], }, { @@ -53,7 +72,7 @@ export const pageMenu = [ label: "درخواست نمایندگان", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/rahdari_projects/lawmakers", - icon: , + icon: , permissions: ["show-lawmaker", "show-lawmaker-province"], }, { @@ -61,7 +80,7 @@ export const pageMenu = [ label: "پراکندگی بر روی نقشه", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=rahdari_projects", - icon: , + icon: , permissions: ["all"], }, ], @@ -70,14 +89,14 @@ export const pageMenu = [ id: "roadItemManagment", label: "فعالیت های روزانه", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { id: "roadItemManagmentSupervisor", label: "ارزیابی", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -96,7 +115,7 @@ export const pageMenu = [ id: "roadItemManagmentOparation", label: "عملیات", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -120,7 +139,7 @@ export const pageMenu = [ label: "پراکندگی بر روی نقشه", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=road_items", - icon: , + icon: , permissions: [ "show-road-item-supervise-cartable", "show-road-item-supervise-cartable-province", @@ -132,7 +151,7 @@ export const pageMenu = [ label: "گزارش ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_items/report", - icon: , + icon: , permissions: [ "show-road-item-supervise-cartable", "show-road-item-supervise-cartable-province", @@ -145,14 +164,14 @@ export const pageMenu = [ id: "roadPatrolManagment", label: "گشت راهداری و ترابری", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { id: "roadPatrolManagmentSupervisor", label: "ارزیابی", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -171,7 +190,7 @@ export const pageMenu = [ id: "roadPatrolManagmentOparation", label: "عملیات", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -195,7 +214,7 @@ export const pageMenu = [ label: "پراکندگی بر روی نقشه", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=road_patrols", - icon: , + icon: , permissions: [ "add-road-patrol", "show-road-patrol-supervise-cartable", @@ -207,7 +226,7 @@ export const pageMenu = [ label: "گزارش ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_patrols/report", - icon: , + icon: , permissions: [ "add-road-patrol", "show-road-patrol-supervise-cartable", @@ -220,7 +239,7 @@ export const pageMenu = [ id: "inquiryPrivacyManagment", label: "استعلام حریم راه", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -250,14 +269,14 @@ export const pageMenu = [ id: "safetyAndPrivacyManagment", label: "نگهداری حریم راه", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { id: "safetyAndPrivacyManagmentOparation", label: "عملیات", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -285,7 +304,7 @@ export const pageMenu = [ label: "پراکندگی بر روی نقشه", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=safety_and_privacy", - icon: , + icon: , permissions: [ "show-safety-and-privacy-operator-cartable", "show-safety-and-privacy-operator-cartable-province", @@ -298,7 +317,7 @@ export const pageMenu = [ label: "گزارش ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/safety_and_privacy/report", - icon: , + icon: , permissions: [ "show-safety-and-privacy-operator-cartable", "show-safety-and-privacy-operator-cartable-province", @@ -312,14 +331,14 @@ export const pageMenu = [ id: "roadObservationsManagment", label: "واکنش سریع", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { id: "roadObservationsManagmentSupervisor", label: "ارزیابی", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -336,14 +355,14 @@ export const pageMenu = [ label: "رسیدگی به شکایات", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_observations", - icon: , + icon: , permissions: ["show-fast-react", "show-fast-react-province", "show-fast-react-edarate-shahri"], }, { id: "roadObservationsManagmentOparation", label: "عملیات", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -360,7 +379,7 @@ export const pageMenu = [ label: "پراکندگی بر روی نقشه", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=road_observations", - icon: , + icon: , permissions: ["all"], }, { @@ -368,7 +387,7 @@ export const pageMenu = [ label: "گزارش ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_observations/report/index", - icon: , + icon: , permissions: ["all"], }, ], @@ -377,7 +396,7 @@ export const pageMenu = [ id: "winterCampManagment", label: "قرارگاه زمستانی", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -385,7 +404,7 @@ export const pageMenu = [ label: "محور های انسدادی", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/winter_camp", - icon: , + icon: , permissions: ["show-camp", "show-camp-province"], }, { @@ -393,7 +412,7 @@ export const pageMenu = [ label: "محور های حلقه اول", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=camp", - icon: , + icon: , permissions: ["show-camp", "show-camp-province"], }, { @@ -401,7 +420,7 @@ export const pageMenu = [ label: "گزارش ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=campNew", - icon: , + icon: , permissions: ["show-camp", "show-camp-province"], }, ], @@ -410,14 +429,14 @@ export const pageMenu = [ id: "receiptManagment", label: "خسارات وارده بر ابنیه فنی و تاسیسات راه", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { id: "receiptManagmentOparation", label: "عملیات", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -434,7 +453,7 @@ export const pageMenu = [ label: "گزارش ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/receipt/report", - icon: , + icon: , permissions: ["all"], }, ], From be384141ac463def519894b9b0a3c76a203ef85a Mon Sep 17 00:00:00 2001 From: Mohammad Jalali Date: Sat, 17 Aug 2024 17:33:01 +0330 Subject: [PATCH 05/31] start working on profile --- src/core/components/SidebarMenu.jsx | 122 ++++++++++++++++++---------- 1 file changed, 79 insertions(+), 43 deletions(-) diff --git a/src/core/components/SidebarMenu.jsx b/src/core/components/SidebarMenu.jsx index 625972a..39d8079 100644 --- a/src/core/components/SidebarMenu.jsx +++ b/src/core/components/SidebarMenu.jsx @@ -1,10 +1,12 @@ "use client"; import SidebarListItems from "@/core/components/SidebarListItems"; import { usePermissions } from "@/lib/hooks/usePermissions"; -import { List } from "@mui/material"; +import { Avatar, Box, Divider, IconButton, List, Stack, Typography } from "@mui/material"; import { usePathname } from "next/navigation"; import { useEffect, useReducer, useState } from "react"; import { filterMenuItems } from "../utils/filterMenuItems"; +import PowerSettingsNewIcon from "@mui/icons-material/PowerSettingsNew"; +import ModeEditIcon from "@mui/icons-material/ModeEdit"; import { pageMenu } from "../utils/pageMenu"; function selectPage(item, route) { @@ -35,48 +37,48 @@ function reducer(state, action) { return state.map((item) => action.id == item.id ? { - ...item, - showSubitems: !item.showSubitems, - } - : item + ...item, + showSubitems: !item.showSubitems, + } + : item, ); case "COLLAPSE_SUB_ITEMS": return state.map((item) => { return item.hasSubitems ? { - ...item, - Subitems: item.Subitems.map((subitem) => - action.id === subitem.id - ? { - ...subitem, - showSubitems: !subitem.showSubitems, - } - : subitem - ), - } + ...item, + Subitems: item.Subitems.map((subitem) => + action.id === subitem.id + ? { + ...subitem, + showSubitems: !subitem.showSubitems, + } + : subitem, + ), + } : item; }); case "COLLAPSE_SUB_SECOND_ITEMS": return state.map((item) => { return item.hasSubitems ? { - ...item, - Subitems: item.Subitems.map((subitem) => { - return subitem.hasSubitems - ? { - ...subitem, - Subitems: subitem.Subitems.map((secondSubitem) => - action.id === secondSubitem.id - ? { - ...secondSubitem, - showSubitems: !secondSubitem.showSubitems, - } - : secondSubitem - ), - } - : subitem; - }), - } + ...item, + Subitems: item.Subitems.map((subitem) => { + return subitem.hasSubitems + ? { + ...subitem, + Subitems: subitem.Subitems.map((secondSubitem) => + action.id === secondSubitem.id + ? { + ...secondSubitem, + showSubitems: !secondSubitem.showSubitems, + } + : secondSubitem, + ), + } + : subitem; + }), + } : item; }); case "SELECTED": @@ -105,20 +107,54 @@ const SidebarMenu = () => { useEffect(() => { selectedKey && - document.querySelector(`[data-route="${selectedKey}"]`)?.scrollIntoView({ - behavior: "smooth", - block: "center", - }); + document.querySelector(`[data-route="${selectedKey}"]`)?.scrollIntoView({ + behavior: "smooth", + block: "center", + }); }, [selectedKey]); return ( - userPermissions && ( - - {menuItems.map((menuItem) => { - return ; - })} - - ) + <> + + + + + + شرکت وایتل + (userName) + + .: اداره کل ستاد :. + + + + آخرین ورود + + 1 ساعت پیش + + + + + + + + + + + + { + userPermissions && ( + + {menuItems.map((menuItem) => { + return ; + })} + + ) + } + ); }; export default SidebarMenu; From f2e199ee8a1fdae1d65813531935f5f068ec521d Mon Sep 17 00:00:00 2001 From: Amirhossein Mahmoodi Date: Sun, 18 Aug 2024 11:11:58 +0330 Subject: [PATCH 06/31] formatting --- src/app/(withAuth)/dashboard/layout.js | 2 +- src/app/(withAuth)/layout.js | 4 +- src/app/layout.js | 2 +- src/app/lfwd/page.js | 10 +- .../Actions/Create/index.jsx | 7 +- .../Forms/CreateOrUpdate.jsx | 656 +++++++++++++----- .../LocationOnMap/MarkerLocation/index.jsx | 25 +- .../Forms/LocationOnMap/index.jsx | 10 +- .../inquiryPrivacyFencing/Toolbar.jsx | 1 - .../dashboard/inquiryPrivacyFencing/index.jsx | 1 - .../inquiryPrivacyFencingList/index.jsx | 5 +- .../dashboard/headerWithLogo/index.jsx | 2 +- .../dashboard/headerWithSidebar/index.jsx | 8 +- src/core/components/DataTable/Main.js | 6 +- .../DataTable/body/TableBodyCell.js | 72 +- .../components/DataTable/body/TableBodyRow.js | 41 +- .../DataTable/filter/FilterBodyField.jsx | 22 +- .../DataTable/filter/FilterOptionList.jsx | 17 +- .../DataTable/head/TableHeadCell.js | 43 +- .../components/DataTable/hide/HideBody.jsx | 9 +- .../DataTable/hide/HideBodyField.jsx | 10 +- .../DataTable/hide/HideOrShowAll.jsx | 2 +- .../DataTable/reset/ResetStorage.jsx | 2 +- src/core/components/DataTable/table/Paper.js | 48 +- .../DataTable/toolbar/TopToolbar.js | 49 +- src/core/components/DialogTransition.jsx | 2 +- .../components/MapLayer/Loading/index.jsx | 8 +- src/core/components/MapLayer/index.jsx | 4 +- .../NotificationDesign/AskForKeepData.jsx | 19 +- src/core/components/PageTitle.jsx | 12 +- src/core/components/SidebarMenu.jsx | 60 +- src/core/components/StyledForm.jsx | 2 +- src/core/utils/cacheRtl.js | 2 +- src/core/utils/errorResponse.js | 2 +- src/core/utils/flattenArrayOfObjects.js | 1 - src/core/utils/flattenObjectOfObjects.jsx | 2 +- src/lib/contexts/DataTable.js | 4 +- src/lib/contexts/auth.js | 4 +- src/lib/contexts/tableSetting.js | 2 +- src/lib/hooks/useRequest.js | 5 +- 40 files changed, 733 insertions(+), 450 deletions(-) diff --git a/src/app/(withAuth)/dashboard/layout.js b/src/app/(withAuth)/dashboard/layout.js index 5a85c25..219cee2 100644 --- a/src/app/(withAuth)/dashboard/layout.js +++ b/src/app/(withAuth)/dashboard/layout.js @@ -4,7 +4,7 @@ import { Stack } from "@mui/material"; const Layout = ({ children }) => { return ( - + {children} diff --git a/src/app/(withAuth)/layout.js b/src/app/(withAuth)/layout.js index b9c3d01..63d25a7 100644 --- a/src/app/(withAuth)/layout.js +++ b/src/app/(withAuth)/layout.js @@ -1,9 +1,7 @@ import WithAuthMiddleware from "@/core/middlewares/withAuth"; const Layout = ({ children }) => { - return ( - {children} - ); + return {children}; }; export default Layout; diff --git a/src/app/layout.js b/src/app/layout.js index 580ae26..237d222 100644 --- a/src/app/layout.js +++ b/src/app/layout.js @@ -8,7 +8,7 @@ export const metadata = { export default function RootLayout({ children }) { return ( - + {children} diff --git a/src/app/lfwd/page.js b/src/app/lfwd/page.js index 61ebe16..70708e4 100644 --- a/src/app/lfwd/page.js +++ b/src/app/lfwd/page.js @@ -8,7 +8,7 @@ import Link from "next/link"; import { useEffect, useState } from "react"; const Page = ({ searchParams }) => { - const { getUser } = useAuth() + const { getUser } = useAuth(); const { username } = searchParams; const [login, setLogin] = useState(0); const request = useRequest(); @@ -17,7 +17,7 @@ const Page = ({ searchParams }) => { const login = async () => { try { await request(`${GET_LOGIN_ROUTE}?username=${username}`); - await getUser() + await getUser(); setLogin(1); } catch (error) { setLogin(2); @@ -31,7 +31,7 @@ const Page = ({ searchParams }) => { setLogin(0); try { await request(`${GET_LOGIN_ROUTE}?username=${username}`); - await getUser() + await getUser(); setLogin(1); } catch (error) { setLogin(2); @@ -44,8 +44,8 @@ const Page = ({ searchParams }) => { {login === 0 ? "درحال دریافت مجوز برای ارتباط با سرور..." : login === 1 - ? "ارتباط با سرور برقرار شد." - : "ارتباط با سرور برقرار نشد. مشکلی وجود دارد."} + ? "ارتباط با سرور برقرار شد." + : "ارتباط با سرور برقرار نشد. مشکلی وجود دارد."} )} diff --git a/src/components/dashboard/inquiryPrivacyFencing/Forms/CreateOrUpdate.jsx b/src/components/dashboard/inquiryPrivacyFencing/Forms/CreateOrUpdate.jsx index 435f39b..f3483ae 100644 --- a/src/components/dashboard/inquiryPrivacyFencing/Forms/CreateOrUpdate.jsx +++ b/src/components/dashboard/inquiryPrivacyFencing/Forms/CreateOrUpdate.jsx @@ -1,7 +1,21 @@ import LtrTextField from "@/core/components/LtrTextField"; import StyledForm from "@/core/components/StyledForm"; import useRequest from "@/lib/hooks/useRequest"; -import { Autocomplete, Box, Button, Chip, Container, DialogActions, DialogContent, Fade, Grid, InputAdornment, Stack, TextField, Typography } from "@mui/material"; +import { + Autocomplete, + Box, + Button, + Chip, + Container, + DialogActions, + DialogContent, + Fade, + Grid, + InputAdornment, + Stack, + TextField, + Typography, +} from "@mui/material"; import { DatePicker, LocalizationProvider, faIR } from "@mui/x-date-pickers"; import { AdapterDateFnsJalali } from "@mui/x-date-pickers/AdapterDateFnsJalali"; import moment from "jalali-moment"; @@ -9,130 +23,135 @@ import { Controller, useForm } from "react-hook-form"; import LocationOnMap from "./LocationOnMap"; const initValues = { - dabirkhaneh_number: '', + dabirkhaneh_number: "", nameh_date: moment(), - nameh_date_fa: '', - marjae_pasokh: '', + nameh_date_fa: "", + marjae_pasokh: "", motaghazi_is_legal_id: null, - motaghazi_is_legal: '', - motaghazi_type_id: '', + motaghazi_is_legal: "", + motaghazi_type_id: "", motaghazi_type: null, - motaghazi_firstname: '', - motaghazi_lastname: '', - national_id: '', - shenase_melli: '', - tel_number: '', - mobile_number: '', - address: '', + motaghazi_firstname: "", + motaghazi_lastname: "", + national_id: "", + shenase_melli: "", + tel_number: "", + mobile_number: "", + address: "", edare_kol_id: null, - edare_kol: '', + edare_kol: "", edare_shahri_id: null, - edare_shahri: '', + edare_shahri: "", rah_type_id: null, - rah_type: '', - name_mehvar_id: '', + rah_type: "", + name_mehvar_id: "", name_mehvar_fa: null, mizan_harim: null, arze_navar: null, samt_id: null, - samt: '', - kilometr: '', - lat: '', - lon: '', + samt: "", + kilometr: "", + lat: "", + lon: "", zone: null, karbari_type_id: null, - karbari_type: '', - tarh_title: '', - masahat_zirbana: '', + karbari_type: "", + tarh_title: "", + masahat_zirbana: "", ehdasat_type_id: [], - ehdasat_type: '', - divarkeshi_distance: '', - mostahadesat_distance: '', + ehdasat_type: "", + divarkeshi_distance: "", + mostahadesat_distance: "", mahale_ejra_id: null, - mahale_ejra: '', + mahale_ejra: "", traffic_id: null, - traffic: '', + traffic: "", vaziat_eghtesadi_id: null, - vaziat_eghtesadi: '', + vaziat_eghtesadi: "", has_access_id: null, - has_access: '', - shomare_estelam_harim: '', - max_month: '', - max_day: '', - shomare_tahaodname: '', - shomare_daftarkhaneh: '', - description: '', - ronevesht: '', -} + has_access: "", + shomare_estelam_harim: "", + max_month: "", + max_day: "", + shomare_tahaodname: "", + shomare_daftarkhaneh: "", + description: "", + ronevesht: "", +}; const CreateOrUpdateForm = ({ handleClose, mutate, defaultValues, url }) => { - const request = useRequest() - const { control, watch, register, handleSubmit, setValue, formState: { isSubmitting } } = useForm({ defaultValues: defaultValues || initValues }); + const request = useRequest(); + const { + control, + watch, + register, + handleSubmit, + setValue, + formState: { isSubmitting }, + } = useForm({ defaultValues: defaultValues || initValues }); const onSubmit = async (data) => { - const formData = new FormData() - formData.append('dabirkhaneh_number', data.dabirkhaneh_number) - formData.append('nameh_date', data.nameh_date.format('YYYY-MM-DD')) - formData.append('nameh_date_fa', data.nameh_date) - formData.append('marjae_pasokh', data.marjae_pasokh) - formData.append('motaghazi_is_legal_id', data.motaghazi_is_legal_id) - formData.append('motaghazi_is_legal', data.motaghazi_is_legal_id) - formData.append('motaghazi_type_id', 1) - formData.append('motaghazi_type', data.motaghazi_type) - formData.append('motaghazi_firstname', data.motaghazi_firstname) - formData.append('motaghazi_lastname', data.motaghazi_lastname) - formData.append('national_id', data.national_id) - formData.append('shenase_melli', data.national_id) - formData.append('tel_number', data.tel_number) - formData.append('mobile_number', data.mobile_number) - formData.append('address', data.address) - formData.append('edare_kol_id', data.edare_kol_id) - formData.append('edare_kol', data.edare_kol_id) - formData.append('edare_shahri_id', data.edare_shahri_id) - formData.append('edare_shahri', data.edare_shahri_id) - formData.append('rah_type_id', data.rah_type_id) - formData.append('rah_type', data.rah_type_id) - formData.append('name_mehvar_id', 1) - formData.append('name_mehvar_fa', data.name_mehvar_fa) - formData.append('mizan_harim', data.mizan_harim) - formData.append('arze_navar', data.arze_navar) - formData.append('samt_id', data.samt_id) - formData.append('samt', data.samt_id) - formData.append('kilometr', data.kilometr) - formData.append('lat', data.lat) - formData.append('lon', data.lon) - formData.append('zone', data.zone) - formData.append('karbari_type_id', data.karbari_type_id) - formData.append('karbari_type', data.karbari_type_id) - formData.append('tarh_title', data.tarh_title) - formData.append('masahat_zirbana', data.masahat_zirbana) - formData.append('ehdasat_type_id', data.ehdasat_type_id.join("|")) - formData.append('ehdasat_type', data.ehdasat_type_id.join("|")) - formData.append('divarkeshi_distance', data.divarkeshi_distance) - formData.append('mostahadesat_distance', data.mostahadesat_distance) - formData.append('mahale_ejra_id', data.mahale_ejra_id) - formData.append('mahale_ejra', data.mahale_ejra) - formData.append('traffic_id', data.traffic_id) - formData.append('traffic', data.traffic_id) - formData.append('vaziat_eghtesadi_id', data.vaziat_eghtesadi_id) - formData.append('vaziat_eghtesadi', data.vaziat_eghtesadi) - formData.append('has_access_id', data.has_access_id) - formData.append('has_access', data.has_access_id) - formData.append('shomare_estelam_harim', data.shomare_estelam_harim) - formData.append('max_month', data.max_month) - formData.append('max_day', data.max_day) - formData.append('shomare_tahaodname', data.shomare_tahaodname) - formData.append('shomare_daftarkhaneh', data.shomare_daftarkhaneh) - formData.append('description', data.description) - formData.append('ronevesht', data.ronevesht) + const formData = new FormData(); + formData.append("dabirkhaneh_number", data.dabirkhaneh_number); + formData.append("nameh_date", data.nameh_date.format("YYYY-MM-DD")); + formData.append("nameh_date_fa", data.nameh_date); + formData.append("marjae_pasokh", data.marjae_pasokh); + formData.append("motaghazi_is_legal_id", data.motaghazi_is_legal_id); + formData.append("motaghazi_is_legal", data.motaghazi_is_legal_id); + formData.append("motaghazi_type_id", 1); + formData.append("motaghazi_type", data.motaghazi_type); + formData.append("motaghazi_firstname", data.motaghazi_firstname); + formData.append("motaghazi_lastname", data.motaghazi_lastname); + formData.append("national_id", data.national_id); + formData.append("shenase_melli", data.national_id); + formData.append("tel_number", data.tel_number); + formData.append("mobile_number", data.mobile_number); + formData.append("address", data.address); + formData.append("edare_kol_id", data.edare_kol_id); + formData.append("edare_kol", data.edare_kol_id); + formData.append("edare_shahri_id", data.edare_shahri_id); + formData.append("edare_shahri", data.edare_shahri_id); + formData.append("rah_type_id", data.rah_type_id); + formData.append("rah_type", data.rah_type_id); + formData.append("name_mehvar_id", 1); + formData.append("name_mehvar_fa", data.name_mehvar_fa); + formData.append("mizan_harim", data.mizan_harim); + formData.append("arze_navar", data.arze_navar); + formData.append("samt_id", data.samt_id); + formData.append("samt", data.samt_id); + formData.append("kilometr", data.kilometr); + formData.append("lat", data.lat); + formData.append("lon", data.lon); + formData.append("zone", data.zone); + formData.append("karbari_type_id", data.karbari_type_id); + formData.append("karbari_type", data.karbari_type_id); + formData.append("tarh_title", data.tarh_title); + formData.append("masahat_zirbana", data.masahat_zirbana); + formData.append("ehdasat_type_id", data.ehdasat_type_id.join("|")); + formData.append("ehdasat_type", data.ehdasat_type_id.join("|")); + formData.append("divarkeshi_distance", data.divarkeshi_distance); + formData.append("mostahadesat_distance", data.mostahadesat_distance); + formData.append("mahale_ejra_id", data.mahale_ejra_id); + formData.append("mahale_ejra", data.mahale_ejra); + formData.append("traffic_id", data.traffic_id); + formData.append("traffic", data.traffic_id); + formData.append("vaziat_eghtesadi_id", data.vaziat_eghtesadi_id); + formData.append("vaziat_eghtesadi", data.vaziat_eghtesadi); + formData.append("has_access_id", data.has_access_id); + formData.append("has_access", data.has_access_id); + formData.append("shomare_estelam_harim", data.shomare_estelam_harim); + formData.append("max_month", data.max_month); + formData.append("max_day", data.max_day); + formData.append("shomare_tahaodname", data.shomare_tahaodname); + formData.append("shomare_daftarkhaneh", data.shomare_daftarkhaneh); + formData.append("description", data.description); + formData.append("ronevesht", data.ronevesht); try { - await request(url, 'post', { data: formData }) - handleClose() - mutate() - } catch (error) { - - } + await request(url, "post", { data: formData }); + handleClose(); + mutate(); + } catch (error) {} }; return ( @@ -141,11 +160,18 @@ const CreateOrUpdateForm = ({ handleClose, mutate, defaultValues, url }) => { localeText={faIR.components.MuiLocalizationProvider.defaultProps.localeText} > - - + + - + { onChange={(newValue) => onChange(moment(newValue))} label="تاریخ نامه درخواست *" slotProps={{ - textField: { fullWidth: true, size: "small", autoComplete: 'off' }, + textField: { fullWidth: true, size: "small", autoComplete: "off" }, }} /> )} /> - + { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} options={["حقوقی", "حقیقی"]} - renderInput={(params) => } + renderInput={(params) => ( + + )} /> )} /> - + { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} options={["دولتی", "خصوصی"]} - renderInput={(params) => } + renderInput={(params) => ( + + )} /> )} /> @@ -208,26 +253,76 @@ const CreateOrUpdateForm = ({ handleClose, mutate, defaultValues, url }) => { - + - - + + - + - + - - + + - + { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} options={["تهران"]} renderInput={(params) => ( - { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} options={["تهران"]} - renderInput={(params) => } + renderInput={(params) => ( + + )} /> )} /> @@ -281,10 +384,12 @@ const CreateOrUpdateForm = ({ handleClose, mutate, defaultValues, url }) => { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} - options={["آزاد راه", "بزرگراه", 'راه فرعی درجه 3']} - renderInput={(params) => } + options={["آزاد راه", "بزرگراه", "راه فرعی درجه 3"]} + renderInput={(params) => ( + + )} /> )} /> @@ -299,16 +404,23 @@ const CreateOrUpdateForm = ({ handleClose, mutate, defaultValues, url }) => { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} options={["سایر"]} - renderInput={(params) => } + renderInput={(params) => ( + + )} /> )} /> - + @@ -322,10 +434,12 @@ const CreateOrUpdateForm = ({ handleClose, mutate, defaultValues, url }) => { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} options={["چپ", "راست"]} - renderInput={(params) => } + renderInput={(params) => ( + + )} /> )} /> @@ -340,16 +454,27 @@ const CreateOrUpdateForm = ({ handleClose, mutate, defaultValues, url }) => { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} options={["12.5", "17.5"]} - renderInput={(params) => } + renderInput={(params) => ( + + )} /> )} /> - + { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} options={["15", "30"]} - renderInput={(params) => } + renderInput={(params) => ( + + )} /> )} /> @@ -371,15 +503,40 @@ const CreateOrUpdateForm = ({ handleClose, mutate, defaultValues, url }) => { - + - + - - + + { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} options={["38", "39"]} - renderInput={(params) => } + renderInput={(params) => ( + + )} /> )} /> @@ -408,22 +572,42 @@ const CreateOrUpdateForm = ({ handleClose, mutate, defaultValues, url }) => { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} options={["اتاقک نگهبانی", "دولتی"]} - renderInput={(params) => } + renderInput={(params) => ( + + )} /> )} /> - + - - مترمربع, - }} /> + مترمربع, + }} + /> { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} renderTags={(value, getTagProps) => value.map((option, index) => { const { key, ...tagProps } = getTagProps({ index }); return ( - + ); }) } options={["تعمیرات", "احداث بنا"]} - renderInput={(params) => } + renderInput={(params) => ( + + )} /> )} /> - متر, - }} /> + متر, + }} + /> - متر, - }} /> + متر, + }} + /> { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} options={["داخل حریم"]} - renderInput={(params) => } + renderInput={(params) => ( + + )} /> )} /> @@ -490,10 +705,17 @@ const CreateOrUpdateForm = ({ handleClose, mutate, defaultValues, url }) => { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} options={["سبک (ضریب ۱)"]} - renderInput={(params) => } + renderInput={(params) => ( + + )} /> )} /> @@ -508,10 +730,17 @@ const CreateOrUpdateForm = ({ handleClose, mutate, defaultValues, url }) => { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} options={["تست"]} - renderInput={(params) => } + renderInput={(params) => ( + + )} /> )} /> @@ -526,46 +755,115 @@ const CreateOrUpdateForm = ({ handleClose, mutate, defaultValues, url }) => { disablePortal value={value} onChange={(event, newValue) => { - onChange(newValue) + onChange(newValue); }} options={["بله", "خیر"]} - renderInput={(params) => } + renderInput={(params) => ( + + )} /> )} /> - + - - حداکثر مدت زمان شروع عملیات: * - - + + + حداکثر مدت زمان شروع عملیات: * + + + - + - + - + - + - - + + - + ); }; export default CreateOrUpdateForm; diff --git a/src/components/dashboard/inquiryPrivacyFencing/Forms/LocationOnMap/MarkerLocation/index.jsx b/src/components/dashboard/inquiryPrivacyFencing/Forms/LocationOnMap/MarkerLocation/index.jsx index d673679..c79c266 100644 --- a/src/components/dashboard/inquiryPrivacyFencing/Forms/LocationOnMap/MarkerLocation/index.jsx +++ b/src/components/dashboard/inquiryPrivacyFencing/Forms/LocationOnMap/MarkerLocation/index.jsx @@ -12,21 +12,26 @@ const MarkerLocation = ({ setValue, defaultLatLon }) => { const location = useRef(); const map = useMapEvents({ move: (e) => { - const latlon = e.target.getCenter() + const latlon = e.target.getCenter(); location.current?.setLatLng(latlon); - setValue('lat', latlon.lat) - setValue('lon', latlon.lng) + setValue("lat", latlon.lat); + setValue("lon", latlon.lng); }, zoom: (e) => { - const latlon = e.target.getCenter() + const latlon = e.target.getCenter(); location.current?.setLatLng(latlon); - setValue('lat', latlon.lat) - setValue('lon', latlon.lng) + setValue("lat", latlon.lat); + setValue("lon", latlon.lng); }, }); return ( - - ) -} -export default MarkerLocation \ No newline at end of file + + ); +}; +export default MarkerLocation; diff --git a/src/components/dashboard/inquiryPrivacyFencing/Forms/LocationOnMap/index.jsx b/src/components/dashboard/inquiryPrivacyFencing/Forms/LocationOnMap/index.jsx index fe65106..dfd8854 100644 --- a/src/components/dashboard/inquiryPrivacyFencing/Forms/LocationOnMap/index.jsx +++ b/src/components/dashboard/inquiryPrivacyFencing/Forms/LocationOnMap/index.jsx @@ -11,12 +11,12 @@ const MapLayer = dynamic(() => import("@/core/components/MapLayer"), { const LocationOnMap = ({ setValue, defaultLatLon }) => { return ( - - + + - ) -} -export default LocationOnMap \ No newline at end of file + ); +}; +export default LocationOnMap; diff --git a/src/components/dashboard/inquiryPrivacyFencing/Toolbar.jsx b/src/components/dashboard/inquiryPrivacyFencing/Toolbar.jsx index 73cee6d..843492b 100644 --- a/src/components/dashboard/inquiryPrivacyFencing/Toolbar.jsx +++ b/src/components/dashboard/inquiryPrivacyFencing/Toolbar.jsx @@ -1,7 +1,6 @@ import InquiryPrivacyFencingCreate from "./Actions/Create"; const Toolbar = ({ mutate }) => { - return ( <> diff --git a/src/components/dashboard/inquiryPrivacyFencing/index.jsx b/src/components/dashboard/inquiryPrivacyFencing/index.jsx index c8dd8c9..40e9e58 100644 --- a/src/components/dashboard/inquiryPrivacyFencing/index.jsx +++ b/src/components/dashboard/inquiryPrivacyFencing/index.jsx @@ -13,4 +13,3 @@ const InquiryPrivacyFencingPage = () => { ); }; export default InquiryPrivacyFencingPage; - diff --git a/src/components/dashboard/inquiryPrivacyFencing/inquiryPrivacyFencingList/index.jsx b/src/components/dashboard/inquiryPrivacyFencing/inquiryPrivacyFencingList/index.jsx index 86a2840..0341e45 100644 --- a/src/components/dashboard/inquiryPrivacyFencing/inquiryPrivacyFencingList/index.jsx +++ b/src/components/dashboard/inquiryPrivacyFencing/inquiryPrivacyFencingList/index.jsx @@ -231,12 +231,12 @@ const InquiryPrivacyFencingList = () => { enableColumnFilter: false, }, ], - [], + [] ); return ( <> - + { ); }; export default InquiryPrivacyFencingList; - diff --git a/src/components/layouts/dashboard/headerWithLogo/index.jsx b/src/components/layouts/dashboard/headerWithLogo/index.jsx index 2d0b7bc..9b59fa6 100644 --- a/src/components/layouts/dashboard/headerWithLogo/index.jsx +++ b/src/components/layouts/dashboard/headerWithLogo/index.jsx @@ -4,7 +4,7 @@ import HeaderBottom from "./HaederBottom"; const HeaderWithLogo = () => { return ( - + diff --git a/src/components/layouts/dashboard/headerWithSidebar/index.jsx b/src/components/layouts/dashboard/headerWithSidebar/index.jsx index 0b77983..5190d9e 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/index.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/index.jsx @@ -90,7 +90,7 @@ const HeaderWithSidebar = ({ children }) => { boxSizing: "border-box", borderTop: 1, borderTopColor: "divider", - position: 'inherit' + position: "inherit", }, }} variant="persistent" @@ -103,7 +103,9 @@ const HeaderWithSidebar = ({ children }) => { - v{process.env.NEXT_PUBLIC_VERSION} + + v{process.env.NEXT_PUBLIC_VERSION} +
@@ -114,4 +116,4 @@ const HeaderWithSidebar = ({ children }) => { ); }; -export default HeaderWithSidebar; \ No newline at end of file +export default HeaderWithSidebar; diff --git a/src/core/components/DataTable/Main.js b/src/core/components/DataTable/Main.js index 1f51695..5aed12b 100644 --- a/src/core/components/DataTable/Main.js +++ b/src/core/components/DataTable/Main.js @@ -32,13 +32,11 @@ const DataTable_Main = (props) => { const fetchUrl = useMemo(() => { const isValueEmpty = (value) => { if (Array.isArray(value)) { - return value.length === 0 || value.every(v => v === ""); + return value.length === 0 || value.every((v) => v === ""); } return value === "" || value === null || value === undefined; }; - const filteredFilterData = Object.values(filterData).filter( - (filter) => !isValueEmpty(filter.value), - ); + const filteredFilterData = Object.values(filterData).filter((filter) => !isValueEmpty(filter.value)); const params = new URLSearchParams(); params.set("start", `${pagination.pageIndex * pagination.pageSize}`); diff --git a/src/core/components/DataTable/body/TableBodyCell.js b/src/core/components/DataTable/body/TableBodyCell.js index 43f76f7..39f6895 100644 --- a/src/core/components/DataTable/body/TableBodyCell.js +++ b/src/core/components/DataTable/body/TableBodyCell.js @@ -1,10 +1,10 @@ -import { getCommonMRTCellStyles, parseFromValuesOrFunc } from '@/core/utils/utils'; -import { useTheme } from '@emotion/react'; -import { Skeleton, TableCell } from '@mui/material'; -import { isCellEditable, openEditingCell } from 'material-react-table'; -import { memo, useEffect, useMemo, useState } from 'react'; -import DataTable_CopyButton from '../buttons/CopyButton'; -import DataTable_TableBodyCellValue from './TableBodyCellValue'; +import { getCommonMRTCellStyles, parseFromValuesOrFunc } from "@/core/utils/utils"; +import { useTheme } from "@emotion/react"; +import { Skeleton, TableCell } from "@mui/material"; +import { isCellEditable, openEditingCell } from "material-react-table"; +import { memo, useEffect, useMemo, useState } from "react"; +import DataTable_CopyButton from "../buttons/CopyButton"; +import DataTable_TableBodyCellValue from "./TableBodyCellValue"; const DataTable_TableBodyCell = ({ cell, numRows, rowRef, staticColumnIndex, staticRowIndex, table, ...rest }) => { const theme = useTheme(); @@ -82,10 +82,10 @@ const DataTable_TableBodyCell = ({ cell, numRows, rowRef, staticColumnIndex, sta const borderStyle = showResizeBorder ? `2px solid ${draggingBorderColor} !important` : isDraggingColumn || isDraggingRow - ? `1px dashed ${theme.palette.grey[500]} !important` - : isHoveredColumn || isHoveredRow || isResizingColumn - ? `2px dashed ${draggingBorderColor} !important` - : undefined; + ? `1px dashed ${theme.palette.grey[500]} !important` + : isHoveredColumn || isHoveredRow || isResizingColumn + ? `2px dashed ${draggingBorderColor} !important` + : undefined; if (showResizeBorder) { return columnResizeDirection === "ltr" ? { borderRight: borderStyle } : { borderLeft: borderStyle }; @@ -93,18 +93,18 @@ const DataTable_TableBodyCell = ({ cell, numRows, rowRef, staticColumnIndex, sta return borderStyle ? { - borderBottom: - isDraggingRow || isHoveredRow || (isLastRow && !isResizingColumn) ? borderStyle : undefined, - borderLeft: - isDraggingColumn || isHoveredColumn || ((isDraggingRow || isHoveredRow) && isFirstColumn) - ? borderStyle - : undefined, - borderRight: - isDraggingColumn || isHoveredColumn || ((isDraggingRow || isHoveredRow) && isLastColumn) - ? borderStyle - : undefined, - borderTop: isDraggingRow || isHoveredRow ? borderStyle : undefined, - } + borderBottom: + isDraggingRow || isHoveredRow || (isLastRow && !isResizingColumn) ? borderStyle : undefined, + borderLeft: + isDraggingColumn || isHoveredColumn || ((isDraggingRow || isHoveredRow) && isFirstColumn) + ? borderStyle + : undefined, + borderRight: + isDraggingColumn || isHoveredColumn || ((isDraggingRow || isHoveredRow) && isLastColumn) + ? borderStyle + : undefined, + borderTop: isDraggingRow || isHoveredRow ? borderStyle : undefined, + } : undefined; }, [columnSizingInfo.isResizingColumn, draggingColumn, draggingRow, hoveredColumn, hoveredRow, staticRowIndex]); @@ -178,8 +178,8 @@ const DataTable_TableBodyCell = ({ cell, numRows, rowRef, staticColumnIndex, sta "&:hover": { outline: actionCell?.id === cell.id || - (editDisplayMode === "cell" && isEditable) || - (editDisplayMode === "table" && (isCreating || isEditing)) + (editDisplayMode === "cell" && isEditable) || + (editDisplayMode === "table" && (isCreating || isEditing)) ? `1px solid ${theme.palette.grey[500]}` : undefined, textOverflow: "clip", @@ -188,8 +188,8 @@ const DataTable_TableBodyCell = ({ cell, numRows, rowRef, staticColumnIndex, sta cursor: isRightClickable ? "context-menu" : isEditable && editDisplayMode === "cell" - ? "pointer" - : "inherit", + ? "pointer" + : "inherit", outline: actionCell?.id === cell.id ? `1px solid ${theme.palette.grey[500]}` : undefined, outlineOffset: "-1px", overflow: "hidden", @@ -199,12 +199,12 @@ const DataTable_TableBodyCell = ({ cell, numRows, rowRef, staticColumnIndex, sta ? "0 0.5rem" : "0.5rem" : density === "comfortable" - ? columnDefType === "display" - ? "0.5rem 0.75rem" - : "1rem" - : columnDefType === "display" - ? "1rem 1.25rem" - : "1.5rem", + ? columnDefType === "display" + ? "0.5rem 0.75rem" + : "1rem" + : columnDefType === "display" + ? "1rem 1.25rem" + : "1.5rem", textOverflow: columnDefType !== "display" ? "ellipsis" : undefined, whiteSpace: row.getIsPinned() || density === "compact" ? "nowrap" : "normal", @@ -215,7 +215,7 @@ const DataTable_TableBodyCell = ({ cell, numRows, rowRef, staticColumnIndex, sta theme, }), ...draggingBorders, - backgroundColor: baseBackgroundColor + backgroundColor: baseBackgroundColor, })} > {tableCellProps.children ?? ( @@ -225,8 +225,8 @@ const DataTable_TableBodyCell = ({ cell, numRows, rowRef, staticColumnIndex, sta ) : showSkeletons !== false && (isLoading || showSkeletons) ? ( ) : columnDefType === "display" && - (["mrt-row-expand", "mrt-row-numbers", "mrt-row-select"].includes(column.id) || - !row.getIsGrouped()) ? ( + (["mrt-row-expand", "mrt-row-numbers", "mrt-row-select"].includes(column.id) || + !row.getIsGrouped()) ? ( columnDef.Cell?.({ cell, column, diff --git a/src/core/components/DataTable/body/TableBodyRow.js b/src/core/components/DataTable/body/TableBodyRow.js index e35f29a..2d21f32 100644 --- a/src/core/components/DataTable/body/TableBodyRow.js +++ b/src/core/components/DataTable/body/TableBodyRow.js @@ -91,16 +91,16 @@ const DataTable_TableBodyRow = ({ const cellHighlightColor = isRowSelected ? selectedRowBackgroundColor : isRowPinned - ? pinnedRowBackgroundColor - : undefined; + ? pinnedRowBackgroundColor + : undefined; const cellHighlightColorHover = tableRowProps?.hover !== false ? isRowSelected ? cellHighlightColor : theme.palette.mode === "dark" - ? `${lighten(baseBackgroundColor, 0.2)}` - : `${darken(baseBackgroundColor, 0.2)}` + ? `${lighten(baseBackgroundColor, 0.2)}` + : `${darken(baseBackgroundColor, 0.2)}` : undefined; return ( @@ -126,9 +126,9 @@ const DataTable_TableBodyRow = ({ sx={(theme) => ({ "&:hover td:after": cellHighlightColorHover ? { - backgroundColor: alpha(cellHighlightColorHover, 0.3), - ...commonCellBeforeAfterStyles, - } + backgroundColor: alpha(cellHighlightColorHover, 0.3), + ...commonCellBeforeAfterStyles, + } : undefined, bottom: !virtualRow && bottomPinnedIndex !== undefined && isRowPinned @@ -140,24 +140,25 @@ const DataTable_TableBodyRow = ({ position: virtualRow ? "absolute" : rowPinningDisplayMode?.includes("sticky") && isRowPinned - ? "sticky" - : "relative", + ? "sticky" + : "relative", td: { ...getCommonPinnedCellStyles({ table, theme }), }, "td:after": cellHighlightColor ? { - backgroundColor: cellHighlightColor, - ...commonCellBeforeAfterStyles, - } + backgroundColor: cellHighlightColor, + ...commonCellBeforeAfterStyles, + } : undefined, top: virtualRow ? 0 : topPinnedIndex !== undefined && isRowPinned - ? `${topPinnedIndex * rowHeight + - (enableStickyHeader || isFullScreen ? tableHeadHeight - 1 : 0) + ? `${ + topPinnedIndex * rowHeight + + (enableStickyHeader || isFullScreen ? tableHeadHeight - 1 : 0) }px` - : undefined, + : undefined, transition: virtualRow ? "none" : "all 150ms ease-in-out", width: "100%", zIndex: rowPinningDisplayMode?.includes("sticky") && isRowPinned ? 2 : 0, @@ -181,11 +182,11 @@ const DataTable_TableBodyRow = ({ }; return cell ? ( memoMode === "cells" && - cell.column.columnDef.columnDefType === "data" && - !draggingColumn && - !draggingRow && - editingCell?.id !== cell.id && - editingRow?.id !== row.id ? ( + cell.column.columnDef.columnDefType === "data" && + !draggingColumn && + !draggingRow && + editingCell?.id !== cell.id && + editingRow?.id !== row.id ? ( ) : ( diff --git a/src/core/components/DataTable/filter/FilterBodyField.jsx b/src/core/components/DataTable/filter/FilterBodyField.jsx index 7f0337e..a9bef12 100644 --- a/src/core/components/DataTable/filter/FilterBodyField.jsx +++ b/src/core/components/DataTable/filter/FilterBodyField.jsx @@ -18,15 +18,15 @@ const columnFilterModeOptionFa = { }; function FilterBodyField({ - column, - filterParameters, - handleChange, - handleBlur, - setFieldValue, - errors, - touched, - resetForm, - }) { + column, + filterParameters, + handleChange, + handleBlur, + setFieldValue, + errors, + touched, + resetForm, +}) { const [anchorEl, setAnchorEl] = useState(null); const defaultFilterTranslation = columnFilterModeOptionFa[filterParameters.filterFn] || filterParameters.filterFn; @@ -48,8 +48,8 @@ function FilterBodyField({ touched={touched} /> ) : filterParameters.datatype === "numeric" && - filterParameters.filterFn === "equals" && - Array.isArray(column.columnSelectOption) ? ( + filterParameters.filterFn === "equals" && + Array.isArray(column.columnSelectOption) ? ( { diff --git a/src/core/components/DataTable/head/TableHeadCell.js b/src/core/components/DataTable/head/TableHeadCell.js index 046f833..631a122 100644 --- a/src/core/components/DataTable/head/TableHeadCell.js +++ b/src/core/components/DataTable/head/TableHeadCell.js @@ -67,20 +67,20 @@ const DataTable_TableHeadCell = ({ columnVirtualizer, header, staticColumnIndex, const borderStyle = showResizeBorder ? `2px solid ${draggingBorderColor} !important` : draggingColumn?.id === column.id - ? `1px dashed ${theme.palette.grey[500]}` - : hoveredColumn?.id === column.id - ? `2px dashed ${draggingBorderColor}` - : undefined; + ? `1px dashed ${theme.palette.grey[500]}` + : hoveredColumn?.id === column.id + ? `2px dashed ${draggingBorderColor}` + : undefined; if (showResizeBorder) { return columnResizeDirection === "ltr" ? { borderRight: borderStyle } : { borderLeft: borderStyle }; } const draggingBorders = borderStyle ? { - borderLeft: borderStyle, - borderRight: borderStyle, - borderTop: borderStyle, - } + borderLeft: borderStyle, + borderRight: borderStyle, + borderTop: borderStyle, + } : undefined; return draggingBorders; @@ -151,19 +151,19 @@ const DataTable_TableHeadCell = ({ columnVirtualizer, header, staticColumnIndex, density === "compact" ? "0.5rem" : density === "comfortable" - ? columnDefType === "display" - ? "0.75rem" - : "1rem" - : columnDefType === "display" - ? "1rem 1.25rem" - : "1.5rem", + ? columnDefType === "display" + ? "0.75rem" + : "1rem" + : columnDefType === "display" + ? "1rem 1.25rem" + : "1.5rem", pb: columnDefType === "display" ? 0 : showColumnFilters || density === "compact" ? "0.4rem" : "0.6rem", pt: columnDefType === "group" || density === "compact" ? "0.25rem" : density === "comfortable" - ? ".75rem" - : "1.25rem", + ? ".75rem" + : "1.25rem", userSelect: enableMultiSort && column.getCanSort() ? "none" : undefined, verticalAlign: "middle", ...getCommonMRTCellStyles({ @@ -188,8 +188,8 @@ const DataTable_TableHeadCell = ({ columnVirtualizer, header, staticColumnIndex, columnDefType === "group" || tableCellProps?.align === "center" ? "center" : column.getCanResize() - ? "space-between" - : "flex-start", + ? "space-between" + : "flex-start", position: "relative", width: "100%", }} @@ -218,7 +218,7 @@ const DataTable_TableHeadCell = ({ columnVirtualizer, header, staticColumnIndex, textAlign: "start", color: "#fff", fontWeight: "400", - whiteSpace: "nowrap" + whiteSpace: "nowrap", }} > {HeaderElement} @@ -226,9 +226,10 @@ const DataTable_TableHeadCell = ({ columnVirtualizer, header, staticColumnIndex, {column.getCanSort() && columnDefType !== "group" && ( {columns.map((column) => ( - + ))} @@ -50,4 +45,4 @@ function HideBody({ columns, drawerState, setDrawerState }) { ); } -export default HideBody; \ No newline at end of file +export default HideBody; diff --git a/src/core/components/DataTable/hide/HideBodyField.jsx b/src/core/components/DataTable/hide/HideBodyField.jsx index fe3dc2d..6b60966 100644 --- a/src/core/components/DataTable/hide/HideBodyField.jsx +++ b/src/core/components/DataTable/hide/HideBodyField.jsx @@ -22,7 +22,7 @@ const CustomTreeItem = styled(TreeItem)(({ theme }) => ({ function HideBodyField({ column, hideData, setHideData }) { const handleCheckboxChange = () => { - setHideData(prevData => { + setHideData((prevData) => { const updateHideData = (data, id) => { if (data.hasOwnProperty(id)) { return { ...data, [id]: !data[id] }; @@ -44,11 +44,7 @@ function HideBodyField({ column, hideData, setHideData }) { if (typeof hideData[column.id] === "boolean") { return ( - + {column.header} ); @@ -77,4 +73,4 @@ function HideBodyField({ column, hideData, setHideData }) { ); } -export default HideBodyField; \ No newline at end of file +export default HideBodyField; diff --git a/src/core/components/DataTable/hide/HideOrShowAll.jsx b/src/core/components/DataTable/hide/HideOrShowAll.jsx index ee3a903..c0d2e8d 100644 --- a/src/core/components/DataTable/hide/HideOrShowAll.jsx +++ b/src/core/components/DataTable/hide/HideOrShowAll.jsx @@ -67,4 +67,4 @@ function HideOrShowAll({ hideData, setHideData }) { ); } -export default HideOrShowAll; \ No newline at end of file +export default HideOrShowAll; diff --git a/src/core/components/DataTable/reset/ResetStorage.jsx b/src/core/components/DataTable/reset/ResetStorage.jsx index 6d8a534..9f6abd5 100644 --- a/src/core/components/DataTable/reset/ResetStorage.jsx +++ b/src/core/components/DataTable/reset/ResetStorage.jsx @@ -19,4 +19,4 @@ function ResetStorage({ user_id, page_name, table_name }) { ); } -export default ResetStorage; \ No newline at end of file +export default ResetStorage; diff --git a/src/core/components/DataTable/table/Paper.js b/src/core/components/DataTable/table/Paper.js index 05a0dbb..f972030 100644 --- a/src/core/components/DataTable/table/Paper.js +++ b/src/core/components/DataTable/table/Paper.js @@ -5,17 +5,17 @@ import DataTable_TopToolbar from "../toolbar/TopToolbar"; import DataTable_TableContainer from "./TableContainer"; const DataTable_Paper = ({ - table, - table_name, - columns, - user_id, - page_name, - mutate, - need_filter, - table_url, - table_title, - ...rest - }) => { + table, + table_name, + columns, + user_id, + page_name, + mutate, + need_filter, + table_url, + table_title, + ...rest +}) => { const { getState, options: { @@ -50,19 +50,19 @@ const DataTable_Paper = ({ style={{ ...(isFullScreen ? { - bottom: 0, - height: "100dvh", - left: 0, - margin: 0, - maxHeight: "100dvh", - maxWidth: "100dvw", - padding: 0, - position: "fixed", - right: 0, - top: 0, - width: "100dvw", - zIndex: 999, - } + bottom: 0, + height: "100dvh", + left: 0, + margin: 0, + maxHeight: "100dvh", + maxWidth: "100dvw", + padding: 0, + position: "fixed", + right: 0, + top: 0, + width: "100dvw", + zIndex: 999, + } : {}), ...paperProps?.style, }} diff --git a/src/core/components/DataTable/toolbar/TopToolbar.js b/src/core/components/DataTable/toolbar/TopToolbar.js index fc21ae7..a4d9db7 100644 --- a/src/core/components/DataTable/toolbar/TopToolbar.js +++ b/src/core/components/DataTable/toolbar/TopToolbar.js @@ -8,16 +8,16 @@ import ResetStorage from "@/core/components/DataTable/reset/ResetStorage"; import HideColumn from "@/core/components/DataTable/hide"; const DataTable_TopToolbar = ({ - mutate, - need_filter, - table, - columns, - table_url, - user_id, - page_name, - table_name, - table_title, - }) => { + mutate, + need_filter, + table, + columns, + table_url, + user_id, + page_name, + table_name, + table_title, +}) => { const { getState, options: { @@ -70,13 +70,21 @@ const DataTable_TopToolbar = ({ width: "100%", }} > - {renderTopToolbarCustomActions?.({ table })} - {table_title || ""} + + {renderTopToolbarCustomActions?.({ table })} + + + {table_title || ""} + {enableToolbarInternalActions && ( - + + table_name={table_name} + /> {need_filter && ( ; }); -export default DialogTransition \ No newline at end of file +export default DialogTransition; diff --git a/src/core/components/MapLayer/Loading/index.jsx b/src/core/components/MapLayer/Loading/index.jsx index 5d42012..806168c 100644 --- a/src/core/components/MapLayer/Loading/index.jsx +++ b/src/core/components/MapLayer/Loading/index.jsx @@ -2,11 +2,7 @@ import { Box, LinearProgress, Stack } from "@mui/material"; function MapLoading() { return ( - + @@ -14,4 +10,4 @@ function MapLoading() { ); } -export default MapLoading; \ No newline at end of file +export default MapLoading; diff --git a/src/core/components/MapLayer/index.jsx b/src/core/components/MapLayer/index.jsx index 52209da..1a07c9c 100644 --- a/src/core/components/MapLayer/index.jsx +++ b/src/core/components/MapLayer/index.jsx @@ -1,7 +1,7 @@ "use client"; import { MapContainer, TileLayer, useMap } from "react-leaflet"; -export const IRAN_CENTER = L.latLng(32.4279, 53.6880); +export const IRAN_CENTER = L.latLng(32.4279, 53.688); const MapOptions = ({ options }) => { const map = useMap(); @@ -40,4 +40,4 @@ function MapLayer({ children, style, otherLayers, options }) { ); } -export default MapLayer; \ No newline at end of file +export default MapLayer; diff --git a/src/core/components/NotificationDesign/AskForKeepData.jsx b/src/core/components/NotificationDesign/AskForKeepData.jsx index fa9bfa6..9e1cbd9 100644 --- a/src/core/components/NotificationDesign/AskForKeepData.jsx +++ b/src/core/components/NotificationDesign/AskForKeepData.jsx @@ -10,9 +10,7 @@ import { flattenObjectOfObjects } from "@/core/utils/flattenObjectOfObjects"; function AskForKeepData({ filterData, sortData, hideData, user_id, page_name, table_name, columns }) { const { filterAction, sortAction, hideAction } = useTableSetting(); - const filteredHideData = Object.fromEntries( - Object.entries(hideData).filter(([key, value]) => value === false), - ); + const filteredHideData = Object.fromEntries(Object.entries(hideData).filter(([key, value]) => value === false)); const flattenHideData = flattenObjectOfObjects(filteredHideData); @@ -53,19 +51,10 @@ function AskForKeepData({ filterData, sortData, hideData, user_id, page_name, ta آیا مایل به ذخیره تغییر های اعمال شده برای دفعات بعد هستید؟ - - @@ -73,4 +62,4 @@ function AskForKeepData({ filterData, sortData, hideData, user_id, page_name, ta ); } -export default AskForKeepData; \ No newline at end of file +export default AskForKeepData; diff --git a/src/core/components/PageTitle.jsx b/src/core/components/PageTitle.jsx index 605ad47..4c93098 100644 --- a/src/core/components/PageTitle.jsx +++ b/src/core/components/PageTitle.jsx @@ -4,9 +4,15 @@ import { Chip, Divider, Typography } from "@mui/material"; const PageTitle = ({ title }) => { return ( - {title}} /> + + + {title} + + } + /> + ); }; export default PageTitle; - diff --git a/src/core/components/SidebarMenu.jsx b/src/core/components/SidebarMenu.jsx index 736b032..a2c0531 100644 --- a/src/core/components/SidebarMenu.jsx +++ b/src/core/components/SidebarMenu.jsx @@ -35,48 +35,48 @@ function reducer(state, action) { return state.map((item) => action.id == item.id ? { - ...item, - showSubitems: !item.showSubitems, - } + ...item, + showSubitems: !item.showSubitems, + } : item ); case "COLLAPSE_SUB_ITEMS": return state.map((item) => { return item.hasSubitems ? { - ...item, - Subitems: item.Subitems.map((subitem) => - action.id === subitem.id - ? { - ...subitem, - showSubitems: !subitem.showSubitems, - } - : subitem - ), - } + ...item, + Subitems: item.Subitems.map((subitem) => + action.id === subitem.id + ? { + ...subitem, + showSubitems: !subitem.showSubitems, + } + : subitem + ), + } : item; }); case "COLLAPSE_SUB_SECOND_ITEMS": return state.map((item) => { return item.hasSubitems ? { - ...item, - Subitems: item.Subitems.map((subitem) => { - return subitem.hasSubitems - ? { - ...subitem, - Subitems: subitem.Subitems.map((secondSubitem) => - action.id === secondSubitem.id - ? { - ...secondSubitem, - showSubitems: !secondSubitem.showSubitems, - } - : secondSubitem - ), - } - : subitem; - }), - } + ...item, + Subitems: item.Subitems.map((subitem) => { + return subitem.hasSubitems + ? { + ...subitem, + Subitems: subitem.Subitems.map((secondSubitem) => + action.id === secondSubitem.id + ? { + ...secondSubitem, + showSubitems: !secondSubitem.showSubitems, + } + : secondSubitem + ), + } + : subitem; + }), + } : item; }); case "SELECTED": diff --git a/src/core/components/StyledForm.jsx b/src/core/components/StyledForm.jsx index 4513129..accf0ab 100644 --- a/src/core/components/StyledForm.jsx +++ b/src/core/components/StyledForm.jsx @@ -1,5 +1,5 @@ import { styled } from "@mui/material"; -const StyledForm = styled('form')``; +const StyledForm = styled("form")``; export default StyledForm; diff --git a/src/core/utils/cacheRtl.js b/src/core/utils/cacheRtl.js index 6cf5267..a646aa5 100644 --- a/src/core/utils/cacheRtl.js +++ b/src/core/utils/cacheRtl.js @@ -4,7 +4,7 @@ import { prefixer } from "stylis"; import stylisRTLPlugin from "stylis-plugin-rtl"; import { CacheProvider } from "@emotion/react"; -const isBrowser = typeof document !== 'undefined'; +const isBrowser = typeof document !== "undefined"; const createEmotionCache = () => { let insertionPoint; diff --git a/src/core/utils/errorResponse.js b/src/core/utils/errorResponse.js index 9eae51c..c71bfed 100644 --- a/src/core/utils/errorResponse.js +++ b/src/core/utils/errorResponse.js @@ -19,7 +19,7 @@ const errorServer = (response, notification, toastContainer) => { const errorClient = (response, notification, toastContainer, logout) => { switch (response.status) { case 401: - logout() + logout(); if (notification) errorUnauthorizedToast(toastContainer); break; case 422: diff --git a/src/core/utils/flattenArrayOfObjects.js b/src/core/utils/flattenArrayOfObjects.js index ec3cc23..e4d5051 100644 --- a/src/core/utils/flattenArrayOfObjects.js +++ b/src/core/utils/flattenArrayOfObjects.js @@ -7,4 +7,3 @@ export const flattenArrayOfObjects = (array, key) => { return acc; }, []); }; - diff --git a/src/core/utils/flattenObjectOfObjects.jsx b/src/core/utils/flattenObjectOfObjects.jsx index 3fdac84..fb03576 100644 --- a/src/core/utils/flattenObjectOfObjects.jsx +++ b/src/core/utils/flattenObjectOfObjects.jsx @@ -9,4 +9,4 @@ export const flattenObjectOfObjects = (obj, res = {}) => { } } return res; -}; \ No newline at end of file +}; diff --git a/src/lib/contexts/DataTable.js b/src/lib/contexts/DataTable.js index 789df28..ff3439c 100644 --- a/src/lib/contexts/DataTable.js +++ b/src/lib/contexts/DataTable.js @@ -23,7 +23,7 @@ const DataTableProvider = ({ children, user_id, page_name, table_name, columns } const filterValues = flatColumns.reduce((acc, column) => { if (!column.enableColumnFilter) return acc; const storeFilter = settingStore?.[user_id]?.[page_name]?.[table_name]?.["filters"]?.find( - (filter) => filter.id === column.id, + (filter) => filter.id === column.id ); if (column.datatype === "array") { acc[column.id] = { @@ -100,7 +100,7 @@ const DataTableProvider = ({ children, user_id, page_name, table_name, columns } position: "bottom-left", draggable: true, autoClose: false, - }, + } ); } else { toast.update("keep_data", { diff --git a/src/lib/contexts/auth.js b/src/lib/contexts/auth.js index 074c8db..0dfa41a 100644 --- a/src/lib/contexts/auth.js +++ b/src/lib/contexts/auth.js @@ -49,7 +49,7 @@ export const AuthProvider = ({ children }) => { clearUser(); changeAuthState(false); changeInitAuth(true); - } + }; const getUser = useCallback(async () => { try { @@ -77,7 +77,7 @@ export const AuthProvider = ({ children }) => { isAuth: state.isAuth, initAuthState: state.initAuthState, getUser, - logout + logout, }} > {children} diff --git a/src/lib/contexts/tableSetting.js b/src/lib/contexts/tableSetting.js index 0484511..55d4e29 100644 --- a/src/lib/contexts/tableSetting.js +++ b/src/lib/contexts/tableSetting.js @@ -130,4 +130,4 @@ export const TableSettingProvider = ({ children }) => { {children} ); -}; \ No newline at end of file +}; diff --git a/src/lib/hooks/useRequest.js b/src/lib/hooks/useRequest.js index 48a2080..eb30a18 100644 --- a/src/lib/hooks/useRequest.js +++ b/src/lib/hooks/useRequest.js @@ -16,7 +16,7 @@ const defaultOptions = { }; const useRequest = (initOptions) => { - const { logout } = useAuth() + const { logout } = useAuth(); const _options = Object.assign({}, defaultOptions, initOptions); @@ -38,7 +38,8 @@ const useRequest = (initOptions) => { errorResponse( error.response, mergedOptions.notification.show && mergedOptions.notification.failed, - "request_data", logout + "request_data", + logout ); } throw error; From 980a5248f4c135f5e1f8a1f0cb8515d5947d5723 Mon Sep 17 00:00:00 2001 From: Amirhossein Mahmoodi Date: Sun, 18 Aug 2024 13:19:58 +0330 Subject: [PATCH 07/31] add header menu --- .../headerWithSidebar/HeaderMenu/index.jsx | 53 +++++++++++- .../dashboard/headerWithSidebar/index.jsx | 3 +- src/core/utils/headerMenu.js | 80 +++++++++++++++++++ 3 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 src/core/utils/headerMenu.js diff --git a/src/components/layouts/dashboard/headerWithSidebar/HeaderMenu/index.jsx b/src/components/layouts/dashboard/headerWithSidebar/HeaderMenu/index.jsx index c705242..5dcf168 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/HeaderMenu/index.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/HeaderMenu/index.jsx @@ -1,4 +1,53 @@ -const HeaderMenu = () => { - return <>منو; +import { ExpandLess, ExpandMore, Link } from "@mui/icons-material"; +import { Button, Divider, ListItemIcon, ListItemText, Menu, MenuItem } from "@mui/material"; +import NextLink from "next/link"; +import { useState } from "react"; + +const HeaderMenu = ({ menu }) => { + const [anchorEl, setAnchorEl] = useState(null); + const open = Boolean(anchorEl); + + const handleClick = (event) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + + return ( + <> + + + {menu.subMenu.map((subMenu, index) => ( + <> + {subMenu.map(sub => ( + + + + + + {sub.title} + + ))} + {menu.subMenu.length - 1 !== index && ( + + )} + + ))} + + + ); }; export default HeaderMenu; diff --git a/src/components/layouts/dashboard/headerWithSidebar/index.jsx b/src/components/layouts/dashboard/headerWithSidebar/index.jsx index 5190d9e..7ff7e4f 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/index.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/index.jsx @@ -6,6 +6,7 @@ import { Box, Drawer, IconButton, Stack, styled, Toolbar, Typography } from "@mu import MuiAppBar from "@mui/material/AppBar"; import { useState } from "react"; import HeaderMenu from "./HeaderMenu"; +import { headerMenu } from "@/core/utils/headerMenu"; const drawerWidth = 300; @@ -75,7 +76,7 @@ const HeaderWithSidebar = ({ children }) => { - + {headerMenu.map(menu => )} diff --git a/src/core/utils/headerMenu.js b/src/core/utils/headerMenu.js new file mode 100644 index 0000000..4f42f34 --- /dev/null +++ b/src/core/utils/headerMenu.js @@ -0,0 +1,80 @@ +export const headerMenu = [ + { + title: 'تصادفات', + subMenu: [ + [ + { + title: 'تصادفات روزانه', + href: 'https://rms.witel.ir/v2/daily_accidents/create' + } + ] + ] + }, + { + title: 'گزارش های جامع', + subMenu: [ + [ + { + title: 'گزارش محوری', + href: 'https://rms.witel.ir/v2/axis_reports' + }, + { + title: 'هوش تجاری (‌BI)', + href: 'https://rms.witel.ir/v2/axis_reports' + } + ] + ] + }, + { + title: 'زیرساخت و ناوگان', + subMenu: [ + [ + { + title: 'پراکندگی بر روی نقشه راهدارخانه ها', + href: 'https://rms.witel.ir/v2/map?type=rahdar' + }, + { + title: 'راهدارخانه ها', + href: 'https://rms.witel.ir/v2/rahdari_points' + } + ], + [ + { + title: 'ممیزی ماشین آلات راهداری کشور', + href: 'https://rms.witel.ir/cmms-audit' + } + ] + ] + }, + { + title: 'سامانه های راهداری', + subMenu: [ + [ + { + title: 'تحقیق و توسعه', + href: 'https://rms.witel.ir/RandD' + }, + { + title: 'سامانه مدیریت یکپارچه زیرساخت های راه (PMS,BMS,SMS)', + href: 'http://roadams.rmto.ir' + }, + { + title: 'سامانه مدیریت ناوگان (FMS)', + href: 'http://fms.141.ir' + }, + { + title: 'سامانه جامع مدیریت سوانح و حوادث جاده ای', + href: 'https://items.rmto.ir' + }, + { + title: 'سامانه مدیریت نگهداری ماشین آلات (CMMS)', + href: 'https://cmms.rmto.ir/Login.aspx?ReturnUrl=%2f' + }, + { + title: 'درگاه کاتالوگ داده', + href: 'https://roadams.rmto.ir:8080' + } + ] + ] + } +] \ No newline at end of file From 15bab1a6a44b8e42c4c5ab497e3c7d68c20d794c Mon Sep 17 00:00:00 2001 From: Amirhossein Mahmoodi Date: Sun, 18 Aug 2024 15:25:20 +0330 Subject: [PATCH 08/31] change style headers --- src/assets/images/rmsLogo.png | Bin 17747 -> 3340 bytes .../headerWithLogo/HaederBottom/index.jsx | 4 ++-- .../headerWithLogo/HaederTop/index.jsx | 2 +- .../dashboard/headerWithSidebar/index.jsx | 5 ++++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/assets/images/rmsLogo.png b/src/assets/images/rmsLogo.png index 8340d5aab2b5b5fcc0942998129e90a6cc2dbc54..49795c3304ada0bc0eed3d4bc70aec770b875a77 100644 GIT binary patch literal 3340 zcmV+n4fFDeP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T@T}D@>i|vIsB6Boa^; zxw0#Z-G%8Z;q&rXL^6*|yTxPezcnsCX@VT_BaFd>P-G}o5!E!r@gj18 zs)VGl56O`xq)0)y4}u~g?`LHjCm*}S7{QHUzlzu{w!9F`0sQQR!%-{6MvOwpD!SD` zqC!H^8fJhmciiI#D;y^T+OQTNoWO>4(f917TYx*LQDD~Q@nS+wD+dWd`=%)(k96c# zt{VREw$#yc_Pxgo<{2_rLBDwzMX-*yE@aZSML$PpyMU;RB5E?4IRq&+x`S;&Q)#H%FQLSN}&hJZWVSvuuXJi5tg3Wz#+EhheSrq*xHL1 zEU$^8Wv~=xerrSFpyv&Uz>S3Co(4be&#EoQc2bqu#uvI9%k%%e^YKvas+9g_1OG>h zl^+res11^$%}L0r+Jy#CVRXN}urcPjEUmJP1Xj>AP01_WFut()m%D~`iHw}SW2hh+ zwh-RfQ-uryKMXtOFDltE{xK$>JbAkqj5p+iiE;_YBbDtc1gInhPEc81T)KJUyG+kt z)MvID_J0_kbN1vt55IA{*(7cfM00cl1hA$m2df~ZK2oxA(g#exeofjUt4Jn6Vy^Rr zl&6yOP910S?I9)+F#9}?h{c#ionG}+ReH2^!-Qx{&=MnO>=+F3QVdqRJ!%~&T&z5( zn)1SD=X>Uzd-Kj9(;GE&*Bq$G&vP7ahMIt&b49Wo+!+Zs{^lQlo9<>h4Tb3o672js zH3AKxKv1Jkamz@#Ejj!2c_xpARzxx$Dv85}Pyy`hJQfcmT1{n-Dn}kF+dQd6S8Iig zj3NX1amrJ`I~%vOPPpkSaGP8R_mKuue5NA9nnZvji3+}?W|ywN|2ch$DC$?IeUxC~ ze(nis(fxDAaj3zkPIcx~Mq80sXq~mhzzR!z&v|TTnJanard{AlnXGGtgaPfhQVy;<^t&XQflm{#1S27^2AXv;6rIt9 zG0}=h4eqhF(c?a0j_U!LD0CnkZoK=zmZ>Lnafe`j?w9KCf*P=f^+YVgu?o$yn_yrC zF0hRTn(ivwH06-~m5ZRN=y!pD@?WEfp_fByeL#EOnOpghE{=&-uBB~2iLZQ_Irdfe zoTU3w_OH&*&%fm7H5rfW8Upc93@+6dtfQ!^ytH)Vgd$xW6LqW8=em-GR~l>O*B#lF z59-tHqLoF0?iB9VJxZn>={G#-N&EBH>(iHnvP~1-cYDh3k|V*VBsDOiGb9+`rfz0! zwnpg}`qZTX&f7=nmYZqa>Yt3&r@mLfIsRk%>W#FnFnydp)gf93I|Ie1~@hX;5)iey4cv`gp=+9W~=*`va-m0&u7oj>&H?*%5TPPRD(LDtX*)(&b% zOSDPEnN@zc(XSj&aEgib4aVvEbhm@97y_pnypTN)gBx3~Pj?D!5`k1kp-V1g57Ky^ zEU#ISXw^mCiW=jY1rC>(=5COy96`fweY#UnETtIC>+PXxSxFFP|s6h$Mb>&oS)J2ztvw!HFXf@K;Yze~fpjYww z1M<-1<)=T>#a%+Dh%i7`y4Gpsmq4{eL5aTF6hh0cTUODfQ(Q|ltm%CpPiQfu+LS

U*R_dc7x)K}Cyv00;Y@I80KVDH-A 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 diff --git a/src/components/layouts/dashboard/headerWithLogo/HaederBottom/index.jsx b/src/components/layouts/dashboard/headerWithLogo/HaederBottom/index.jsx index f23833c..1ab9f22 100644 --- a/src/components/layouts/dashboard/headerWithLogo/HaederBottom/index.jsx +++ b/src/components/layouts/dashboard/headerWithLogo/HaederBottom/index.jsx @@ -15,9 +15,9 @@ const HeaderBottom = () => { alignItems={"center"} direction={"row"} > - + - theme.palette.primary2.contrastText }}> + theme.palette.primary2.contrastText }}> سامانه جامع راهداری theme.palette.primary2.contrastText }}>rms.rmto.ir diff --git a/src/components/layouts/dashboard/headerWithLogo/HaederTop/index.jsx b/src/components/layouts/dashboard/headerWithLogo/HaederTop/index.jsx index 2c0c3b6..4926625 100644 --- a/src/components/layouts/dashboard/headerWithLogo/HaederTop/index.jsx +++ b/src/components/layouts/dashboard/headerWithLogo/HaederTop/index.jsx @@ -5,7 +5,7 @@ import HeaderLogo from "@/assets/images/headerLogo.png"; const HeaderTop = () => { return ( - + ); }; diff --git a/src/components/layouts/dashboard/headerWithSidebar/index.jsx b/src/components/layouts/dashboard/headerWithSidebar/index.jsx index 7ff7e4f..288ef6c 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/index.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/index.jsx @@ -9,6 +9,7 @@ import HeaderMenu from "./HeaderMenu"; import { headerMenu } from "@/core/utils/headerMenu"; const drawerWidth = 300; +const headersHeight = 136 const Main = styled(Stack, { shouldForwardProp: (prop) => prop !== "open" })(({ theme, open }) => ({ flexGrow: 1, @@ -63,7 +64,9 @@ const HeaderWithSidebar = ({ children }) => { setOpen(false); }; return ( - + Date: Sun, 18 Aug 2024 15:25:31 +0330 Subject: [PATCH 09/31] fixed bug --- .../headerWithSidebar/HeaderMenu/index.jsx | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/components/layouts/dashboard/headerWithSidebar/HeaderMenu/index.jsx b/src/components/layouts/dashboard/headerWithSidebar/HeaderMenu/index.jsx index 5dcf168..0d87a5d 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/HeaderMenu/index.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/HeaderMenu/index.jsx @@ -30,24 +30,25 @@ const HeaderMenu = ({ menu }) => { open={open} onClose={handleClose} > - {menu.subMenu.map((subMenu, index) => ( - <> - {subMenu.map(sub => ( - - - - - - {sub.title} - - ))} - {menu.subMenu.length - 1 !== index && ( - - )} - - ))} + {menu.subMenu.flatMap((subMenu, index) => [ + ...subMenu.map(sub => ( + + + + + {sub.title} + + )), + index < menu.subMenu.length - 1 && + ])} ); }; + export default HeaderMenu; From f258dedc78cd2768412c4bcc8d2ebf756f371315 Mon Sep 17 00:00:00 2001 From: Amirhossein Mahmoodi Date: Sun, 18 Aug 2024 15:38:23 +0330 Subject: [PATCH 10/31] change style --- src/components/dashboard/inquiryPrivacyFencing/index.jsx | 2 +- .../inquiryPrivacyFencing/inquiryPrivacyFencingList/index.jsx | 2 +- src/components/layouts/dashboard/headerWithSidebar/index.jsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacyFencing/index.jsx b/src/components/dashboard/inquiryPrivacyFencing/index.jsx index 40e9e58..794be55 100644 --- a/src/components/dashboard/inquiryPrivacyFencing/index.jsx +++ b/src/components/dashboard/inquiryPrivacyFencing/index.jsx @@ -6,7 +6,7 @@ import { Stack } from "@mui/material"; const InquiryPrivacyFencingPage = () => { return ( - + diff --git a/src/components/dashboard/inquiryPrivacyFencing/inquiryPrivacyFencingList/index.jsx b/src/components/dashboard/inquiryPrivacyFencing/inquiryPrivacyFencingList/index.jsx index 0341e45..24871ed 100644 --- a/src/components/dashboard/inquiryPrivacyFencing/inquiryPrivacyFencingList/index.jsx +++ b/src/components/dashboard/inquiryPrivacyFencing/inquiryPrivacyFencingList/index.jsx @@ -236,7 +236,7 @@ const InquiryPrivacyFencingList = () => { return ( <> - + {

- + {children}
From 63d284a64fd3c9da9a735932266b19250b84eafb Mon Sep 17 00:00:00 2001 From: Amirhossein Mahmoodi Date: Mon, 19 Aug 2024 13:32:21 +0330 Subject: [PATCH 11/31] change style --- src/components/layouts/dashboard/headerWithSidebar/index.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/layouts/dashboard/headerWithSidebar/index.jsx b/src/components/layouts/dashboard/headerWithSidebar/index.jsx index 8bdd960..de73115 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/index.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/index.jsx @@ -50,7 +50,7 @@ const DrawerHeader = styled("div")(({ theme }) => ({ alignItems: "center", padding: theme.spacing(0, 1), ...theme.mixins.toolbar, - minHeight: "48px !important", + minHeight: "40px !important", justifyContent: "flex-end", })); @@ -68,7 +68,7 @@ const HeaderWithSidebar = ({ children }) => { display: "flex", height: `calc(100% - ${headersHeight}px)`, width: "100%", mt: `${headersHeight}px` }}> - + Date: Mon, 19 Aug 2024 13:40:13 +0330 Subject: [PATCH 12/31] complete profile part and start working on update profile and changing password --- .../dashboard/headerWithSidebar/index.jsx | 9 ++- .../components/Profile/ChangePass/index.jsx | 52 +++++++++++++ src/core/components/Profile/Update/form.jsx | 0 src/core/components/Profile/Update/index.jsx | 52 +++++++++++++ src/core/components/Profile/index.jsx | 75 +++++++++++++++++++ src/core/components/SidebarMenu.jsx | 36 +-------- src/lib/contexts/tableSetting.js | 1 + 7 files changed, 189 insertions(+), 36 deletions(-) create mode 100644 src/core/components/Profile/ChangePass/index.jsx create mode 100644 src/core/components/Profile/Update/form.jsx create mode 100644 src/core/components/Profile/Update/index.jsx create mode 100644 src/core/components/Profile/index.jsx diff --git a/src/components/layouts/dashboard/headerWithSidebar/index.jsx b/src/components/layouts/dashboard/headerWithSidebar/index.jsx index 68f4bc6..4a66880 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/index.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/index.jsx @@ -2,10 +2,11 @@ import SidebarMenu from "@/core/components/SidebarMenu"; import ChevronRightIcon from "@mui/icons-material/ChevronRight"; import MenuIcon from "@mui/icons-material/Menu"; -import { Box, Drawer, IconButton, Stack, styled, Toolbar } from "@mui/material"; +import { Box, Drawer, IconButton, Stack, styled, Toolbar, Typography } from "@mui/material"; import MuiAppBar from "@mui/material/AppBar"; import { useState } from "react"; import HeaderMenu from "./HeaderMenu"; +import moment from "jalali-moment"; const drawerWidth = 300; @@ -54,6 +55,7 @@ const DrawerHeader = styled("div")(({ theme }) => ({ const HeaderWithSidebar = ({ children }) => { const [open, setOpen] = useState(true); + const now = moment().locale("fa").format("HH:mm | YYYY/MM/DD"); const handleDrawerOpen = () => { setOpen(true); @@ -90,14 +92,15 @@ const HeaderWithSidebar = ({ children }) => { boxSizing: "border-box", borderTop: 1, borderTopColor: "divider", - position: 'inherit' + position: "inherit", }, }} variant="persistent" anchor="left" open={open} > - + + تاریخ امروز: {now} diff --git a/src/core/components/Profile/ChangePass/index.jsx b/src/core/components/Profile/ChangePass/index.jsx new file mode 100644 index 0000000..31df662 --- /dev/null +++ b/src/core/components/Profile/ChangePass/index.jsx @@ -0,0 +1,52 @@ +"use client"; + +import { + Box, + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + IconButton, + useMediaQuery, +} from "@mui/material"; +import { useTheme } from "@mui/material/styles"; +import CloseIcon from "@mui/icons-material/Close"; + +const ChangePass = ({ open, setOpen }) => { + const theme = useTheme(); + const fullScreen = useMediaQuery(theme.breakpoints.down("sm")); + + return ( + { + setOpen(false); + }}> + + + تغییر رمز عبور + + { + setOpen(false); + }} + sx={{ color: (theme) => theme.palette.grey[500] }} + > + + + + + تست + + + + + + ); +}; +export default ChangePass; \ No newline at end of file diff --git a/src/core/components/Profile/Update/form.jsx b/src/core/components/Profile/Update/form.jsx new file mode 100644 index 0000000..e69de29 diff --git a/src/core/components/Profile/Update/index.jsx b/src/core/components/Profile/Update/index.jsx new file mode 100644 index 0000000..bb244ea --- /dev/null +++ b/src/core/components/Profile/Update/index.jsx @@ -0,0 +1,52 @@ +"use client"; + +import { + Box, + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + IconButton, + useMediaQuery, +} from "@mui/material"; +import { useTheme } from "@mui/material/styles"; +import CloseIcon from "@mui/icons-material/Close"; + +const Update = ({ open, setOpen }) => { + const theme = useTheme(); + const fullScreen = useMediaQuery(theme.breakpoints.down("sm")); + + return ( + { + setOpen(false); + }}> + + + ویرایش پروفایل + + { + setOpen(false); + }} + sx={{ color: (theme) => theme.palette.grey[500] }} + > + + + + + form will come here + + + + + + ); +}; +export default Update; \ No newline at end of file diff --git a/src/core/components/Profile/index.jsx b/src/core/components/Profile/index.jsx new file mode 100644 index 0000000..0940b74 --- /dev/null +++ b/src/core/components/Profile/index.jsx @@ -0,0 +1,75 @@ +"use client"; + +import { Avatar, Box, Chip, Divider, IconButton, Stack, Tooltip, Typography } from "@mui/material"; +import PowerSettingsNewIcon from "@mui/icons-material/PowerSettingsNew"; +import ModeEditIcon from "@mui/icons-material/ModeEdit"; +import VpnKeyIcon from "@mui/icons-material/VpnKey"; +import { useState } from "react"; +import Update from "@/core/components/Profile/Update"; +import ChangePass from "@/core/components/Profile/ChangePass"; + +const Profile = () => { + const [openUpdate, setOpenUpdate] = useState(false); + const [openChangePass, setOpenChangePass] = useState(false); + + return ( + <> + + + + + + حسن محمد زاده عبدالله + + .: اداره کل ستاد :. + + + + آخرین ورود + + 1 ساعت پیش + + + + + + + + + { + setOpenUpdate(true); + }}> + + + + + + + + + + + + { + setOpenChangePass(true); + }}> + + + + + + + + + ); +}; +export default Profile; diff --git a/src/core/components/SidebarMenu.jsx b/src/core/components/SidebarMenu.jsx index 39d8079..2bd04e5 100644 --- a/src/core/components/SidebarMenu.jsx +++ b/src/core/components/SidebarMenu.jsx @@ -1,13 +1,12 @@ "use client"; import SidebarListItems from "@/core/components/SidebarListItems"; import { usePermissions } from "@/lib/hooks/usePermissions"; -import { Avatar, Box, Divider, IconButton, List, Stack, Typography } from "@mui/material"; +import { List } from "@mui/material"; import { usePathname } from "next/navigation"; import { useEffect, useReducer, useState } from "react"; import { filterMenuItems } from "../utils/filterMenuItems"; -import PowerSettingsNewIcon from "@mui/icons-material/PowerSettingsNew"; -import ModeEditIcon from "@mui/icons-material/ModeEdit"; import { pageMenu } from "../utils/pageMenu"; +import Profile from "@/core/components/Profile"; function selectPage(item, route) { if (item.type === "page") { @@ -115,36 +114,7 @@ const SidebarMenu = () => { return ( <> - - - - - - شرکت وایتل - (userName) - - .: اداره کل ستاد :. - - - - آخرین ورود - - 1 ساعت پیش - - - - - - - - - - - + { userPermissions && ( diff --git a/src/lib/contexts/tableSetting.js b/src/lib/contexts/tableSetting.js index 0484511..2458a36 100644 --- a/src/lib/contexts/tableSetting.js +++ b/src/lib/contexts/tableSetting.js @@ -1,4 +1,5 @@ "use client"; + import { createContext, useCallback, useEffect, useState } from "react"; import LZString from "lz-string"; From 7970aecc9012310b2caed40343daec3b2de66b78 Mon Sep 17 00:00:00 2001 From: Amirhossein Mahmoodi Date: Mon, 19 Aug 2024 13:58:23 +0330 Subject: [PATCH 13/31] change directory --- .../Sidebar}/SidebarListItems.jsx | 2 +- .../headerWithSidebar/Sidebar}/SidebarMenu.jsx | 16 ++++++++-------- .../Sidebar}/SidebarSubitems.jsx | 0 .../dashboard/headerWithSidebar/index.jsx | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) rename src/{core/components => components/layouts/dashboard/headerWithSidebar/Sidebar}/SidebarListItems.jsx (97%) rename src/{core/components => components/layouts/dashboard/headerWithSidebar/Sidebar}/SidebarMenu.jsx (91%) rename src/{core/components => components/layouts/dashboard/headerWithSidebar/Sidebar}/SidebarSubitems.jsx (100%) diff --git a/src/core/components/SidebarListItems.jsx b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx similarity index 97% rename from src/core/components/SidebarListItems.jsx rename to src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx index 050d9a6..05ee6df 100644 --- a/src/core/components/SidebarListItems.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx @@ -1,7 +1,7 @@ -import SidebarSubitems from "@/core/components/SidebarSubitems"; import { ExpandLess, ExpandMore } from "@mui/icons-material"; import { Collapse, List, ListItem, ListItemButton, ListItemIcon, ListItemText } from "@mui/material"; import Link from "next/link"; +import SidebarSubitems from "./SidebarSubitems"; const SidebarListItems = ({ menuItem, dispatch }) => { return ( diff --git a/src/core/components/SidebarMenu.jsx b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarMenu.jsx similarity index 91% rename from src/core/components/SidebarMenu.jsx rename to src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarMenu.jsx index 704fb5d..0a3026c 100644 --- a/src/core/components/SidebarMenu.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarMenu.jsx @@ -1,12 +1,12 @@ "use client"; -import SidebarListItems from "@/core/components/SidebarListItems"; import { usePermissions } from "@/lib/hooks/usePermissions"; import { List } from "@mui/material"; import { usePathname } from "next/navigation"; import { useEffect, useReducer, useState } from "react"; -import { filterMenuItems } from "../utils/filterMenuItems"; -import { pageMenu } from "../utils/pageMenu"; import Profile from "@/core/components/Profile"; +import { filterMenuItems } from "@/core/utils/filterMenuItems"; +import { pageMenu } from "@/core/utils/pageMenu"; +import SidebarListItems from "./SidebarListItems"; function selectPage(item, route) { if (item.type === "page") { @@ -106,10 +106,10 @@ const SidebarMenu = () => { useEffect(() => { selectedKey && - document.querySelector(`[data-route="${selectedKey}"]`)?.scrollIntoView({ - behavior: "smooth", - block: "center", - }); + document.querySelector(`[data-route="${selectedKey}"]`)?.scrollIntoView({ + behavior: "smooth", + block: "center", + }); }, [selectedKey]); return ( @@ -117,7 +117,7 @@ const SidebarMenu = () => { { userPermissions && ( - + {menuItems.map((menuItem) => { return ; })} diff --git a/src/core/components/SidebarSubitems.jsx b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarSubitems.jsx similarity index 100% rename from src/core/components/SidebarSubitems.jsx rename to src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarSubitems.jsx diff --git a/src/components/layouts/dashboard/headerWithSidebar/index.jsx b/src/components/layouts/dashboard/headerWithSidebar/index.jsx index 99cb198..c4e3fde 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/index.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/index.jsx @@ -1,5 +1,4 @@ "use client"; -import SidebarMenu from "@/core/components/SidebarMenu"; import ChevronRightIcon from "@mui/icons-material/ChevronRight"; import MenuIcon from "@mui/icons-material/Menu"; import { Box, Drawer, IconButton, Stack, styled, Toolbar, Typography } from "@mui/material"; @@ -8,6 +7,7 @@ import { useState } from "react"; import HeaderMenu from "./HeaderMenu"; import moment from "jalali-moment"; import { headerMenu } from "@/core/utils/headerMenu"; +import SidebarMenu from "./Sidebar/SidebarMenu"; const drawerWidth = 300; const headersHeight = 136 @@ -57,7 +57,7 @@ const DrawerHeader = styled("div")(({ theme }) => ({ const HeaderWithSidebar = ({ children }) => { const [open, setOpen] = useState(true); - const now = moment().locale("fa").format("HH:mm | YYYY/MM/DD"); + const now = moment().locale("fa").format("YYYY/MM/DD"); const handleDrawerOpen = () => { setOpen(true); From 1bd0f7f606830fa30e858328c8589821f82c94ef Mon Sep 17 00:00:00 2001 From: Amirhossein Mahmoodi Date: Mon, 19 Aug 2024 14:06:38 +0330 Subject: [PATCH 14/31] change style --- .../Sidebar/SidebarListItems.jsx | 2 +- .../headerWithSidebar/Sidebar/SidebarMenu.jsx | 73 +++++++++---------- .../Sidebar/SidebarSubitems.jsx | 2 +- 3 files changed, 35 insertions(+), 42 deletions(-) diff --git a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx index 05ee6df..533d2b8 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx @@ -8,7 +8,7 @@ const SidebarListItems = ({ menuItem, dispatch }) => { <> + actionId === item.id + ? { ...item, showSubitems: !item.showSubitems } + : { ...item, showSubitems: false } + ); +} + function reducer(state, action) { switch (action.type) { case "UPDATE_MENU": const _permissions = action.permissions || []; - const filteredPageMenu = filterMenuItems(state, ["all", ..._permissions]); - return filteredPageMenu; + return filterMenuItems(state, ["all", ..._permissions]); + case "COLLAPSE_MENU": - return state.map((item) => - action.id == item.id - ? { - ...item, - showSubitems: !item.showSubitems, - } - : item, - ); + return state.map((item) => ({ + ...item, + showSubitems: item.id === action.id ? !item.showSubitems : false, + })); + case "COLLAPSE_SUB_ITEMS": - return state.map((item) => { - return item.hasSubitems + return state.map((item) => + item.hasSubitems + ? { ...item, Subitems: toggleSubitems(item.Subitems, action.id) } + : item + ); + + case "COLLAPSE_SUB_SECOND_ITEMS": + return state.map((item) => + item.hasSubitems ? { ...item, Subitems: item.Subitems.map((subitem) => - action.id === subitem.id + subitem.hasSubitems ? { ...subitem, - showSubitems: !subitem.showSubitems, - } - : subitem, - ), - } - : item; - }); - case "COLLAPSE_SUB_SECOND_ITEMS": - return state.map((item) => { - return item.hasSubitems - ? { - ...item, - Subitems: item.Subitems.map((subitem) => { - return subitem.hasSubitems - ? { - ...subitem, - Subitems: subitem.Subitems.map((secondSubitem) => - action.id === secondSubitem.id - ? { - ...secondSubitem, - showSubitems: !secondSubitem.showSubitems, - } - : secondSubitem, + Subitems: toggleSubitems( + subitem.Subitems, + action.id ), } - : subitem; - }), + : subitem + ), } - : item; - }); + : item + ); + case "SELECTED": return state.map((item) => selectPage(item, action.route)); diff --git a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarSubitems.jsx b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarSubitems.jsx index 69418ea..e539394 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarSubitems.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarSubitems.jsx @@ -8,7 +8,7 @@ const SidebarSubitems = ({ subitem, dispatch }) => { Date: Tue, 20 Aug 2024 16:19:39 +0330 Subject: [PATCH 15/31] working on uploading image --- src/core/components/Profile/Update/form.jsx | 131 +++++++++++++++++++ src/core/components/Profile/Update/index.jsx | 3 +- src/core/components/Profile/index.jsx | 11 +- src/core/utils/routes.js | 2 +- 4 files changed, 142 insertions(+), 5 deletions(-) diff --git a/src/core/components/Profile/Update/form.jsx b/src/core/components/Profile/Update/form.jsx index e69de29..c1b41a0 100644 --- a/src/core/components/Profile/Update/form.jsx +++ b/src/core/components/Profile/Update/form.jsx @@ -0,0 +1,131 @@ +"use client"; + +import { Autocomplete, Avatar, Backdrop, Badge, Box, Grid, TextField } from "@mui/material"; +import StyledForm from "@/core/components/StyledForm"; +import useRequest from "@/lib/hooks/useRequest"; +import { Controller, useForm } from "react-hook-form"; +import { useAuth } from "@/lib/contexts/auth"; +import AddCircleIcon from "@mui/icons-material/AddCircle"; +import DataSAverOn from "@mui/icons-material/DataSAverOn"; +import { useState } from "react"; + +const degreeItems = ["دیپلم", "کارشناسی", "کارشناسی ارشد", "دکترا"]; + +const Form = () => { + const request = useRequest(); + const { user } = useAuth(); + const [uploadBackDrop, setUploadBackDrop] = useState(false); + const defaultValues = { + first_name: user.data.first_name, + last_name: user.data.last_name, + degree: user.data.degree, + major: user.data.major, + mobile: user.data.mobile, + avatar: user.data.avatar, + }; + + console.log("defaultValues", defaultValues); + + const { + control, + watch, + register, + handleSubmit, + setValue, + formState: { isSubmitting }, + } = useForm({ defaultValues: defaultValues }); + + return ( + + + } + > + setUploadBackDrop(true)} + onMouseLeave={() => setUploadBackDrop(false)} + alt={watch("first_name")} + src={`${process.env.NEXT_PUBLIC_API_URL}/${watch("avatar")}`} + sx={{ width: 150, height: 150, border: "1px solid #e1e1e1", cursor: "pointer" }} + /> + + theme.zIndex.drawer + 1, + position: "absolute", width: 150, height: 150, + marginLeft: "auto", marginRight: "auto", + borderRadius: "50%", + }} + open={uploadBackDrop} + > + + + + + + + + + + + + + + + ( + { + onChange(newValue); + }} + options={degreeItems} + renderInput={(params) => ( + + )} + /> + )} + /> + + + + + + + ); +}; +export default Form; \ No newline at end of file diff --git a/src/core/components/Profile/Update/index.jsx b/src/core/components/Profile/Update/index.jsx index bb244ea..e4183ac 100644 --- a/src/core/components/Profile/Update/index.jsx +++ b/src/core/components/Profile/Update/index.jsx @@ -12,6 +12,7 @@ import { } from "@mui/material"; import { useTheme } from "@mui/material/styles"; import CloseIcon from "@mui/icons-material/Close"; +import Form from "./form"; const Update = ({ open, setOpen }) => { const theme = useTheme(); @@ -37,7 +38,7 @@ const Update = ({ open, setOpen }) => { - form will come here +
+ + + + + + + + + + + + + + ( + { + onChange(newValue); + }} + options={degreeItems} + renderInput={(params) => ( + + )} + /> + )} + /> + + + + - - - - - + + ); }; export default Form; \ No newline at end of file diff --git a/src/core/components/Profile/Update/index.jsx b/src/core/components/Profile/Update/index.jsx index e4183ac..0353fcb 100644 --- a/src/core/components/Profile/Update/index.jsx +++ b/src/core/components/Profile/Update/index.jsx @@ -1,17 +1,7 @@ "use client"; -import { - Box, - Button, - Dialog, - DialogActions, - DialogContent, - DialogTitle, - IconButton, - useMediaQuery, -} from "@mui/material"; +import { Button, Dialog, DialogActions, DialogContent, useMediaQuery } from "@mui/material"; import { useTheme } from "@mui/material/styles"; -import CloseIcon from "@mui/icons-material/Close"; import Form from "./form"; const Update = ({ open, setOpen }) => { @@ -23,25 +13,16 @@ const Update = ({ open, setOpen }) => { onClose={() => { setOpen(false); }}> - - - ویرایش پروفایل - - { - setOpen(false); - }} - sx={{ color: (theme) => theme.palette.grey[500] }} - > - - - - + - + ); diff --git a/src/core/utils/flattenObjectOfObjects.jsx b/src/core/utils/flattenObjectOfObjects.js similarity index 100% rename from src/core/utils/flattenObjectOfObjects.jsx rename to src/core/utils/flattenObjectOfObjects.js diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index 6520a50..d4d0558 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -1,6 +1,7 @@ const api = process.env.NEXT_PUBLIC_API_URL; export const GET_USER_ROUTE = api + "/api/v3/profile/info"; +export const CHANGE_USER_PASSWORD = api + "/api/v3/profile/change_password"; export const GET_LOGIN_ROUTE = api + "/login_dev"; export const GET_INQUIRY_PRIVACY_FENCING_ROUTE = api + "/api/v3/harim/divarkeshi"; export const GET_PERMISSIONS_ROUTE = api + "/webapi/user/get-permission"; From cb2248e108fb80dfc63c61559d4cd67f9f50c26b Mon Sep 17 00:00:00 2001 From: Amirhossein Mahmoodi Date: Tue, 27 Aug 2024 13:00:17 +0330 Subject: [PATCH 18/31] add badge for sidebar --- .../Sidebar/SidebarBadge.jsx | 22 +++++++++++++++++++ .../Sidebar/SidebarListItems.jsx | 8 ++++++- .../Sidebar/SidebarSubitems.jsx | 10 +++++++-- src/core/utils/getValueByPath.js | 14 ++++++++++++ src/core/utils/pageMenu.js | 10 +++++++++ src/core/utils/routes.js | 1 + src/lib/hooks/useSidebarBadge.js | 18 +++++++++++++++ 7 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarBadge.jsx create mode 100644 src/core/utils/getValueByPath.js create mode 100644 src/lib/hooks/useSidebarBadge.js diff --git a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarBadge.jsx b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarBadge.jsx new file mode 100644 index 0000000..df8fbc2 --- /dev/null +++ b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarBadge.jsx @@ -0,0 +1,22 @@ +import { getValueByPath } from "@/core/utils/getValueByPath"; +import { useSidebarBadge } from "@/lib/hooks/useSidebarBadge" +import { Chip } from "@mui/material" +import { useEffect, useState } from "react"; + +const SidebarBadge = ({ badge, chipProps = {} }) => { + const { data } = useSidebarBadge() + const [value, setValue] = useState() + + useEffect(() => { + setValue(getValueByPath(data, badge)) + }, [data, badge]) + + + if (!data) return null + if (!value) return null + + return ( + + ) +} +export default SidebarBadge \ No newline at end of file diff --git a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx index 533d2b8..bde3bae 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx @@ -1,6 +1,7 @@ import { ExpandLess, ExpandMore } from "@mui/icons-material"; -import { Collapse, List, ListItem, ListItemButton, ListItemIcon, ListItemText } from "@mui/material"; +import { Collapse, List, ListItem, ListItemButton, ListItemIcon, ListItemText, Stack } from "@mui/material"; import Link from "next/link"; +import SidebarBadge from "./SidebarBadge"; import SidebarSubitems from "./SidebarSubitems"; const SidebarListItems = ({ menuItem, dispatch }) => { @@ -29,6 +30,11 @@ const SidebarListItems = ({ menuItem, dispatch }) => { {menuItem.icon} + {menuItem.badges && ( + + {menuItem.badges.map((badge, i) => )} + + )} {menuItem.hasSubitems ? menuItem.showSubitems ? : : null} diff --git a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarSubitems.jsx b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarSubitems.jsx index e539394..6e51bcd 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarSubitems.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarSubitems.jsx @@ -1,6 +1,7 @@ import { ExpandLess, ExpandMore } from "@mui/icons-material"; -import { Collapse, List, ListItem, ListItemButton, ListItemIcon, ListItemText } from "@mui/material"; +import { Box, Collapse, List, ListItem, ListItemButton, ListItemIcon, ListItemText, Stack } from "@mui/material"; import Link from "next/link"; +import SidebarBadge from "./SidebarBadge"; const SidebarSubitems = ({ subitem, dispatch }) => { return ( @@ -27,7 +28,12 @@ const SidebarSubitems = ({ subitem, dispatch }) => { {subitem.icon} - {subitem.hasSubitems ? subitem.showSubitems ? : : null} + {subitem.badges && ( + + {subitem.badges.map((badge, i) => )} + + )} + {subitem.hasSubitems ? subitem.showSubitems ? : : } diff --git a/src/core/utils/getValueByPath.js b/src/core/utils/getValueByPath.js new file mode 100644 index 0000000..6f51b4f --- /dev/null +++ b/src/core/utils/getValueByPath.js @@ -0,0 +1,14 @@ +export const getValueByPath = (obj, path) => { + const keys = path.split("."); + + let value = obj; + + for (const key of keys) { + if (value === undefined) { + return undefined; + } + value = value[key]; + } + + return value; +} \ No newline at end of file diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js index 5718053..306b6ec 100644 --- a/src/core/utils/pageMenu.js +++ b/src/core/utils/pageMenu.js @@ -91,6 +91,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, + badges: ['road_items.total'], Subitems: [ { id: "roadItemManagmentSupervisor", @@ -98,6 +99,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, + badges: ['road_items.supervise_cnt'], Subitems: [ { id: "roadItemManagmentSupervisorCartable", @@ -117,6 +119,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, + badges: ['road_items.operation_cnt'], Subitems: [ { id: "roadItemManagmentOparationCreate", @@ -166,6 +169,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, + badges: ['road_patrols.total'], Subitems: [ { id: "roadPatrolManagmentSupervisor", @@ -173,6 +177,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, + badges: ['road_patrols.supervise_cnt'], Subitems: [ { id: "roadPatrolManagmentSupervisorCartable", @@ -192,6 +197,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, + badges: ['road_patrols.operation_cnt'], Subitems: [ { id: "roadPatrolManagmentOparationCreate", @@ -271,6 +277,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, + badges: ['safety_and_privacy.step_one', 'safety_and_privacy.step_two'], Subitems: [ { id: "safetyAndPrivacyManagmentOparation", @@ -333,6 +340,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, + badges: ['road_observations.total'], Subitems: [ { id: "roadObservationsManagmentSupervisor", @@ -340,6 +348,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, + badges: ['road_observations.supervise_cnt'], Subitems: [ { id: "roadObservationsManagmentSupervisorCartable", @@ -364,6 +373,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, + badges: ['road_observations.operation_cnt'], Subitems: [ { id: "roadObservationsManagmentOparationCartable", diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index d33fa7d..5ab9d74 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -4,5 +4,6 @@ export const GET_USER_ROUTE = api + "/webapi/user/get-permission"; export const GET_LOGIN_ROUTE = api + "/login_dev"; export const GET_INQUIRY_PRIVACY_FENCING_ROUTE = api + "/api/v3/harim/divarkeshi"; export const GET_PERMISSIONS_ROUTE = api + "/webapi/user/get-permission"; +export const GET_SIDEBAR_BADGE_ROUTE = api + "/v2/activity_statistics"; export const SET_INQUIRE_PRIVACY_FENCING = api + "/api/v3/harim/divarkeshi/store"; diff --git a/src/lib/hooks/useSidebarBadge.js b/src/lib/hooks/useSidebarBadge.js new file mode 100644 index 0000000..621ce55 --- /dev/null +++ b/src/lib/hooks/useSidebarBadge.js @@ -0,0 +1,18 @@ +import { GET_SIDEBAR_BADGE_ROUTE } from "@/core/utils/routes"; +import useSWR from "swr"; +import useRequest from "./useRequest"; + +export const useSidebarBadge = () => { + const request = useRequest(); + + const fetcher = async (url) => { + try { + const response = await request(url); + return response.data; + } catch (error) { + throw new Error(); + } + }; + + return useSWR(GET_SIDEBAR_BADGE_ROUTE, fetcher, { keepPreviousData: true }); +}; From 57ae81c791cb0f9e7e2c6c163733f1f8fc453fe6 Mon Sep 17 00:00:00 2001 From: Mohammad Jalali Date: Tue, 27 Aug 2024 15:51:05 +0330 Subject: [PATCH 19/31] complete profile update part and password completely --- .../components/Profile/ChangePass/Form.jsx | 27 +- .../components/Profile/ChangePass/index.jsx | 15 +- .../components/Profile/ProfileActions.jsx | 50 ++++ src/core/components/Profile/ProfileInfo.jsx | 34 +++ src/core/components/Profile/Update/Form.jsx | 248 ++++++++++++++++++ src/core/components/Profile/Update/form.jsx | 165 ------------ src/core/components/Profile/Update/index.jsx | 30 ++- src/core/components/Profile/index.jsx | 84 +----- src/core/utils/routes.js | 1 + 9 files changed, 381 insertions(+), 273 deletions(-) create mode 100644 src/core/components/Profile/ProfileActions.jsx create mode 100644 src/core/components/Profile/ProfileInfo.jsx create mode 100644 src/core/components/Profile/Update/Form.jsx delete mode 100644 src/core/components/Profile/Update/form.jsx diff --git a/src/core/components/Profile/ChangePass/Form.jsx b/src/core/components/Profile/ChangePass/Form.jsx index 75c0adb..3499394 100644 --- a/src/core/components/Profile/ChangePass/Form.jsx +++ b/src/core/components/Profile/ChangePass/Form.jsx @@ -13,7 +13,6 @@ import { } from "@mui/material"; import StyledForm from "@/core/components/StyledForm"; import { useForm } from "react-hook-form"; -import { useAuth } from "@/lib/contexts/auth"; import useRequest from "@/lib/hooks/useRequest"; import { CHANGE_USER_PASSWORD } from "@/core/utils/routes"; import { object, string } from "yup"; @@ -35,12 +34,10 @@ const validationSchema = object({ }); const Form = ({ handleCloseForm, setLoading }) => { + const request = useRequest(); const [showNewPassword, setShowNewPassword] = useState(); const [showRepeatNewPassword, setShowRepeatNewPassword] = useState(); - const request = useRequest(); - const { getUser } = useAuth(); - const defaultValues = { current_password: "", new_password: "", @@ -48,11 +45,8 @@ const Form = ({ handleCloseForm, setLoading }) => { }; const { - control, - watch, register, handleSubmit, - setValue, formState: { isSubmitting, errors }, } = useForm({ defaultValues, resolver: yupResolver(validationSchema) }); @@ -65,7 +59,7 @@ const Form = ({ handleCloseForm, setLoading }) => { formData.append("current_password", data.current_password); formData.append("new_password", data.new_password); try { - await request(CHANGE_USER_PASSWORD, "post", { data: formData }); + await request(CHANGE_USER_PASSWORD, "post", { data: formData, signal: controller.signal }); handleCloseForm(); } catch (error) { } @@ -77,7 +71,7 @@ const Form = ({ handleCloseForm, setLoading }) => { - + رمز عبور فعلی @@ -90,8 +84,9 @@ const Form = ({ handleCloseForm, setLoading }) => { fullWidth type="text" /> - {errors.current_password ? errors.current_password.message : null} + + {errors.current_password ? errors.current_password.message : null} + @@ -118,8 +113,9 @@ const Form = ({ handleCloseForm, setLoading }) => { } /> - {errors.new_password ? errors.new_password.message : null} + + {errors.new_password ? errors.new_password.message : null} + @@ -146,8 +142,9 @@ const Form = ({ handleCloseForm, setLoading }) => { } /> - {errors.repeat_new_password ? errors.repeat_new_password.message : null} + + {errors.repeat_new_password ? errors.repeat_new_password.message : null} + diff --git a/src/core/components/Profile/ChangePass/index.jsx b/src/core/components/Profile/ChangePass/index.jsx index 085f40c..15e6fcd 100644 --- a/src/core/components/Profile/ChangePass/index.jsx +++ b/src/core/components/Profile/ChangePass/index.jsx @@ -1,14 +1,12 @@ "use client"; -import { Button, Dialog, DialogActions, DialogContent } from "@mui/material"; -import { useTheme } from "@mui/material/styles"; +import { Dialog, DialogActions, DialogContent } from "@mui/material"; import Form from "./Form"; import SaveIcon from "@mui/icons-material/Save"; import { LoadingButton } from "@mui/lab"; import { useState } from "react"; const ChangePass = ({ open, setOpen }) => { - const theme = useTheme(); const [loading, setLoading] = useState(false); const handleCloseForm = () => { @@ -16,16 +14,17 @@ const ChangePass = ({ open, setOpen }) => { }; return ( - + - - + }> diff --git a/src/core/components/Profile/ProfileActions.jsx b/src/core/components/Profile/ProfileActions.jsx new file mode 100644 index 0000000..7683547 --- /dev/null +++ b/src/core/components/Profile/ProfileActions.jsx @@ -0,0 +1,50 @@ +"use client"; + +import { Box, Divider, IconButton, Tooltip } from "@mui/material"; +import PowerSettingsNewIcon from "@mui/icons-material/PowerSettingsNew"; +import ModeEditIcon from "@mui/icons-material/ModeEdit"; +import VpnKeyIcon from "@mui/icons-material/VpnKey"; +import { useState } from "react"; +import Update from "@/core/components/Profile/Update"; +import ChangePass from "@/core/components/Profile/ChangePass"; +import { useAuth } from "@/lib/contexts/auth"; + +const ProfileActions = () => { + const { getUser } = useAuth(); + const [openUpdate, setOpenUpdate] = useState(false); + const [openChangePass, setOpenChangePass] = useState(false); + + const openUpdateProfile = () => { + getUser(); + setOpenUpdate(true); + }; + + return ( + <> + + + + + + + + + + + + + + + { + setOpenChangePass(true); + }}> + + + + + + + + ); +}; +export default ProfileActions; diff --git a/src/core/components/Profile/ProfileInfo.jsx b/src/core/components/Profile/ProfileInfo.jsx new file mode 100644 index 0000000..ea33e8f --- /dev/null +++ b/src/core/components/Profile/ProfileInfo.jsx @@ -0,0 +1,34 @@ +"use client"; + +import { Avatar, Box, Chip, Divider, Stack, Typography } from "@mui/material"; + +const ProfileInfo = () => { + return ( + <> + + + + + حسن محمد زاده عبدالله + + .: اداره کل ستاد :. + + + + آخرین ورود + + 1 ساعت پیش + + + + + + + + ); +}; +export default ProfileInfo; diff --git a/src/core/components/Profile/Update/Form.jsx b/src/core/components/Profile/Update/Form.jsx new file mode 100644 index 0000000..7c9a340 --- /dev/null +++ b/src/core/components/Profile/Update/Form.jsx @@ -0,0 +1,248 @@ +"use client"; + +import { + Autocomplete, + Avatar, + Backdrop, + Box, + Button, + Chip, + Divider, + FormControl, + FormHelperText, + Grid, + InputLabel, + OutlinedInput, + TextField, +} from "@mui/material"; +import StyledForm from "@/core/components/StyledForm"; +import useRequest from "@/lib/hooks/useRequest"; +import { Controller, useForm } from "react-hook-form"; +import { useAuth } from "@/lib/contexts/auth"; +import CloudUploadIcon from "@mui/icons-material/CloudUpload"; +import { styled } from "@mui/material/styles"; +import { useEffect, useState } from "react"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { object, string } from "yup"; +import { UPDATE_USER_ROUTE } from "@/core/utils/routes"; + +const degreeItems = ["دیپلم", "کارشناسی", "کارشناسی ارشد", "دکترا"]; + +const VisuallyHiddenInput = styled("input")({ + clip: "rect(0 0 0 0)", + clipPath: "inset(50%)", + height: 1, + overflow: "hidden", + position: "absolute", + bottom: 0, + left: 0, + whiteSpace: "nowrap", + width: 1, +}); + +const validationSchema = object({ + first_name: string().required("اجباری"), + last_name: string().required("اجباری"), + degree: string().required("اجباری"), + major: string().required("اجباری"), + mobile: string().required("اجباری"), +}); + +const Form = ({ handleCloseForm, setLoading }) => { + const request = useRequest(); + const { user, getUser } = useAuth(); + const [uploadBackDrop, setUploadBackDrop] = useState(false); + const defaultValues = { + first_name: user.data.first_name, + last_name: user.data.last_name, + major: user.data.major, + degree: user.data.degree, + mobile: user.data.mobile, + avatar: null, + }; + + const { + control, + watch, + register, + setValue, + handleSubmit, + formState: { isSubmitting, errors }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema) }); + + useEffect(() => { + setLoading(isSubmitting); + }, [isSubmitting]); + + const onSubmit = async (data) => { + const formData = new FormData(); + formData.append("first_name", data.first_name); + formData.append("last_name", data.last_name); + formData.append("major", data.major); + formData.append("degree", data.degree); + formData.append("mobile", data.mobile); + if (data.avatar) { + formData.append("avatar", data.avatar); + } + + try { + await request(UPDATE_USER_ROUTE, "post", { data: formData }); + getUser(); + handleCloseForm(); + } catch (error) { + } + }; + + return ( + <> + + + + + + + + + + + نام + + {errors.first_name ? errors.first_name.message : null} + + + + + نام خانوادگی + + {errors.last_name ? errors.last_name.message : null} + + + + + رشته تحصیلی + + {errors.major ? errors.major.message : null} + + + + ( + + { + onChange(newValue); + }} + options={degreeItems} + renderInput={(params) => ( + + )} + /> + + {error ? error.message : null} + + + )} + /> + + + + موبایل + + {errors.mobile ? errors.mobile.message : null} + + + + + + ); +}; +export default Form; \ No newline at end of file diff --git a/src/core/components/Profile/Update/form.jsx b/src/core/components/Profile/Update/form.jsx deleted file mode 100644 index fe56a12..0000000 --- a/src/core/components/Profile/Update/form.jsx +++ /dev/null @@ -1,165 +0,0 @@ -"use client"; - -import { Autocomplete, Avatar, Backdrop, Box, Button, Chip, Divider, Grid, TextField } from "@mui/material"; -import StyledForm from "@/core/components/StyledForm"; -import useRequest from "@/lib/hooks/useRequest"; -import { Controller, useForm } from "react-hook-form"; -import { useAuth } from "@/lib/contexts/auth"; -import CloudUploadIcon from "@mui/icons-material/CloudUpload"; -import { styled } from "@mui/material/styles"; -import { useState } from "react"; - -const VisuallyHiddenInput = styled("input")({ - clip: "rect(0 0 0 0)", - clipPath: "inset(50%)", - height: 1, - overflow: "hidden", - position: "absolute", - bottom: 0, - left: 0, - whiteSpace: "nowrap", - width: 1, -}); - -const degreeItems = ["دیپلم", "کارشناسی", "کارشناسی ارشد", "دکترا"]; - -const Form = () => { - const request = useRequest(); - const { user } = useAuth(); - const [uploadBackDrop, setUploadBackDrop] = useState(false); - const defaultValues = { - first_name: user.data.first_name, - last_name: user.data.last_name, - degree: user.data.degree, - major: user.data.major, - mobile: user.data.mobile, - avatar: user.data.avatar, - }; - - const { - control, - watch, - register, - handleSubmit, - setValue, - formState: { isSubmitting }, - } = useForm({ defaultValues: defaultValues }); - - return ( - <> - - - - - - - - - - - - - - - - - - - ( - { - onChange(newValue); - }} - options={degreeItems} - renderInput={(params) => ( - - )} - /> - )} - /> - - - - - - - - ); -}; -export default Form; \ No newline at end of file diff --git a/src/core/components/Profile/Update/index.jsx b/src/core/components/Profile/Update/index.jsx index 0353fcb..9228261 100644 --- a/src/core/components/Profile/Update/index.jsx +++ b/src/core/components/Profile/Update/index.jsx @@ -2,31 +2,35 @@ import { Button, Dialog, DialogActions, DialogContent, useMediaQuery } from "@mui/material"; import { useTheme } from "@mui/material/styles"; -import Form from "./form"; +import Form from "./Form"; +import SaveIcon from "@mui/icons-material/Save"; +import { LoadingButton } from "@mui/lab"; +import { useState } from "react"; const Update = ({ open, setOpen }) => { const theme = useTheme(); const fullScreen = useMediaQuery(theme.breakpoints.down("sm")); + const [loading, setLoading] = useState(false); + + const handleCloseForm = () => { + setOpen(false); + }; return ( - { - setOpen(false); - }}> + - + - - + ); diff --git a/src/core/components/Profile/index.jsx b/src/core/components/Profile/index.jsx index bca57a4..3741dc2 100644 --- a/src/core/components/Profile/index.jsx +++ b/src/core/components/Profile/index.jsx @@ -1,80 +1,20 @@ "use client"; -import { Avatar, Box, Chip, Divider, IconButton, Stack, Tooltip, Typography } from "@mui/material"; -import PowerSettingsNewIcon from "@mui/icons-material/PowerSettingsNew"; -import ModeEditIcon from "@mui/icons-material/ModeEdit"; -import VpnKeyIcon from "@mui/icons-material/VpnKey"; -import { useState } from "react"; -import Update from "@/core/components/Profile/Update"; -import ChangePass from "@/core/components/Profile/ChangePass"; -import { useAuth } from "@/lib/contexts/auth"; +import { Stack } from "@mui/material"; +import ProfileInfo from "./ProfileInfo"; +import ProfileActions from "./ProfileActions"; const Profile = () => { - const { getUser } = useAuth(); - const [openUpdate, setOpenUpdate] = useState(false); - const [openChangePass, setOpenChangePass] = useState(false); - - const openUpdateProfile = () => { - getUser(); - setOpenUpdate(true); - }; - return ( - <> - - - - - - حسن محمد زاده عبدالله - - .: اداره کل ستاد :. - - - - آخرین ورود - - 1 ساعت پیش - - - - - - - - - - - - - - - - - - - - - { - setOpenChangePass(true); - }}> - - - - - - - - + + + + ); }; export default Profile; diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index d4d0558..a209036 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -1,6 +1,7 @@ const api = process.env.NEXT_PUBLIC_API_URL; export const GET_USER_ROUTE = api + "/api/v3/profile/info"; +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_INQUIRY_PRIVACY_FENCING_ROUTE = api + "/api/v3/harim/divarkeshi"; From 3e8abb75809afed6b5d65a0717a30491457aea61 Mon Sep 17 00:00:00 2001 From: Amirhossein Mahmoodi Date: Mon, 16 Sep 2024 10:57:31 +0330 Subject: [PATCH 20/31] add pages inquiry privacy --- .../fencing => inquiry-privacy/_fencing}/page.js | 0 .../inquiry-privacy/assistant/zamin-gov/page.js | 7 +++++++ .../inquiry-privacy/city-admin/zamin-gov/page.js | 7 +++++++ .../general-manager/zamin-gov/page.js | 7 +++++++ .../province-admin/zamin-gov/page.js | 7 +++++++ .../inquiryPrivacy/assistant/zaminGov/index.jsx | 13 +++++++++++++ .../inquiryPrivacy/cityAdmin/zaminGov/index.jsx | 13 +++++++++++++ .../generalManager/zaminGov/index.jsx | 13 +++++++++++++ .../inquiryPrivacy/provinceAdmin/zaminGov/index.jsx | 13 +++++++++++++ 9 files changed, 80 insertions(+) rename src/app/(withAuth)/dashboard/{inquiry_privacy/fencing => inquiry-privacy/_fencing}/page.js (100%) create mode 100644 src/app/(withAuth)/dashboard/inquiry-privacy/assistant/zamin-gov/page.js create mode 100644 src/app/(withAuth)/dashboard/inquiry-privacy/city-admin/zamin-gov/page.js create mode 100644 src/app/(withAuth)/dashboard/inquiry-privacy/general-manager/zamin-gov/page.js create mode 100644 src/app/(withAuth)/dashboard/inquiry-privacy/province-admin/zamin-gov/page.js create mode 100644 src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx diff --git a/src/app/(withAuth)/dashboard/inquiry_privacy/fencing/page.js b/src/app/(withAuth)/dashboard/inquiry-privacy/_fencing/page.js similarity index 100% rename from src/app/(withAuth)/dashboard/inquiry_privacy/fencing/page.js rename to src/app/(withAuth)/dashboard/inquiry-privacy/_fencing/page.js diff --git a/src/app/(withAuth)/dashboard/inquiry-privacy/assistant/zamin-gov/page.js b/src/app/(withAuth)/dashboard/inquiry-privacy/assistant/zamin-gov/page.js new file mode 100644 index 0000000..0581720 --- /dev/null +++ b/src/app/(withAuth)/dashboard/inquiry-privacy/assistant/zamin-gov/page.js @@ -0,0 +1,7 @@ +import AssistantZaminGovComponent from "@/components/dashboard/inquiryPrivacy/assistant/zaminGov"; + +const Page = () => { + return ; +}; + +export default Page; diff --git a/src/app/(withAuth)/dashboard/inquiry-privacy/city-admin/zamin-gov/page.js b/src/app/(withAuth)/dashboard/inquiry-privacy/city-admin/zamin-gov/page.js new file mode 100644 index 0000000..2a45828 --- /dev/null +++ b/src/app/(withAuth)/dashboard/inquiry-privacy/city-admin/zamin-gov/page.js @@ -0,0 +1,7 @@ +import CityAdminZaminGovComponent from "@/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov"; + +const Page = () => { + return ; +}; + +export default Page; diff --git a/src/app/(withAuth)/dashboard/inquiry-privacy/general-manager/zamin-gov/page.js b/src/app/(withAuth)/dashboard/inquiry-privacy/general-manager/zamin-gov/page.js new file mode 100644 index 0000000..6c02a17 --- /dev/null +++ b/src/app/(withAuth)/dashboard/inquiry-privacy/general-manager/zamin-gov/page.js @@ -0,0 +1,7 @@ +import GeneralManagerZaminGovComponent from "@/components/dashboard/inquiryPrivacy/generalManager/zaminGov"; + +const Page = () => { + return ; +}; + +export default Page; diff --git a/src/app/(withAuth)/dashboard/inquiry-privacy/province-admin/zamin-gov/page.js b/src/app/(withAuth)/dashboard/inquiry-privacy/province-admin/zamin-gov/page.js new file mode 100644 index 0000000..735cd2c --- /dev/null +++ b/src/app/(withAuth)/dashboard/inquiry-privacy/province-admin/zamin-gov/page.js @@ -0,0 +1,7 @@ +import ProvinceAdminZaminGovComponent from "@/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov"; + +const Page = () => { + return ; +}; + +export default Page; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx new file mode 100644 index 0000000..92e8cd3 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx @@ -0,0 +1,13 @@ +"use client"; + +import PageTitle from "@/core/components/PageTitle"; +import { Stack } from "@mui/material"; + +const AssistantZaminGovComponent = () => { + return ( + + + + ); +}; +export default AssistantZaminGovComponent; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx new file mode 100644 index 0000000..3b2e7e6 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx @@ -0,0 +1,13 @@ +"use client"; + +import PageTitle from "@/core/components/PageTitle"; +import { Stack } from "@mui/material"; + +const CityAdminZaminGovComponent = () => { + return ( + + + + ); +}; +export default CityAdminZaminGovComponent; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx new file mode 100644 index 0000000..5640ef9 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx @@ -0,0 +1,13 @@ +"use client"; + +import PageTitle from "@/core/components/PageTitle"; +import { Stack } from "@mui/material"; + +const GeneralManagerZaminGovComponent = () => { + return ( + + + + ); +}; +export default GeneralManagerZaminGovComponent; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx new file mode 100644 index 0000000..84e6cd7 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx @@ -0,0 +1,13 @@ +"use client"; + +import PageTitle from "@/core/components/PageTitle"; +import { Stack } from "@mui/material"; + +const ProvinceAdminZaminGovComponent = () => { + return ( + + + + ); +}; +export default ProvinceAdminZaminGovComponent; From 9387f85cf75789629d1ed6c500b668c4e678e188 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Mon, 16 Sep 2024 07:59:19 +0000 Subject: [PATCH 21/31] Feature/update profile sidebar --- .../headerWithSidebar/HeaderMenu/index.jsx | 19 ++-- .../Sidebar/SidebarBadge.jsx | 25 +++--- .../Sidebar/SidebarListItems.jsx | 6 +- .../headerWithSidebar/Sidebar/SidebarMenu.jsx | 47 ++++------ .../Sidebar/SidebarSubitems.jsx | 16 +++- .../dashboard/headerWithSidebar/index.jsx | 21 +++-- .../DataTable/body/TableBodyCell.js | 2 +- .../DataTable/table/TableContainer.js | 5 +- .../components/Profile/ChangePass/Form.jsx | 15 ++-- .../components/Profile/ChangePass/index.jsx | 26 ++++-- .../components/Profile/ProfileActions.jsx | 10 ++- src/core/components/Profile/ProfileInfo.jsx | 24 +++--- src/core/components/Profile/Update/Form.jsx | 77 +++++++++-------- src/core/components/Profile/Update/index.jsx | 16 ++-- src/core/components/Profile/index.jsx | 14 +-- src/core/utils/getValueByPath.js | 2 +- src/core/utils/headerMenu.js | 86 +++++++++---------- src/core/utils/pageMenu.js | 20 ++--- src/lib/contexts/auth.js | 2 +- 19 files changed, 230 insertions(+), 203 deletions(-) diff --git a/src/components/layouts/dashboard/headerWithSidebar/HeaderMenu/index.jsx b/src/components/layouts/dashboard/headerWithSidebar/HeaderMenu/index.jsx index 0d87a5d..47decdf 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/HeaderMenu/index.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/HeaderMenu/index.jsx @@ -19,32 +19,23 @@ const HeaderMenu = ({ menu }) => { - + {menu.subMenu.flatMap((subMenu, index) => [ - ...subMenu.map(sub => ( - + ...subMenu.map((sub) => ( + {sub.title} )), - index < menu.subMenu.length - 1 && + index < menu.subMenu.length - 1 && , ])} diff --git a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarBadge.jsx b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarBadge.jsx index df8fbc2..4ee1a83 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarBadge.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarBadge.jsx @@ -1,22 +1,19 @@ import { getValueByPath } from "@/core/utils/getValueByPath"; -import { useSidebarBadge } from "@/lib/hooks/useSidebarBadge" -import { Chip } from "@mui/material" +import { useSidebarBadge } from "@/lib/hooks/useSidebarBadge"; +import { Chip } from "@mui/material"; import { useEffect, useState } from "react"; const SidebarBadge = ({ badge, chipProps = {} }) => { - const { data } = useSidebarBadge() - const [value, setValue] = useState() + const { data } = useSidebarBadge(); + const [value, setValue] = useState(); useEffect(() => { - setValue(getValueByPath(data, badge)) - }, [data, badge]) + setValue(getValueByPath(data, badge)); + }, [data, badge]); + if (!data) return null; + if (!value) return null; - if (!data) return null - if (!value) return null - - return ( - - ) -} -export default SidebarBadge \ No newline at end of file + return ; +}; +export default SidebarBadge; diff --git a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx index bde3bae..7b0aabc 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarListItems.jsx @@ -31,8 +31,10 @@ const SidebarListItems = ({ menuItem, dispatch }) => { {menuItem.badges && ( - - {menuItem.badges.map((badge, i) => )} + + {menuItem.badges.map((badge, i) => ( + + ))} )} {menuItem.hasSubitems ? menuItem.showSubitems ? : : null} diff --git a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarMenu.jsx b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarMenu.jsx index a745929..4142b7f 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarMenu.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarMenu.jsx @@ -28,9 +28,7 @@ function selectPage(item, route) { function toggleSubitems(items, actionId) { return items.map((item) => - actionId === item.id - ? { ...item, showSubitems: !item.showSubitems } - : { ...item, showSubitems: false } + actionId === item.id ? { ...item, showSubitems: !item.showSubitems } : { ...item, showSubitems: false } ); } @@ -48,28 +46,23 @@ function reducer(state, action) { case "COLLAPSE_SUB_ITEMS": return state.map((item) => - item.hasSubitems - ? { ...item, Subitems: toggleSubitems(item.Subitems, action.id) } - : item + item.hasSubitems ? { ...item, Subitems: toggleSubitems(item.Subitems, action.id) } : item ); case "COLLAPSE_SUB_SECOND_ITEMS": return state.map((item) => item.hasSubitems ? { - ...item, - Subitems: item.Subitems.map((subitem) => - subitem.hasSubitems - ? { - ...subitem, - Subitems: toggleSubitems( - subitem.Subitems, - action.id - ), - } - : subitem - ), - } + ...item, + Subitems: item.Subitems.map((subitem) => + subitem.hasSubitems + ? { + ...subitem, + Subitems: toggleSubitems(subitem.Subitems, action.id), + } + : subitem + ), + } : item ); @@ -108,15 +101,13 @@ const SidebarMenu = () => { return ( <> - { - userPermissions && ( - - {menuItems.map((menuItem) => { - return ; - })} - - ) - } + {userPermissions && ( + + {menuItems.map((menuItem) => { + return ; + })} + + )} ); }; diff --git a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarSubitems.jsx b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarSubitems.jsx index 6e51bcd..3018520 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarSubitems.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarSubitems.jsx @@ -29,11 +29,21 @@ const SidebarSubitems = ({ subitem, dispatch }) => { {subitem.badges && ( - - {subitem.badges.map((badge, i) => )} + + {subitem.badges.map((badge, i) => ( + + ))} )} - {subitem.hasSubitems ? subitem.showSubitems ? : : } + {subitem.hasSubitems ? ( + subitem.showSubitems ? ( + + ) : ( + + ) + ) : ( + + )} diff --git a/src/components/layouts/dashboard/headerWithSidebar/index.jsx b/src/components/layouts/dashboard/headerWithSidebar/index.jsx index c4e3fde..a0ffad2 100644 --- a/src/components/layouts/dashboard/headerWithSidebar/index.jsx +++ b/src/components/layouts/dashboard/headerWithSidebar/index.jsx @@ -10,7 +10,7 @@ import { headerMenu } from "@/core/utils/headerMenu"; import SidebarMenu from "./Sidebar/SidebarMenu"; const drawerWidth = 300; -const headersHeight = 136 +const headersHeight = 136; const Main = styled(Stack, { shouldForwardProp: (prop) => prop !== "open" })(({ theme, open }) => ({ flexGrow: 1, @@ -66,9 +66,14 @@ const HeaderWithSidebar = ({ children }) => { setOpen(false); }; return ( - + { - {headerMenu.map(menu => )} + {headerMenu.map((menu) => ( + + ))} @@ -104,7 +111,9 @@ const HeaderWithSidebar = ({ children }) => { open={open} > - تاریخ امروز: {now} + + تاریخ امروز: {now} + diff --git a/src/core/components/DataTable/body/TableBodyCell.js b/src/core/components/DataTable/body/TableBodyCell.js index 39f6895..292f39e 100644 --- a/src/core/components/DataTable/body/TableBodyCell.js +++ b/src/core/components/DataTable/body/TableBodyCell.js @@ -221,7 +221,7 @@ const DataTable_TableBodyCell = ({ cell, numRows, rowRef, staticColumnIndex, sta {tableCellProps.children ?? ( <> {cell.getIsPlaceholder() ? ( - columnDef.PlaceholderCell?.({ cell, column, row, table }) ?? null + (columnDef.PlaceholderCell?.({ cell, column, row, table }) ?? null) ) : showSkeletons !== false && (isLoading || showSkeletons) ? ( ) : columnDefType === "display" && diff --git a/src/core/components/DataTable/table/TableContainer.js b/src/core/components/DataTable/table/TableContainer.js index bc1d80c..3e1320e 100644 --- a/src/core/components/DataTable/table/TableContainer.js +++ b/src/core/components/DataTable/table/TableContainer.js @@ -27,9 +27,10 @@ const DataTable_TableContainer = ({ table, ...rest }) => { }; useIsomorphicLayoutEffect(() => { - const topToolbarHeight = typeof document !== "undefined" ? topToolbarRef.current?.offsetHeight ?? 0 : 0; + const topToolbarHeight = typeof document !== "undefined" ? (topToolbarRef.current?.offsetHeight ?? 0) : 0; - const bottomToolbarHeight = typeof document !== "undefined" ? bottomToolbarRef?.current?.offsetHeight ?? 0 : 0; + const bottomToolbarHeight = + typeof document !== "undefined" ? (bottomToolbarRef?.current?.offsetHeight ?? 0) : 0; setTotalToolbarHeight(topToolbarHeight + bottomToolbarHeight); }); diff --git a/src/core/components/Profile/ChangePass/Form.jsx b/src/core/components/Profile/ChangePass/Form.jsx index 3499394..80d1890 100644 --- a/src/core/components/Profile/ChangePass/Form.jsx +++ b/src/core/components/Profile/ChangePass/Form.jsx @@ -24,13 +24,11 @@ import VisibilityOff from "@mui/icons-material/VisibilityOff"; const validationSchema = object({ current_password: string().required("اجباری"), new_password: string().required("اجباری"), - repeat_new_password: string().required("اجباری").test( - "password-match", - "رمز عبور جدید و تکرار آن باید یکسان باشند", - function(value) { + repeat_new_password: string() + .required("اجباری") + .test("password-match", "رمز عبور جدید و تکرار آن باید یکسان باشند", function (value) { return this.parent.new_password === value; - }, - ), + }), }); const Form = ({ handleCloseForm, setLoading }) => { @@ -61,8 +59,7 @@ const Form = ({ handleCloseForm, setLoading }) => { try { await request(CHANGE_USER_PASSWORD, "post", { data: formData, signal: controller.signal }); handleCloseForm(); - } catch (error) { - } + } catch (error) {} }; return ( @@ -152,4 +149,4 @@ const Form = ({ handleCloseForm, setLoading }) => { ); }; -export default Form; \ No newline at end of file +export default Form; diff --git a/src/core/components/Profile/ChangePass/index.jsx b/src/core/components/Profile/ChangePass/index.jsx index 15e6fcd..4b388da 100644 --- a/src/core/components/Profile/ChangePass/index.jsx +++ b/src/core/components/Profile/ChangePass/index.jsx @@ -19,19 +19,29 @@ const ChangePass = ({ open, setOpen }) => { - + بستن - }> + } + > ثبت ); }; -export default ChangePass; \ No newline at end of file +export default ChangePass; diff --git a/src/core/components/Profile/ProfileActions.jsx b/src/core/components/Profile/ProfileActions.jsx index 7683547..1bb99be 100644 --- a/src/core/components/Profile/ProfileActions.jsx +++ b/src/core/components/Profile/ProfileActions.jsx @@ -35,9 +35,13 @@ const ProfileActions = () => { - { - setOpenChangePass(true); - }}> + { + setOpenChangePass(true); + }} + > diff --git a/src/core/components/Profile/ProfileInfo.jsx b/src/core/components/Profile/ProfileInfo.jsx index ea33e8f..6af5082 100644 --- a/src/core/components/Profile/ProfileInfo.jsx +++ b/src/core/components/Profile/ProfileInfo.jsx @@ -1,31 +1,35 @@ "use client"; +import { useAuth } from "@/lib/contexts/auth"; import { Avatar, Box, Chip, Divider, Stack, Typography } from "@mui/material"; +import moment from "jalali-moment"; const ProfileInfo = () => { + const { user } = useAuth(); + return ( <> - + - حسن محمد زاده عبدالله + {`${user.first_name} ${user.last_name}`} - .: اداره کل ستاد :. + .: {user.name} :. - آخرین ورود + + آخرین ورود + - 1 ساعت پیش + + {moment(user.last_login).locale("fa").fromNow()} + - + diff --git a/src/core/components/Profile/Update/Form.jsx b/src/core/components/Profile/Update/Form.jsx index 7c9a340..69b1466 100644 --- a/src/core/components/Profile/Update/Form.jsx +++ b/src/core/components/Profile/Update/Form.jsx @@ -53,11 +53,11 @@ const Form = ({ handleCloseForm, setLoading }) => { const { user, getUser } = useAuth(); const [uploadBackDrop, setUploadBackDrop] = useState(false); const defaultValues = { - first_name: user.data.first_name, - last_name: user.data.last_name, - major: user.data.major, - degree: user.data.degree, - mobile: user.data.mobile, + first_name: user.first_name, + last_name: user.last_name, + major: user.major, + degree: user.degree, + mobile: user.mobile, avatar: null, }; @@ -89,8 +89,7 @@ const Form = ({ handleCloseForm, setLoading }) => { await request(UPDATE_USER_ROUTE, "post", { data: formData }); getUser(); handleCloseForm(); - } catch (error) { - } + } catch (error) {} }; return ( @@ -99,15 +98,17 @@ const Form = ({ handleCloseForm, setLoading }) => { - + @@ -156,8 +161,9 @@ const Form = ({ handleCloseForm, setLoading }) => { fullWidth type="text" /> - {errors.first_name ? errors.first_name.message : null} + + {errors.first_name ? errors.first_name.message : null} + @@ -172,8 +178,9 @@ const Form = ({ handleCloseForm, setLoading }) => { fullWidth type="text" /> - {errors.last_name ? errors.last_name.message : null} + + {errors.last_name ? errors.last_name.message : null} + @@ -188,8 +195,7 @@ const Form = ({ handleCloseForm, setLoading }) => { fullWidth type="text" /> - {errors.major ? errors.major.message : null} + {errors.major ? errors.major.message : null} @@ -217,9 +223,7 @@ const Form = ({ handleCloseForm, setLoading }) => { /> )} /> - - {error ? error.message : null} - + {error ? error.message : null} )} /> @@ -236,8 +240,7 @@ const Form = ({ handleCloseForm, setLoading }) => { fullWidth type="text" /> - {errors.mobile ? errors.mobile.message : null} + {errors.mobile ? errors.mobile.message : null} @@ -245,4 +248,4 @@ const Form = ({ handleCloseForm, setLoading }) => { ); }; -export default Form; \ No newline at end of file +export default Form; diff --git a/src/core/components/Profile/Update/index.jsx b/src/core/components/Profile/Update/index.jsx index 9228261..d72b5a0 100644 --- a/src/core/components/Profile/Update/index.jsx +++ b/src/core/components/Profile/Update/index.jsx @@ -25,14 +25,20 @@ const Update = ({ open, setOpen }) => { - }> + } + > ثبت ); }; -export default Update; \ No newline at end of file +export default Update; diff --git a/src/core/components/Profile/index.jsx b/src/core/components/Profile/index.jsx index 3741dc2..fd5cbf4 100644 --- a/src/core/components/Profile/index.jsx +++ b/src/core/components/Profile/index.jsx @@ -6,12 +6,14 @@ import ProfileActions from "./ProfileActions"; const Profile = () => { return ( - + diff --git a/src/core/utils/getValueByPath.js b/src/core/utils/getValueByPath.js index 6f51b4f..a31f76f 100644 --- a/src/core/utils/getValueByPath.js +++ b/src/core/utils/getValueByPath.js @@ -11,4 +11,4 @@ export const getValueByPath = (obj, path) => { } return value; -} \ No newline at end of file +}; diff --git a/src/core/utils/headerMenu.js b/src/core/utils/headerMenu.js index 4f42f34..32438bb 100644 --- a/src/core/utils/headerMenu.js +++ b/src/core/utils/headerMenu.js @@ -1,80 +1,80 @@ export const headerMenu = [ { - title: 'تصادفات', + title: "تصادفات", subMenu: [ [ { - title: 'تصادفات روزانه', - href: 'https://rms.witel.ir/v2/daily_accidents/create' - } - ] - ] + title: "تصادفات روزانه", + href: "https://rms.witel.ir/v2/daily_accidents/create", + }, + ], + ], }, { - title: 'گزارش های جامع', + title: "گزارش های جامع", subMenu: [ [ { - title: 'گزارش محوری', - href: 'https://rms.witel.ir/v2/axis_reports' + title: "گزارش محوری", + href: "https://rms.witel.ir/v2/axis_reports", }, { - title: 'هوش تجاری (‌BI)', - href: 'https://rms.witel.ir/v2/axis_reports' - } - ] - ] + title: "هوش تجاری (‌BI)", + href: "https://rms.witel.ir/v2/axis_reports", + }, + ], + ], }, { - title: 'زیرساخت و ناوگان', + title: "زیرساخت و ناوگان", subMenu: [ [ { - title: 'پراکندگی بر روی نقشه راهدارخانه ها', - href: 'https://rms.witel.ir/v2/map?type=rahdar' + title: "پراکندگی بر روی نقشه راهدارخانه ها", + href: "https://rms.witel.ir/v2/map?type=rahdar", }, { - title: 'راهدارخانه ها', - href: 'https://rms.witel.ir/v2/rahdari_points' - } + title: "راهدارخانه ها", + href: "https://rms.witel.ir/v2/rahdari_points", + }, ], [ { - title: 'ممیزی ماشین آلات راهداری کشور', - href: 'https://rms.witel.ir/cmms-audit' - } - ] - ] + title: "ممیزی ماشین آلات راهداری کشور", + href: "https://rms.witel.ir/cmms-audit", + }, + ], + ], }, { - title: 'سامانه های راهداری', + title: "سامانه های راهداری", subMenu: [ [ { - title: 'تحقیق و توسعه', - href: 'https://rms.witel.ir/RandD' + title: "تحقیق و توسعه", + href: "https://rms.witel.ir/RandD", }, { - title: 'سامانه مدیریت یکپارچه زیرساخت های راه (PMS,BMS,SMS)', - href: 'http://roadams.rmto.ir' + title: "سامانه مدیریت یکپارچه زیرساخت های راه (PMS,BMS,SMS)", + href: "http://roadams.rmto.ir", }, { - title: 'سامانه مدیریت ناوگان (FMS)', - href: 'http://fms.141.ir' + title: "سامانه مدیریت ناوگان (FMS)", + href: "http://fms.141.ir", }, { - title: 'سامانه جامع مدیریت سوانح و حوادث جاده ای', - href: 'https://items.rmto.ir' + title: "سامانه جامع مدیریت سوانح و حوادث جاده ای", + href: "https://items.rmto.ir", }, { - title: 'سامانه مدیریت نگهداری ماشین آلات (CMMS)', - href: 'https://cmms.rmto.ir/Login.aspx?ReturnUrl=%2f' + title: "سامانه مدیریت نگهداری ماشین آلات (CMMS)", + href: "https://cmms.rmto.ir/Login.aspx?ReturnUrl=%2f", }, { - title: 'درگاه کاتالوگ داده', - href: 'https://roadams.rmto.ir:8080' - } - ] - ] - } -] \ No newline at end of file + title: "درگاه کاتالوگ داده", + href: "https://roadams.rmto.ir:8080", + }, + ], + ], + }, +]; diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js index 306b6ec..6087440 100644 --- a/src/core/utils/pageMenu.js +++ b/src/core/utils/pageMenu.js @@ -91,7 +91,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_items.total'], + badges: ["road_items.total"], Subitems: [ { id: "roadItemManagmentSupervisor", @@ -99,7 +99,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_items.supervise_cnt'], + badges: ["road_items.supervise_cnt"], Subitems: [ { id: "roadItemManagmentSupervisorCartable", @@ -119,7 +119,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_items.operation_cnt'], + badges: ["road_items.operation_cnt"], Subitems: [ { id: "roadItemManagmentOparationCreate", @@ -169,7 +169,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_patrols.total'], + badges: ["road_patrols.total"], Subitems: [ { id: "roadPatrolManagmentSupervisor", @@ -177,7 +177,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_patrols.supervise_cnt'], + badges: ["road_patrols.supervise_cnt"], Subitems: [ { id: "roadPatrolManagmentSupervisorCartable", @@ -197,7 +197,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_patrols.operation_cnt'], + badges: ["road_patrols.operation_cnt"], Subitems: [ { id: "roadPatrolManagmentOparationCreate", @@ -277,7 +277,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['safety_and_privacy.step_one', 'safety_and_privacy.step_two'], + badges: ["safety_and_privacy.step_one", "safety_and_privacy.step_two"], Subitems: [ { id: "safetyAndPrivacyManagmentOparation", @@ -340,7 +340,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_observations.total'], + badges: ["road_observations.total"], Subitems: [ { id: "roadObservationsManagmentSupervisor", @@ -348,7 +348,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_observations.supervise_cnt'], + badges: ["road_observations.supervise_cnt"], Subitems: [ { id: "roadObservationsManagmentSupervisorCartable", @@ -373,7 +373,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_observations.operation_cnt'], + badges: ["road_observations.operation_cnt"], Subitems: [ { id: "roadObservationsManagmentOparationCartable", diff --git a/src/lib/contexts/auth.js b/src/lib/contexts/auth.js index 0dfa41a..edc83fb 100644 --- a/src/lib/contexts/auth.js +++ b/src/lib/contexts/auth.js @@ -54,7 +54,7 @@ export const AuthProvider = ({ children }) => { const getUser = useCallback(async () => { try { const { data } = await axios.get(GET_USER_ROUTE, { withCredentials: true }); - changeUser(data); + changeUser(data.data); changeAuthState(true); changeInitAuth(true); } catch (error) { From baa084601162fd347f54e47cfad6f3ad8a5f5eb2 Mon Sep 17 00:00:00 2001 From: Mohammad Jalali Date: Mon, 16 Sep 2024 11:32:15 +0330 Subject: [PATCH 22/31] add new pages for panjere vahed to sidebar --- .../assistant/zaminGov/index.jsx | 2 +- .../cityAdmin/zaminGov/index.jsx | 2 +- .../generalManager/zaminGov/index.jsx | 2 +- .../provinceAdmin/zaminGov/index.jsx | 2 +- src/core/utils/pageMenu.js | 45 +++++++++++-------- src/core/utils/routes.js | 3 -- 6 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx index 92e8cd3..ef86fbd 100644 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx @@ -6,7 +6,7 @@ import { Stack } from "@mui/material"; const AssistantZaminGovComponent = () => { return ( - + ); }; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx index 3b2e7e6..70d4323 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx @@ -6,7 +6,7 @@ import { Stack } from "@mui/material"; const CityAdminZaminGovComponent = () => { return ( - + ); }; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx index 5640ef9..a57f26a 100644 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx @@ -6,7 +6,7 @@ import { Stack } from "@mui/material"; const GeneralManagerZaminGovComponent = () => { return ( - + ); }; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx index 84e6cd7..83e1a1c 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx @@ -6,7 +6,7 @@ import { Stack } from "@mui/material"; const ProvinceAdminZaminGovComponent = () => { return ( - + ); }; diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js index 306b6ec..7ab77de 100644 --- a/src/core/utils/pageMenu.js +++ b/src/core/utils/pageMenu.js @@ -91,7 +91,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_items.total'], + badges: ["road_items.total"], Subitems: [ { id: "roadItemManagmentSupervisor", @@ -99,7 +99,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_items.supervise_cnt'], + badges: ["road_items.supervise_cnt"], Subitems: [ { id: "roadItemManagmentSupervisorCartable", @@ -119,7 +119,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_items.operation_cnt'], + badges: ["road_items.operation_cnt"], Subitems: [ { id: "roadItemManagmentOparationCreate", @@ -169,7 +169,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_patrols.total'], + badges: ["road_patrols.total"], Subitems: [ { id: "roadPatrolManagmentSupervisor", @@ -177,7 +177,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_patrols.supervise_cnt'], + badges: ["road_patrols.supervise_cnt"], Subitems: [ { id: "roadPatrolManagmentSupervisorCartable", @@ -197,7 +197,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_patrols.operation_cnt'], + badges: ["road_patrols.operation_cnt"], Subitems: [ { id: "roadPatrolManagmentOparationCreate", @@ -249,24 +249,31 @@ export const pageMenu = [ hasSubitems: true, Subitems: [ { - id: "inquiryPrivacyManagmentFencing", - label: "احداث و بهره برداری دیوارکشی و مستحدثات", + id: "cityAdminZaminGov", + label: "استعلام حرائم پنجره واحد", type: "page", - route: "/dashboard/inquiry_privacy/fencing", + route: "/dashboard/inquiry-privacy/city-admin/zamin-gov", permissions: ["all"], }, { - id: "inquiryPrivacyManagmentRoad", - label: "احداث راه دسترسی اختصاصی", + id: "provinceAdminZaminGov", + label: "استعلام حرائم پنجره واحد", type: "page", - route: "/dashboard/inquiry_privacy/road", + route: "/dashboard/inquiry-privacy/province-admin/zamin-gov", permissions: ["all"], }, { - id: "inquiryPrivacyManagmentInfrastructure", - label: "احداث و بهره برداری تاسیسات زیربنایی", + id: "assistantZaminGov", + label: "استعلام حرائم پنجره واحد", type: "page", - route: "/dashboard/inquiry_privacy/infrastructure", + route: "/dashboard/inquiry-privacy/assistant/zamin-gov", + permissions: ["all"], + }, + { + id: "generalManagerZaminGov", + label: "استعلام حرائم پنجره واحد", + type: "page", + route: "/dashboard/inquiry-privacy/general-manager/zamin-gov", permissions: ["all"], }, ], @@ -277,7 +284,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['safety_and_privacy.step_one', 'safety_and_privacy.step_two'], + badges: ["safety_and_privacy.step_one", "safety_and_privacy.step_two"], Subitems: [ { id: "safetyAndPrivacyManagmentOparation", @@ -340,7 +347,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_observations.total'], + badges: ["road_observations.total"], Subitems: [ { id: "roadObservationsManagmentSupervisor", @@ -348,7 +355,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_observations.supervise_cnt'], + badges: ["road_observations.supervise_cnt"], Subitems: [ { id: "roadObservationsManagmentSupervisorCartable", @@ -373,7 +380,7 @@ export const pageMenu = [ type: "menu", icon: , hasSubitems: true, - badges: ['road_observations.operation_cnt'], + badges: ["road_observations.operation_cnt"], Subitems: [ { id: "roadObservationsManagmentOparationCartable", diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index a666263..8e4b47b 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -4,8 +4,5 @@ export const GET_USER_ROUTE = api + "/api/v3/profile/info"; 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_INQUIRY_PRIVACY_FENCING_ROUTE = api + "/api/v3/harim/divarkeshi"; export const GET_PERMISSIONS_ROUTE = api + "/webapi/user/get-permission"; export const GET_SIDEBAR_BADGE_ROUTE = api + "/v2/activity_statistics"; - -export const SET_INQUIRE_PRIVACY_FENCING = api + "/api/v3/harim/divarkeshi/store"; From 885c9bdecd946ded8c40dfa758ec1bf454eff4cc Mon Sep 17 00:00:00 2001 From: Mohammad Jalali Date: Mon, 16 Sep 2024 16:44:59 +0330 Subject: [PATCH 23/31] complete all 4 pages with their table and make a adapter for datatable --- src/app/api/fake-data/route.js | 7 + .../assistant/zaminGov/TaskList.jsx | 130 ++++++++++++++++++ .../assistant/zaminGov/index.jsx | 2 + .../cityAdmin/zaminGov/TaskList.jsx | 130 ++++++++++++++++++ .../cityAdmin/zaminGov/index.jsx | 2 + .../generalManager/zaminGov/TaskList.jsx | 130 ++++++++++++++++++ .../generalManager/zaminGov/index.jsx | 2 + .../provinceAdmin/zaminGov/TaskList.jsx | 130 ++++++++++++++++++ .../provinceAdmin/zaminGov/index.jsx | 2 + src/core/components/DataTable/Main.js | 2 +- src/core/components/DataTableWithAuth.jsx | 13 ++ 11 files changed, 549 insertions(+), 1 deletion(-) create mode 100644 src/app/api/fake-data/route.js create mode 100644 src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx create mode 100644 src/core/components/DataTableWithAuth.jsx diff --git a/src/app/api/fake-data/route.js b/src/app/api/fake-data/route.js new file mode 100644 index 0000000..9b7ab03 --- /dev/null +++ b/src/app/api/fake-data/route.js @@ -0,0 +1,7 @@ +const data = [ + // put your fake data here +]; + +export async function GET() { + return Response.json({ data }); +} \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx new file mode 100644 index 0000000..b858b03 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx @@ -0,0 +1,130 @@ +"use client"; + +import { useMemo } from "react"; +import { Box, IconButton, Tooltip } from "@mui/material"; +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import AssignmentIcon from "@mui/icons-material/Assignment"; + +const TaskList = () => { + const columns = useMemo( + () => [ + { + accessorKey: "aplication_number", + header: "شماره درخواست", + id: "aplication_number", + enableColumnFilter: false, + datatype: "text", + filterFn: "notEquals", + }, + { + accessorKey: "application_date", + header: "تاریخ درخواست", + id: "application_date", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "province", + header: "استان", + id: "province", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "city", + header: "شهر", + id: "city", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "county", + header: "بخش", + id: "county", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "village", + header: "روستا", + id: "village", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "land_area", + header: "مساحت زمین", + id: "land_area", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "design_area", + header: "مساحت طرح", + id: "design_area", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "organization", + header: "سازمان", + id: "organization", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "design_group", + header: "گروه طرح", + id: "design_group", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "design_title", + header: "عنوان طرح", + id: "design_title", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + ], + [], + ); + + return ( + <> + + ( + + console.log("next part")} + > + + + + )} + /> + + + ); +}; +export default TaskList; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx index ef86fbd..6de55e0 100644 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx @@ -2,11 +2,13 @@ import PageTitle from "@/core/components/PageTitle"; import { Stack } from "@mui/material"; +import TaskList from "./TaskList"; const AssistantZaminGovComponent = () => { return ( + ); }; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx new file mode 100644 index 0000000..6951ea6 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx @@ -0,0 +1,130 @@ +"use client"; + +import { useMemo } from "react"; +import { Box, IconButton, Tooltip } from "@mui/material"; +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import AssignmentIcon from "@mui/icons-material/Assignment"; + +const TaskList = () => { + const columns = useMemo( + () => [ + { + accessorKey: "aplication_number", + header: "شماره درخواست", + id: "aplication_number", + enableColumnFilter: false, + datatype: "text", + filterFn: "notEquals", + }, + { + accessorKey: "application_date", + header: "تاریخ درخواست", + id: "application_date", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "province", + header: "استان", + id: "province", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "city", + header: "شهر", + id: "city", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "county", + header: "بخش", + id: "county", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "village", + header: "روستا", + id: "village", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "land_area", + header: "مساحت زمین", + id: "land_area", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "design_area", + header: "مساحت طرح", + id: "design_area", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "organization", + header: "سازمان", + id: "organization", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "design_group", + header: "گروه طرح", + id: "design_group", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "design_title", + header: "عنوان طرح", + id: "design_title", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + ], + [], + ); + + return ( + <> + + ( + + console.log("next part")} + > + + + + )} + /> + + + ); +}; +export default TaskList; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx index 70d4323..29f2aeb 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx @@ -2,11 +2,13 @@ import PageTitle from "@/core/components/PageTitle"; import { Stack } from "@mui/material"; +import TaskList from "./TaskList"; const CityAdminZaminGovComponent = () => { return ( + ); }; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx new file mode 100644 index 0000000..ee5e667 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx @@ -0,0 +1,130 @@ +"use client"; + +import { useMemo } from "react"; +import { Box, IconButton, Tooltip } from "@mui/material"; +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import AssignmentIcon from "@mui/icons-material/Assignment"; + +const TaskList = () => { + const columns = useMemo( + () => [ + { + accessorKey: "aplication_number", + header: "شماره درخواست", + id: "aplication_number", + enableColumnFilter: false, + datatype: "text", + filterFn: "notEquals", + }, + { + accessorKey: "application_date", + header: "تاریخ درخواست", + id: "application_date", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "province", + header: "استان", + id: "province", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "city", + header: "شهر", + id: "city", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "county", + header: "بخش", + id: "county", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "village", + header: "روستا", + id: "village", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "land_area", + header: "مساحت زمین", + id: "land_area", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "design_area", + header: "مساحت طرح", + id: "design_area", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "organization", + header: "سازمان", + id: "organization", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "design_group", + header: "گروه طرح", + id: "design_group", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "design_title", + header: "عنوان طرح", + id: "design_title", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + ], + [], + ); + + return ( + <> + + ( + + console.log("next part")} + > + + + + )} + /> + + + ); +}; +export default TaskList; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx index a57f26a..f348745 100644 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx @@ -2,11 +2,13 @@ import PageTitle from "@/core/components/PageTitle"; import { Stack } from "@mui/material"; +import TaskList from "./TaskList"; const GeneralManagerZaminGovComponent = () => { return ( + ); }; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx new file mode 100644 index 0000000..02b750e --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx @@ -0,0 +1,130 @@ +"use client"; + +import { useMemo } from "react"; +import { Box, IconButton, Tooltip } from "@mui/material"; +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import AssignmentIcon from "@mui/icons-material/Assignment"; + +const TaskList = () => { + const columns = useMemo( + () => [ + { + accessorKey: "aplication_number", + header: "شماره درخواست", + id: "aplication_number", + enableColumnFilter: false, + datatype: "text", + filterFn: "notEquals", + }, + { + accessorKey: "application_date", + header: "تاریخ درخواست", + id: "application_date", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "province", + header: "استان", + id: "province", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "city", + header: "شهر", + id: "city", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "county", + header: "بخش", + id: "county", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "village", + header: "روستا", + id: "village", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "land_area", + header: "مساحت زمین", + id: "land_area", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "design_area", + header: "مساحت طرح", + id: "design_area", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "organization", + header: "سازمان", + id: "organization", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "design_group", + header: "گروه طرح", + id: "design_group", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "design_title", + header: "عنوان طرح", + id: "design_title", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + ], + [], + ); + + return ( + <> + + ( + + console.log("next part")} + > + + + + )} + /> + + + ); +}; +export default TaskList; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx index 83e1a1c..a8609f8 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx @@ -2,11 +2,13 @@ import PageTitle from "@/core/components/PageTitle"; import { Stack } from "@mui/material"; +import TaskList from "./TaskList"; const ProvinceAdminZaminGovComponent = () => { return ( + ); }; diff --git a/src/core/components/DataTable/Main.js b/src/core/components/DataTable/Main.js index 5aed12b..8a4c0a1 100644 --- a/src/core/components/DataTable/Main.js +++ b/src/core/components/DataTable/Main.js @@ -108,7 +108,7 @@ const DataTable_Main = (props) => { onSortingChange: onSortingChange, renderTopToolbarCustomActions: ({ table }) => ( <> - + {TableToolbar && } ), ...props, diff --git a/src/core/components/DataTableWithAuth.jsx b/src/core/components/DataTableWithAuth.jsx new file mode 100644 index 0000000..ee0a6c4 --- /dev/null +++ b/src/core/components/DataTableWithAuth.jsx @@ -0,0 +1,13 @@ +import DataTable from "@/core/components/DataTable"; +import { useAuth } from "@/lib/contexts/auth"; + +const DataTableWithAuth = (props) => { + const { user } = useAuth(); + return ( + + ); +}; +export default DataTableWithAuth; From c854cf7b60b3dbca67f36d510c91752bff025172 Mon Sep 17 00:00:00 2001 From: Amin Ghasempoor Date: Wed, 18 Sep 2024 06:12:50 +0000 Subject: [PATCH 24/31] refer form admin city/province --- src/app/api/fake-cities/route.js | 18 +++ src/app/api/fake-data/route.js | 36 ++++- src/app/api/fake-provinces/route.js | 18 +++ src/app/api/fake-submit/[id]/route.js | 3 + .../RowActions/Refer/ReferFormContext.jsx | 140 +++++++++++++++++ .../zaminGov/RowActions/Refer/index.jsx | 36 +++++ .../cityAdmin/zaminGov/RowActions/index.jsx | 8 + .../cityAdmin/zaminGov/TaskList.jsx | 20 +-- .../cityAdmin/zaminGov/index.jsx | 2 +- .../RowActions/Refer/ReferFormContext.jsx | 141 ++++++++++++++++++ .../zaminGov/RowActions/Refer/index.jsx | 37 +++++ .../zaminGov/RowActions/index.jsx | 8 + .../provinceAdmin/zaminGov/TaskList.jsx | 20 +-- src/core/utils/routes.js | 4 + src/lib/hooks/useCities.js | 29 ++++ src/lib/hooks/useProvince.js | 29 ++++ 16 files changed, 527 insertions(+), 22 deletions(-) create mode 100644 src/app/api/fake-cities/route.js create mode 100644 src/app/api/fake-provinces/route.js create mode 100644 src/app/api/fake-submit/[id]/route.js create mode 100644 src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx create mode 100644 src/lib/hooks/useCities.js create mode 100644 src/lib/hooks/useProvince.js diff --git a/src/app/api/fake-cities/route.js b/src/app/api/fake-cities/route.js new file mode 100644 index 0000000..ad8512a --- /dev/null +++ b/src/app/api/fake-cities/route.js @@ -0,0 +1,18 @@ +const data = [ + { + id : 1, + name : "تهران" + }, + { + id : 2, + name : "ری" + }, + { + id : 3, + name : "اندیشه" + }, +]; + +export async function GET() { + return Response.json({ data }); +} \ No newline at end of file diff --git a/src/app/api/fake-data/route.js b/src/app/api/fake-data/route.js index 9b7ab03..2dca9c3 100644 --- a/src/app/api/fake-data/route.js +++ b/src/app/api/fake-data/route.js @@ -1,5 +1,39 @@ const data = [ - // put your fake data here + { + id : 1, + aplication_number : 1, + application_date : "1", + province:"tehran", + city:"tehran" + }, + { + id : 2, + aplication_number : 2, + application_date : "1", + province:"tehran", + city:"tehran" + }, + { + id : 3, + aplication_number : 3, + application_date : "1", + province:"tehran", + city:"tehran" + }, + { + id : 4, + aplication_number : 4, + application_date : "1", + province:"tehran", + city:"tehran" + }, + { + id : 5, + aplication_number : 5, + application_date : "1", + province:"tehran", + city:"tehran" + }, ]; export async function GET() { diff --git a/src/app/api/fake-provinces/route.js b/src/app/api/fake-provinces/route.js new file mode 100644 index 0000000..c044fdc --- /dev/null +++ b/src/app/api/fake-provinces/route.js @@ -0,0 +1,18 @@ +const data = [ + { + id : 1, + name : "تهران" + }, + { + id : 2, + name : "مشهد" + }, + { + id : 3, + name : "اصفهان" + }, +]; + +export async function GET() { + return Response.json({ data }); +} \ No newline at end of file diff --git a/src/app/api/fake-submit/[id]/route.js b/src/app/api/fake-submit/[id]/route.js new file mode 100644 index 0000000..c8e821b --- /dev/null +++ b/src/app/api/fake-submit/[id]/route.js @@ -0,0 +1,3 @@ +export async function POST() { + return Response.json({message : "Done"}); +} \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx new file mode 100644 index 0000000..44a9d7e --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx @@ -0,0 +1,140 @@ +import { + Autocomplete, + Button, CircularProgress, + DialogActions, + DialogContent, + FormControl, FormHelperText, + InputLabel, OutlinedInput, + Stack, + TextField, Typography +} from "@mui/material"; +import {Controller, useForm} from "react-hook-form"; +import {yupResolver} from "@hookform/resolvers/yup"; +import {object, string} from "yup"; +import StyledForm from "@/core/components/StyledForm"; +import useCities from "@/lib/hooks/useCities"; +import useRequest from "@/lib/hooks/useRequest"; +import {REFER_ADMIN_CITY} from "@/core/utils/routes"; + +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), + city: string().required("وارد کردن شهرستان الزامیست!"), +}); + +const ReferFormContext = ({setOpenReferDialog, rowId, mutate}) => { + const defaultValues = { + description: "", + city: "", + }; + const { cities, loadingCities, errorCities } = useCities() + const requestServer = useRequest({auth: true}) + const { + control, + register, + handleSubmit, + formState: {isSubmitting, errors, touchedFields}, + } = useForm({defaultValues, resolver: yupResolver(validationSchema), mode : "onBlur"}) + + const onSubmit = async (data) => { + const formData = new FormData(); + formData.append("description", data.description); + formData.append("cityId", data.city); + requestServer(`${REFER_ADMIN_CITY}/${rowId}`, 'post', { + data: formData, + }).then(() => { + setOpenReferDialog(false) + mutate() + }).catch(() => {}) + } + return ( + + + + + + توضیحات + + {errors.description ? errors.description.message : null} + + + + ( + + + {errorCities ? ( + خطایی در دریافت شهرستان ها رخ داده است! + ) : + loadingCities ? ( + + + درحال دریافت لیست شهرستان ها + + ) : ( + city.id === value) || null} + disablePortal + options={cities} + getOptionLabel={(city) => city.name} + isOptionEqualToValue={(option, value) => option.id === value.id} + onChange={(event, newValue) => { + onChange(newValue ? newValue.id : ""); + }} + renderInput={(params) => ( + + )} + /> + )} + + {errors.city ? errors.city.message : null} + + + )} + /> + + + + + + + + + ) +} +export default ReferFormContext \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx new file mode 100644 index 0000000..b746879 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx @@ -0,0 +1,36 @@ +import {Dialog, DialogTitle, IconButton, Stack, Tooltip} from "@mui/material"; +import ReplyIcon from '@mui/icons-material/Reply'; +import DialogTransition from "@/core/components/DialogTransition"; +import ReferFormContext from "@/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext"; +import {useState} from "react"; + +const ReferForm = ({rowId, mutate}) => { + const [openReferDialog, setOpenReferDialog] = useState(false) + return( + + + { + setOpenReferDialog(true) + }} + > + + + + + + ارجاع به شهرستان دیگر + + + + + ) +} +export default ReferForm \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx new file mode 100644 index 0000000..a1ff5bc --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx @@ -0,0 +1,8 @@ +import ReferForm from "@/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer"; + +const RowActions = ({row, mutate}) => { + return( + //rowId should pass + ) +} +export default RowActions \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx index 6951ea6..16bd2d4 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx @@ -4,10 +4,19 @@ import { useMemo } from "react"; import { Box, IconButton, Tooltip } from "@mui/material"; import DataTableWithAuth from "@/core/components/DataTableWithAuth"; import AssignmentIcon from "@mui/icons-material/Assignment"; +import RowActions from "@/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions"; const TaskList = () => { const columns = useMemo( () => [ + { + accessorKey: "id", + header: "کد یکتا", + id: "id", + enableColumnFilter: false, + datatype: "text", + filterFn: "notEquals", + }, { accessorKey: "aplication_number", header: "شماره درخواست", @@ -112,16 +121,7 @@ const TaskList = () => { table_name={"cityAdminZaminGovList"} enableRowActions positionActionsColumn={"last"} - renderRowActions={({ row, table }) => ( - - console.log("next part")} - > - - - - )} + renderRowActions={({ row, table }) => } /> diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx index 29f2aeb..fe573a5 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx @@ -1,10 +1,10 @@ "use client"; - import PageTitle from "@/core/components/PageTitle"; import { Stack } from "@mui/material"; import TaskList from "./TaskList"; const CityAdminZaminGovComponent = () => { + return ( diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx new file mode 100644 index 0000000..c43d922 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx @@ -0,0 +1,141 @@ +import { + Autocomplete, + Button, CircularProgress, + DialogActions, + DialogContent, + FormControl, FormHelperText, + InputLabel, OutlinedInput, + Stack, + TextField, Typography +} from "@mui/material"; +import {Controller, useForm} from "react-hook-form"; +import {yupResolver} from "@hookform/resolvers/yup"; +import {object, string} from "yup"; +import StyledForm from "@/core/components/StyledForm"; +import useProvinces from "@/lib/hooks/useProvince"; +import useRequest from "@/lib/hooks/useRequest"; +import {REFER_ADMIN_PROVINCE} from "@/core/utils/routes"; + +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), + province: string().required("وارد کردن استان الزامیست!"), +}); + +const ReferFormContext = ({setOpenReferDialog, rowId, mutate}) => { + const defaultValues = { + description: "", + province: "", + }; + const { provinces, loadingProvinces, errorProvinces } = useProvinces() + const requestServer = useRequest({auth: true}) + const { + control, + register, + handleSubmit, + formState: {isSubmitting, errors, touchedFields}, + } = useForm({defaultValues, resolver: yupResolver(validationSchema), mode : "onBlur"}) + + const onSubmit = async (data) => { + const formData = new FormData(); + formData.append("description", data.description); + formData.append("provinceId", data.province); + + requestServer(`${REFER_ADMIN_PROVINCE}/${rowId}`, 'post', { + data: formData, + }).then(() => { + setOpenReferDialog(false) + mutate() + }).catch(() => {}) + } + return ( + + + + + + توضیحات + + {errors.description ? errors.description.message : null} + + + + ( + + + {errorProvinces ? ( + خطایی در دریافت استان ها رخ داده است! + ) : + loadingProvinces ? ( + + + درحال دریافت لیست استان ها + + ) : ( + province.id === value) || null} + disablePortal + options={provinces} + getOptionLabel={(province) => province.name} + isOptionEqualToValue={(option, value) => option.id === value.id} + onChange={(event, newValue) => { + onChange(newValue ? newValue.id : ""); + }} + renderInput={(params) => ( + + )} + /> + )} + + {errors.province ? errors.province.message : null} + + + )} + /> + + + + + + + + + ) +} +export default ReferFormContext \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx new file mode 100644 index 0000000..171a03d --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx @@ -0,0 +1,37 @@ +import {Dialog, DialogTitle, IconButton, Stack, Tooltip} from "@mui/material"; +import ReplyIcon from '@mui/icons-material/Reply'; +import DialogTransition from "@/core/components/DialogTransition"; +import {useState} from "react"; +import ReferFormContext + from "@/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext"; + +const ReferForm = ({rowId, mutate}) => { + const [openReferDialog, setOpenReferDialog] = useState(false) + return( + + + { + setOpenReferDialog(true) + }} + > + + + + + + ارجاع به استان دیگر + + + + + ) +} +export default ReferForm \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx new file mode 100644 index 0000000..9924ac7 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx @@ -0,0 +1,8 @@ +import ReferForm from "@/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer"; + +const RowActions = ({row, mutate}) => { + return( + //rowId should pass + ) +} +export default RowActions \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx index 02b750e..a7f9a46 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx @@ -4,10 +4,19 @@ import { useMemo } from "react"; import { Box, IconButton, Tooltip } from "@mui/material"; import DataTableWithAuth from "@/core/components/DataTableWithAuth"; import AssignmentIcon from "@mui/icons-material/Assignment"; +import RowActions from "@/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions"; const TaskList = () => { const columns = useMemo( () => [ + { + accessorKey: "id", + header: "کد یکتا", + id: "id", + enableColumnFilter: false, + datatype: "text", + filterFn: "notEquals", + }, { accessorKey: "aplication_number", header: "شماره درخواست", @@ -112,16 +121,7 @@ const TaskList = () => { table_name={"provinceAdminZaminGovList"} enableRowActions positionActionsColumn={"last"} - renderRowActions={({ row, table }) => ( - - console.log("next part")} - > - - - - )} + renderRowActions={({ row, table }) => } /> diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index 8e4b47b..0bbfb0a 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -6,3 +6,7 @@ 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 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" +export const GET_PROVINCE_LISTS = "/v3/api/fake-provinces" diff --git a/src/lib/hooks/useCities.js b/src/lib/hooks/useCities.js new file mode 100644 index 0000000..e86a673 --- /dev/null +++ b/src/lib/hooks/useCities.js @@ -0,0 +1,29 @@ +import { useState, useEffect } from "react"; +import axios from "axios"; +import {GET_CITY_LISTS} from "@/core/utils/routes"; + +const useCities = () => { + const [cities, setCities] = useState([]); + const [loadingCities, setLoadingCities] = useState(true); + const [errorCities, setErrorCities] = useState(null); + + useEffect(() => { + const fetchCities = async () => { + try { + const response = await axios.get(`${GET_CITY_LISTS}`); + setCities(response.data.data); + setLoadingCities(false); + } catch (e) { + console.error("Error fetching cities:", e); + setErrorCities(e); + setLoadingCities(false); + } + }; + + fetchCities(); + }, []); + + return { cities, loadingCities, errorCities }; +}; + +export default useCities; diff --git a/src/lib/hooks/useProvince.js b/src/lib/hooks/useProvince.js new file mode 100644 index 0000000..5a96cf2 --- /dev/null +++ b/src/lib/hooks/useProvince.js @@ -0,0 +1,29 @@ +import { useState, useEffect } from "react"; +import axios from "axios"; +import {GET_PROVINCE_LISTS} from "@/core/utils/routes"; + +const useProvinces = () => { + const [provinces, setProvinces] = useState([]); + const [loadingProvinces, setLoadingProvinces] = useState(true); + const [errorProvinces, setErrorProvinces] = useState(null); + + useEffect(() => { + const fetchCities = async () => { + try { + const response = await axios.get(`${GET_PROVINCE_LISTS}`); // Fetch the cities from the API + setProvinces(response.data.data); // Set the cities data + setLoadingProvinces(false); // Set loading to false after successful fetch + } catch (e) { + console.error("Error fetching cities:", e); + setErrorProvinces(e); + setLoadingProvinces(false); + } + }; + + fetchCities(); // Call the fetch function + }, []); // Empty dependency array to ensure it only runs once + + return { provinces, loadingProvinces, errorProvinces }; +}; + +export default useProvinces; From b590095c237e4f620f4c7f27cdfe98483234fec0 Mon Sep 17 00:00:00 2001 From: Mohammad Jalali Date: Sun, 22 Sep 2024 07:33:19 +0000 Subject: [PATCH 25/31] add mutate on row actions --- src/app/api/fake-cities/route.js | 14 +- src/app/api/fake-data/route.js | 52 +++---- src/app/api/fake-provinces/route.js | 14 +- src/app/api/fake-submit/[id]/route.js | 4 +- .../assistant/zaminGov/TaskList.jsx | 7 +- .../RowActions/Refer/ReferFormContext.jsx | 140 +++++++++--------- .../zaminGov/RowActions/Refer/index.jsx | 41 ++--- .../cityAdmin/zaminGov/RowActions/index.jsx | 10 +- .../cityAdmin/zaminGov/TaskList.jsx | 9 +- .../cityAdmin/zaminGov/index.jsx | 1 - .../generalManager/zaminGov/TaskList.jsx | 7 +- .../RowActions/Refer/ReferFormContext.jsx | 140 +++++++++--------- .../zaminGov/RowActions/Refer/index.jsx | 44 +++--- .../zaminGov/RowActions/index.jsx | 10 +- .../provinceAdmin/zaminGov/TaskList.jsx | 4 +- src/core/components/DataTable/Main.js | 8 +- src/core/components/DataTableWithAuth.jsx | 7 +- src/core/utils/routes.js | 8 +- src/lib/hooks/useCities.js | 2 +- src/lib/hooks/useProvince.js | 2 +- 20 files changed, 257 insertions(+), 267 deletions(-) diff --git a/src/app/api/fake-cities/route.js b/src/app/api/fake-cities/route.js index ad8512a..091e090 100644 --- a/src/app/api/fake-cities/route.js +++ b/src/app/api/fake-cities/route.js @@ -1,18 +1,18 @@ const data = [ { - id : 1, - name : "تهران" + id: 1, + name: "تهران", }, { - id : 2, - name : "ری" + id: 2, + name: "ری", }, { - id : 3, - name : "اندیشه" + id: 3, + name: "اندیشه", }, ]; export async function GET() { return Response.json({ data }); -} \ No newline at end of file +} diff --git a/src/app/api/fake-data/route.js b/src/app/api/fake-data/route.js index 2dca9c3..684c603 100644 --- a/src/app/api/fake-data/route.js +++ b/src/app/api/fake-data/route.js @@ -1,41 +1,41 @@ const data = [ { - id : 1, - aplication_number : 1, - application_date : "1", - province:"tehran", - city:"tehran" + id: 1, + aplication_number: 1, + application_date: "1", + province: "tehran", + city: "tehran", }, { - id : 2, - aplication_number : 2, - application_date : "1", - province:"tehran", - city:"tehran" + id: 2, + aplication_number: 2, + application_date: "1", + province: "tehran", + city: "tehran", }, { - id : 3, - aplication_number : 3, - application_date : "1", - province:"tehran", - city:"tehran" + id: 3, + aplication_number: 3, + application_date: "1", + province: "tehran", + city: "tehran", }, { - id : 4, - aplication_number : 4, - application_date : "1", - province:"tehran", - city:"tehran" + id: 4, + aplication_number: 4, + application_date: "1", + province: "tehran", + city: "tehran", }, { - id : 5, - aplication_number : 5, - application_date : "1", - province:"tehran", - city:"tehran" + id: 5, + aplication_number: 5, + application_date: "1", + province: "tehran", + city: "tehran", }, ]; export async function GET() { return Response.json({ data }); -} \ No newline at end of file +} diff --git a/src/app/api/fake-provinces/route.js b/src/app/api/fake-provinces/route.js index c044fdc..d4bf49d 100644 --- a/src/app/api/fake-provinces/route.js +++ b/src/app/api/fake-provinces/route.js @@ -1,18 +1,18 @@ const data = [ { - id : 1, - name : "تهران" + id: 1, + name: "تهران", }, { - id : 2, - name : "مشهد" + id: 2, + name: "مشهد", }, { - id : 3, - name : "اصفهان" + id: 3, + name: "اصفهان", }, ]; export async function GET() { return Response.json({ data }); -} \ No newline at end of file +} diff --git a/src/app/api/fake-submit/[id]/route.js b/src/app/api/fake-submit/[id]/route.js index c8e821b..2ba57b2 100644 --- a/src/app/api/fake-submit/[id]/route.js +++ b/src/app/api/fake-submit/[id]/route.js @@ -1,3 +1,3 @@ export async function POST() { - return Response.json({message : "Done"}); -} \ No newline at end of file + return Response.json({ message: "Done" }); +} diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx index b858b03..cff837e 100644 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx @@ -97,7 +97,7 @@ const TaskList = () => { filterFn: "equals", }, ], - [], + [] ); return ( @@ -114,10 +114,7 @@ const TaskList = () => { positionActionsColumn={"last"} renderRowActions={({ row, table }) => ( - console.log("next part")} - > + console.log("next part")}> diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx index 44a9d7e..eea9c34 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx @@ -1,58 +1,66 @@ import { Autocomplete, - Button, CircularProgress, + Button, + CircularProgress, DialogActions, DialogContent, - FormControl, FormHelperText, - InputLabel, OutlinedInput, + FormControl, + FormHelperText, + InputLabel, + OutlinedInput, Stack, - TextField, Typography + TextField, + Typography, } from "@mui/material"; -import {Controller, useForm} from "react-hook-form"; -import {yupResolver} from "@hookform/resolvers/yup"; -import {object, string} from "yup"; +import { Controller, useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { object, string } from "yup"; import StyledForm from "@/core/components/StyledForm"; import useCities from "@/lib/hooks/useCities"; import useRequest from "@/lib/hooks/useRequest"; -import {REFER_ADMIN_CITY} from "@/core/utils/routes"; +import { REFER_ADMIN_CITY } from "@/core/utils/routes"; const validationSchema = object({ description: string().required("وارد کردن توضیحات الزامیست!"), city: string().required("وارد کردن شهرستان الزامیست!"), }); -const ReferFormContext = ({setOpenReferDialog, rowId, mutate}) => { +const ReferFormContext = ({ setOpenReferDialog, rowId, mutate }) => { const defaultValues = { description: "", city: "", }; - const { cities, loadingCities, errorCities } = useCities() - const requestServer = useRequest({auth: true}) + const { cities, loadingCities, errorCities } = useCities(); + const requestServer = useRequest({ auth: true }); const { control, register, handleSubmit, - formState: {isSubmitting, errors, touchedFields}, - } = useForm({defaultValues, resolver: yupResolver(validationSchema), mode : "onBlur"}) + formState: { isSubmitting, errors, touchedFields }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "onBlur" }); const onSubmit = async (data) => { const formData = new FormData(); formData.append("description", data.description); formData.append("cityId", data.city); - requestServer(`${REFER_ADMIN_CITY}/${rowId}`, 'post', { + requestServer(`${REFER_ADMIN_CITY}/${rowId}`, "post", { data: formData, - }).then(() => { - setOpenReferDialog(false) - mutate() - }).catch(() => {}) - } + }) + .then(() => { + setOpenReferDialog(false); + mutate(); + }) + .catch(() => {}); + }; return ( - توضیحات + + توضیحات + { {...register("description")} size="small" fullWidth - sx={{mt: 1}} + sx={{ mt: 1 }} type="text" /> - {errors.description ? errors.description.message : null} + + {errors.description ? errors.description.message : null} + ( + render={({ field: { onChange, value }, fieldState: { error } }) => ( - + {errorCities ? ( خطایی در دریافت شهرستان ها رخ داده است! - ) : - loadingCities ? ( - - - درحال دریافت لیست شهرستان ها - - ) : ( - city.id === value) || null} - disablePortal - options={cities} - getOptionLabel={(city) => city.name} - isOptionEqualToValue={(option, value) => option.id === value.id} - onChange={(event, newValue) => { - onChange(newValue ? newValue.id : ""); - }} - renderInput={(params) => ( - - )} - /> - )} + ) : loadingCities ? ( + + + درحال دریافت لیست شهرستان ها + + ) : ( + city.id === value) || null} + disablePortal + options={cities} + getOptionLabel={(city) => city.name} + isOptionEqualToValue={(option, value) => option.id === value.id} + onChange={(event, newValue) => { + onChange(newValue ? newValue.id : ""); + }} + renderInput={(params) => ( + + )} + /> + )} - {errors.city ? errors.city.message : null} + {errors.city ? errors.city.message : null} )} @@ -117,24 +125,14 @@ const ReferFormContext = ({setOpenReferDialog, rowId, mutate}) => { - - - ) -} -export default ReferFormContext \ No newline at end of file + ); +}; +export default ReferFormContext; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx index b746879..608d944 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx @@ -1,36 +1,41 @@ -import {Dialog, DialogTitle, IconButton, Stack, Tooltip} from "@mui/material"; -import ReplyIcon from '@mui/icons-material/Reply'; +import { Dialog, DialogTitle, IconButton, Stack, Tooltip } from "@mui/material"; +import ReplyIcon from "@mui/icons-material/Reply"; import DialogTransition from "@/core/components/DialogTransition"; import ReferFormContext from "@/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext"; -import {useState} from "react"; +import { useState } from "react"; -const ReferForm = ({rowId, mutate}) => { - const [openReferDialog, setOpenReferDialog] = useState(false) - return( +const ReferForm = ({ rowId, mutate }) => { + const [openReferDialog, setOpenReferDialog] = useState(false); + return ( { - setOpenReferDialog(true) + setOpenReferDialog(true); }} > - + - + ارجاع به شهرستان دیگر - ) -} -export default ReferForm \ No newline at end of file + ); +}; +export default ReferForm; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx index a1ff5bc..4cd1229 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx @@ -1,8 +1,8 @@ import ReferForm from "@/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer"; -const RowActions = ({row, mutate}) => { - return( +const RowActions = ({ row, mutate }) => { + return ( //rowId should pass - ) -} -export default RowActions \ No newline at end of file + ); +}; +export default RowActions; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx index 16bd2d4..fbb62cd 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx @@ -1,10 +1,9 @@ "use client"; import { useMemo } from "react"; -import { Box, IconButton, Tooltip } from "@mui/material"; +import { Box } from "@mui/material"; import DataTableWithAuth from "@/core/components/DataTableWithAuth"; -import AssignmentIcon from "@mui/icons-material/Assignment"; -import RowActions from "@/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions"; +import RowActions from "./RowActions"; const TaskList = () => { const columns = useMemo( @@ -106,7 +105,7 @@ const TaskList = () => { filterFn: "equals", }, ], - [], + [] ); return ( @@ -121,7 +120,7 @@ const TaskList = () => { table_name={"cityAdminZaminGovList"} enableRowActions positionActionsColumn={"last"} - renderRowActions={({ row, table }) => } + RowActions={RowActions} /> diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx index fe573a5..49ba4a2 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx @@ -4,7 +4,6 @@ import { Stack } from "@mui/material"; import TaskList from "./TaskList"; const CityAdminZaminGovComponent = () => { - return ( diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx index ee5e667..c52ff33 100644 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx @@ -97,7 +97,7 @@ const TaskList = () => { filterFn: "equals", }, ], - [], + [] ); return ( @@ -114,10 +114,7 @@ const TaskList = () => { positionActionsColumn={"last"} renderRowActions={({ row, table }) => ( - console.log("next part")} - > + console.log("next part")}> diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx index c43d922..df3ccaf 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx @@ -1,59 +1,67 @@ import { Autocomplete, - Button, CircularProgress, + Button, + CircularProgress, DialogActions, DialogContent, - FormControl, FormHelperText, - InputLabel, OutlinedInput, + FormControl, + FormHelperText, + InputLabel, + OutlinedInput, Stack, - TextField, Typography + TextField, + Typography, } from "@mui/material"; -import {Controller, useForm} from "react-hook-form"; -import {yupResolver} from "@hookform/resolvers/yup"; -import {object, string} from "yup"; +import { Controller, useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { object, string } from "yup"; import StyledForm from "@/core/components/StyledForm"; import useProvinces from "@/lib/hooks/useProvince"; import useRequest from "@/lib/hooks/useRequest"; -import {REFER_ADMIN_PROVINCE} from "@/core/utils/routes"; +import { REFER_ADMIN_PROVINCE } from "@/core/utils/routes"; const validationSchema = object({ description: string().required("وارد کردن توضیحات الزامیست!"), province: string().required("وارد کردن استان الزامیست!"), }); -const ReferFormContext = ({setOpenReferDialog, rowId, mutate}) => { +const ReferFormContext = ({ setOpenReferDialog, rowId, mutate }) => { const defaultValues = { description: "", province: "", }; - const { provinces, loadingProvinces, errorProvinces } = useProvinces() - const requestServer = useRequest({auth: true}) + const { provinces, loadingProvinces, errorProvinces } = useProvinces(); + const requestServer = useRequest({ auth: true }); const { control, register, handleSubmit, - formState: {isSubmitting, errors, touchedFields}, - } = useForm({defaultValues, resolver: yupResolver(validationSchema), mode : "onBlur"}) + formState: { isSubmitting, errors, touchedFields }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "onBlur" }); const onSubmit = async (data) => { const formData = new FormData(); formData.append("description", data.description); formData.append("provinceId", data.province); - requestServer(`${REFER_ADMIN_PROVINCE}/${rowId}`, 'post', { + requestServer(`${REFER_ADMIN_PROVINCE}/${rowId}`, "post", { data: formData, - }).then(() => { - setOpenReferDialog(false) - mutate() - }).catch(() => {}) - } + }) + .then(() => { + setOpenReferDialog(false); + mutate(); + }) + .catch(() => {}); + }; return ( - توضیحات + + توضیحات + { {...register("description")} size="small" fullWidth - sx={{mt: 1}} + sx={{ mt: 1 }} type="text" /> - {errors.description ? errors.description.message : null} + + {errors.description ? errors.description.message : null} + ( + render={({ field: { onChange, value }, fieldState: { error } }) => ( - + {errorProvinces ? ( - خطایی در دریافت استان ها رخ داده است! - ) : - loadingProvinces ? ( - - - درحال دریافت لیست استان ها - - ) : ( - province.id === value) || null} - disablePortal - options={provinces} - getOptionLabel={(province) => province.name} - isOptionEqualToValue={(option, value) => option.id === value.id} - onChange={(event, newValue) => { - onChange(newValue ? newValue.id : ""); - }} - renderInput={(params) => ( - - )} - /> - )} + خطایی در دریافت استان ها رخ داده است! + ) : loadingProvinces ? ( + + + درحال دریافت لیست استان ها + + ) : ( + province.id === value) || null} + disablePortal + options={provinces} + getOptionLabel={(province) => province.name} + isOptionEqualToValue={(option, value) => option.id === value.id} + onChange={(event, newValue) => { + onChange(newValue ? newValue.id : ""); + }} + renderInput={(params) => ( + + )} + /> + )} {errors.province ? errors.province.message : null} @@ -118,24 +126,14 @@ const ReferFormContext = ({setOpenReferDialog, rowId, mutate}) => { - - - ) -} -export default ReferFormContext \ No newline at end of file + ); +}; +export default ReferFormContext; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx index 171a03d..cee580a 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx @@ -1,37 +1,41 @@ -import {Dialog, DialogTitle, IconButton, Stack, Tooltip} from "@mui/material"; -import ReplyIcon from '@mui/icons-material/Reply'; +import { Dialog, DialogTitle, IconButton, Stack, Tooltip } from "@mui/material"; +import ReplyIcon from "@mui/icons-material/Reply"; import DialogTransition from "@/core/components/DialogTransition"; -import {useState} from "react"; -import ReferFormContext - from "@/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext"; +import { useState } from "react"; +import ReferFormContext from "@/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext"; -const ReferForm = ({rowId, mutate}) => { - const [openReferDialog, setOpenReferDialog] = useState(false) - return( +const ReferForm = ({ rowId, mutate }) => { + const [openReferDialog, setOpenReferDialog] = useState(false); + return ( { - setOpenReferDialog(true) + setOpenReferDialog(true); }} > - + - + ارجاع به استان دیگر - ) -} -export default ReferForm \ No newline at end of file + ); +}; +export default ReferForm; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx index 9924ac7..4e64b09 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx @@ -1,8 +1,8 @@ import ReferForm from "@/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer"; -const RowActions = ({row, mutate}) => { - return( +const RowActions = ({ row, mutate }) => { + return ( //rowId should pass - ) -} -export default RowActions \ No newline at end of file + ); +}; +export default RowActions; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx index a7f9a46..f057708 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx @@ -106,7 +106,7 @@ const TaskList = () => { filterFn: "equals", }, ], - [], + [] ); return ( @@ -121,7 +121,7 @@ const TaskList = () => { table_name={"provinceAdminZaminGovList"} enableRowActions positionActionsColumn={"last"} - renderRowActions={({ row, table }) => } + renderRowActions={({ row, table }) => } /> diff --git a/src/core/components/DataTable/Main.js b/src/core/components/DataTable/Main.js index 8a4c0a1..5d0d98d 100644 --- a/src/core/components/DataTable/Main.js +++ b/src/core/components/DataTable/Main.js @@ -21,6 +21,7 @@ const DataTable_Main = (props) => { initialStateProps, TableToolbar, table_title, + RowActions, } = props; const flatColumns = flattenArrayOfObjects(columns, "columns"); const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10 }); @@ -106,11 +107,8 @@ const DataTable_Main = (props) => { manualSorting: true, onPaginationChange: setPagination, onSortingChange: onSortingChange, - renderTopToolbarCustomActions: ({ table }) => ( - <> - {TableToolbar && } - - ), + renderTopToolbarCustomActions: ({ table }) => <>{TableToolbar && }, + renderRowActions: ({ row }) => , ...props, }); diff --git a/src/core/components/DataTableWithAuth.jsx b/src/core/components/DataTableWithAuth.jsx index ee0a6c4..3363495 100644 --- a/src/core/components/DataTableWithAuth.jsx +++ b/src/core/components/DataTableWithAuth.jsx @@ -3,11 +3,6 @@ import { useAuth } from "@/lib/contexts/auth"; const DataTableWithAuth = (props) => { const { user } = useAuth(); - return ( - - ); + return ; }; export default DataTableWithAuth; diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index 0bbfb0a..a980707 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -6,7 +6,7 @@ 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 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" -export const GET_PROVINCE_LISTS = "/v3/api/fake-provinces" +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"; +export const GET_PROVINCE_LISTS = "/v3/api/fake-provinces"; diff --git a/src/lib/hooks/useCities.js b/src/lib/hooks/useCities.js index e86a673..e4012b7 100644 --- a/src/lib/hooks/useCities.js +++ b/src/lib/hooks/useCities.js @@ -1,6 +1,6 @@ import { useState, useEffect } from "react"; import axios from "axios"; -import {GET_CITY_LISTS} from "@/core/utils/routes"; +import { GET_CITY_LISTS } from "@/core/utils/routes"; const useCities = () => { const [cities, setCities] = useState([]); diff --git a/src/lib/hooks/useProvince.js b/src/lib/hooks/useProvince.js index 5a96cf2..699b462 100644 --- a/src/lib/hooks/useProvince.js +++ b/src/lib/hooks/useProvince.js @@ -1,6 +1,6 @@ import { useState, useEffect } from "react"; import axios from "axios"; -import {GET_PROVINCE_LISTS} from "@/core/utils/routes"; +import { GET_PROVINCE_LISTS } from "@/core/utils/routes"; const useProvinces = () => { const [provinces, setProvinces] = useState([]); From 95e7ee8ce2da0d3aaa1db7297a58f74e80d19e2d Mon Sep 17 00:00:00 2001 From: Mohammad Jalali Date: Mon, 23 Sep 2024 11:08:55 +0000 Subject: [PATCH 26/31] Feature/inquiry privacy tasks details --- .../RowActions/TaskDetail/DetailDialog.jsx | 109 ++++++++++++++++++ .../zaminGov/RowActions/TaskDetail/index.jsx | 26 +++++ .../cityAdmin/zaminGov/RowActions/index.jsx | 11 +- .../ApplicantRequestDetail/DetailItem.jsx | 52 +++++++++ .../ApplicantRequestDetail/DetailMap.jsx | 39 +++++++ .../ApplicantRequestDetail/FlyToPolygon.jsx | 22 ++++ .../ApplicantRequestDetail/index.jsx | 61 ++++++++++ 7 files changed, 318 insertions(+), 2 deletions(-) create mode 100644 src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/TaskDetail/DetailDialog.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/TaskDetail/index.jsx create mode 100644 src/core/components/ApplicantRequestDetail/DetailItem.jsx create mode 100644 src/core/components/ApplicantRequestDetail/DetailMap.jsx create mode 100644 src/core/components/ApplicantRequestDetail/FlyToPolygon.jsx create mode 100644 src/core/components/ApplicantRequestDetail/index.jsx diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/TaskDetail/DetailDialog.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/TaskDetail/DetailDialog.jsx new file mode 100644 index 0000000..a91fd31 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/TaskDetail/DetailDialog.jsx @@ -0,0 +1,109 @@ +"use client"; + +import { + Button, + Dialog, + DialogActions, + DialogContent, + FormControl, + FormHelperText, + InputLabel, + OutlinedInput, +} from "@mui/material"; +import { object, string } from "yup"; +import useRequest from "@/lib/hooks/useRequest"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import StyledForm from "@/core/components/StyledForm"; +import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; + +const fakeData = { + id: 1, + shomareh_darkhast: "2124", + ostan: "ostan", + shahr: "shahr", + shahrestan: "shahrestan", + bakhsh: "bakhsh", + roosta: "roosta", + tarikh_darkhast: "tarikh_darkhast", + sazman: "sazman", + masahat_zamin: "masahat_zamin", + masahat_tarh: "masahat_tarh", + gorooh_tarh: "gorooh_tarh", + onvane_tarh: "onvane_tarh", + address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر", + file_mosavab: "file", + polygon: [ + [51.515, -0.09], + [51.52, -0.1], + [51.52, -0.12], + ], +}; + +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), +}); + +const DetailDialog = ({ taskModal, setTaskModal, rowId, mutate }) => { + const requestServer = useRequest({ auth: true }); + const defaultValues = { + description: "", + }; + const handleClose = () => { + setTaskModal(false); + }; + + const { + register, + handleSubmit, + formState: { isSubmitting, errors, touchedFields }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "onBlur" }); + + const onSubmit = async (data) => { + const formData = new FormData(); + formData.append("description", data.description); + requestServer(`api-for-send-to-harim/${rowId}`, "post", { + data: formData, + }) + .then(() => { + handleClose(); + mutate(); + }) + .catch(() => {}); + }; + return ( + + + + + + + توضیحات + + + + {errors.description ? errors.description.message : null} + + + + + + + + + ); +}; +export default DetailDialog; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/TaskDetail/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/TaskDetail/index.jsx new file mode 100644 index 0000000..24f6b31 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/TaskDetail/index.jsx @@ -0,0 +1,26 @@ +"use client"; + +import { IconButton, Tooltip } from "@mui/material"; +import AssignmentIcon from "@mui/icons-material/Assignment"; +import DetailDialog from "./DetailDialog"; +import { useState } from "react"; + +const TaskDetail = ({ rowId, mutate }) => { + const [taskModal, setTaskModal] = useState(false); + + const openDetailDialog = () => { + setTaskModal(true); + }; + + return ( + <> + + + + + + + + ); +}; +export default TaskDetail; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx index 4cd1229..0b936c3 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx @@ -1,8 +1,15 @@ -import ReferForm from "@/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer"; +"use client"; + +import ReferForm from "./Refer"; +import TaskDetail from "./TaskDetail"; +import { Box } from "@mui/material"; const RowActions = ({ row, mutate }) => { return ( - //rowId should pass + + + + ); }; export default RowActions; diff --git a/src/core/components/ApplicantRequestDetail/DetailItem.jsx b/src/core/components/ApplicantRequestDetail/DetailItem.jsx new file mode 100644 index 0000000..099e955 --- /dev/null +++ b/src/core/components/ApplicantRequestDetail/DetailItem.jsx @@ -0,0 +1,52 @@ +"use client"; + +import { Box, Chip, Divider, Grid, Typography } from "@mui/material"; +import QrCode2Icon from "@mui/icons-material/QrCode2"; +import HomeWorkIcon from "@mui/icons-material/HomeWork"; +import DomainIcon from "@mui/icons-material/Domain"; +import CottageIcon from "@mui/icons-material/Cottage"; +import AccountTreeIcon from "@mui/icons-material/AccountTree"; +import HolidayVillageIcon from "@mui/icons-material/HolidayVillage"; +import CalendarMonthIcon from "@mui/icons-material/CalendarMonth"; +import FaxIcon from "@mui/icons-material/Fax"; +import FullscreenIcon from "@mui/icons-material/Fullscreen"; +import ArchitectureIcon from "@mui/icons-material/Architecture"; +import Diversity2Icon from "@mui/icons-material/Diversity2"; +import SubtitlesIcon from "@mui/icons-material/Subtitles"; +import FingerprintIcon from "@mui/icons-material/Fingerprint"; + +const findItem = { + id: { title: "کد یکتا", icon: }, + shomareh_darkhast: { title: "شماره درخواست", icon: }, + ostan: { title: "استان", icon: }, + shahr: { title: "شهر", icon: }, + shahrestan: { title: "شهرستان", icon: }, + bakhsh: { title: "بخش", icon: }, + roosta: { title: "روستا", icon: }, + tarikh_darkhast: { title: "تاریخ درخواست", icon: }, + sazman: { title: "سازمان", icon: }, + masahat_zamin: { title: "مساحت زمین", icon: }, + masahat_tarh: { title: "مساحت طرح", icon: }, + gorooh_tarh: { title: "گروه طرح", icon: }, + onvane_tarh: { title: "عنوان طرح", icon: }, +}; + +const DetailItem = ({ item }) => { + const currentItem = findItem[item.key]; + if (!currentItem) return null; + + return ( + + + + + {item.value} + + + ); +}; +export default DetailItem; diff --git a/src/core/components/ApplicantRequestDetail/DetailMap.jsx b/src/core/components/ApplicantRequestDetail/DetailMap.jsx new file mode 100644 index 0000000..902ec3a --- /dev/null +++ b/src/core/components/ApplicantRequestDetail/DetailMap.jsx @@ -0,0 +1,39 @@ +"use client"; + +import { Box } from "@mui/material"; +import dynamic from "next/dynamic"; +import MapLoading from "@/core/components/MapLayer/Loading"; +import FlyToPolyGon from "./FlyToPolygon"; + +const MapLayer = dynamic(() => import("@/core/components/MapLayer"), { + loading: () => , + ssr: false, +}); + +const DetailMap = ({ data }) => { + return ( + + + + + + + + ); +}; +export default DetailMap; diff --git a/src/core/components/ApplicantRequestDetail/FlyToPolygon.jsx b/src/core/components/ApplicantRequestDetail/FlyToPolygon.jsx new file mode 100644 index 0000000..4a39edd --- /dev/null +++ b/src/core/components/ApplicantRequestDetail/FlyToPolygon.jsx @@ -0,0 +1,22 @@ +"use client"; + +import { Polygon, useMap } from "react-leaflet"; +import { useEffect } from "react"; + +const purpleOptions = { color: "purple" }; + +const FlyToPolygon = ({ polygon }) => { + const map = useMap(); + + useEffect(() => { + if (map) { + const leafletPolygon = L.polygon(polygon); + const bounds = leafletPolygon.getBounds(); + map.flyToBounds(bounds, { padding: [50, 50] }); + } + }, [map, polygon]); + + return ; +}; + +export default FlyToPolygon; diff --git a/src/core/components/ApplicantRequestDetail/index.jsx b/src/core/components/ApplicantRequestDetail/index.jsx new file mode 100644 index 0000000..b97279a --- /dev/null +++ b/src/core/components/ApplicantRequestDetail/index.jsx @@ -0,0 +1,61 @@ +"use client"; + +import { Box, Button, Chip, Divider, Grid, Typography } from "@mui/material"; +import AttachFileIcon from "@mui/icons-material/AttachFile"; +import DownloadingIcon from "@mui/icons-material/Downloading"; +import DetailItem from "./DetailItem"; +import DetailMap from "./DetailMap"; +import ContactMailIcon from "@mui/icons-material/ContactMail"; + +const ApplicantRequestDetail = ({ data }) => { + return ( + <> + + + + + {Object.entries(data).map(([key, value]) => ( + + ))} + + + } + sx={{ fontSize: "12px", fontWeight: 500, pl: "5px" }} + label="فایل مصوب" + /> + + + + + + + + + } + label="آدرس" + /> + + + {data.address} + + + + + + ); +}; +export default ApplicantRequestDetail; From 7267e1bc361bfb0be2fce544b7c6428a10a9f648 Mon Sep 17 00:00:00 2001 From: Mohammad Jalali Date: Tue, 24 Sep 2024 06:59:02 +0000 Subject: [PATCH 27/31] complete directory structure and adding detail dialog to other pages --- .../RowActions/TaskDetail/DetailDialog.jsx | 75 +++++++++++++++++++ .../zaminGov/RowActions/TaskDetail/index.jsx | 26 +++++++ .../assistant/zaminGov/RowActions/index.jsx | 11 +++ .../assistant/zaminGov/TaskList.jsx | 12 +-- .../zaminGov/RowActions/Refer/index.jsx | 2 +- .../RowActions/TaskDetail/DetailDialog.jsx | 75 +++++++++++++++++++ .../zaminGov/RowActions/TaskDetail/index.jsx | 26 +++++++ .../zaminGov/RowActions/index.jsx | 11 +++ .../generalManager/zaminGov/TaskList.jsx | 12 +-- .../zaminGov/RowActions/Refer/index.jsx | 2 +- .../RowActions/TaskDetail/DetailDialog.jsx | 75 +++++++++++++++++++ .../zaminGov/RowActions/TaskDetail/index.jsx | 26 +++++++ .../zaminGov/RowActions/index.jsx | 9 ++- .../provinceAdmin/zaminGov/TaskList.jsx | 7 +- .../ApplicantRequestDetail/index.jsx | 6 +- 15 files changed, 344 insertions(+), 31 deletions(-) create mode 100644 src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/TaskDetail/DetailDialog.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/TaskDetail/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/TaskDetail/DetailDialog.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/TaskDetail/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/TaskDetail/DetailDialog.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/TaskDetail/index.jsx diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/TaskDetail/DetailDialog.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/TaskDetail/DetailDialog.jsx new file mode 100644 index 0000000..aff1058 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/TaskDetail/DetailDialog.jsx @@ -0,0 +1,75 @@ +"use client"; + +import { Dialog, DialogContent } from "@mui/material"; +import { object, string } from "yup"; +import useRequest from "@/lib/hooks/useRequest"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import StyledForm from "@/core/components/StyledForm"; +import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; + +const fakeData = { + id: 1, + shomareh_darkhast: "2124", + ostan: "ostan", + shahr: "shahr", + shahrestan: "shahrestan", + bakhsh: "bakhsh", + roosta: "roosta", + tarikh_darkhast: "tarikh_darkhast", + sazman: "sazman", + masahat_zamin: "masahat_zamin", + masahat_tarh: "masahat_tarh", + gorooh_tarh: "gorooh_tarh", + onvane_tarh: "onvane_tarh", + address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر", + file_mosavab: "file", + polygon: [ + [51.515, -0.09], + [51.52, -0.1], + [51.52, -0.12], + ], +}; + +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), +}); + +const DetailDialog = ({ taskModal, setTaskModal, rowId, mutate }) => { + const requestServer = useRequest({ auth: true }); + const defaultValues = { + description: "", + }; + const handleClose = () => { + setTaskModal(false); + }; + + const { + register, + handleSubmit, + formState: { isSubmitting, errors, touchedFields }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "onBlur" }); + + const onSubmit = async (data) => { + const formData = new FormData(); + formData.append("description", data.description); + requestServer(`api-for-send-to-harim/${rowId}`, "post", { + data: formData, + }) + .then(() => { + handleClose(); + mutate(); + }) + .catch(() => {}); + }; + return ( + + + + + + + + ); +}; +export default DetailDialog; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/TaskDetail/index.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/TaskDetail/index.jsx new file mode 100644 index 0000000..24f6b31 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/TaskDetail/index.jsx @@ -0,0 +1,26 @@ +"use client"; + +import { IconButton, Tooltip } from "@mui/material"; +import AssignmentIcon from "@mui/icons-material/Assignment"; +import DetailDialog from "./DetailDialog"; +import { useState } from "react"; + +const TaskDetail = ({ rowId, mutate }) => { + const [taskModal, setTaskModal] = useState(false); + + const openDetailDialog = () => { + setTaskModal(true); + }; + + return ( + <> + + + + + + + + ); +}; +export default TaskDetail; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/index.jsx new file mode 100644 index 0000000..c2b1970 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/index.jsx @@ -0,0 +1,11 @@ +import TaskDetail from "./TaskDetail"; +import { Box } from "@mui/material"; + +const RowActions = ({ row, mutate }) => { + return ( + + + + ); +}; +export default RowActions; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx index cff837e..82a4786 100644 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx @@ -1,9 +1,9 @@ "use client"; import { useMemo } from "react"; -import { Box, IconButton, Tooltip } from "@mui/material"; +import { Box } from "@mui/material"; import DataTableWithAuth from "@/core/components/DataTableWithAuth"; -import AssignmentIcon from "@mui/icons-material/Assignment"; +import RowActions from "./RowActions"; const TaskList = () => { const columns = useMemo( @@ -112,13 +112,7 @@ const TaskList = () => { table_name={"assistantZaminGovList"} enableRowActions positionActionsColumn={"last"} - renderRowActions={({ row, table }) => ( - - console.log("next part")}> - - - - )} + renderRowActions={({ row }) => } /> diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx index 608d944..8e77435 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx @@ -1,7 +1,7 @@ import { Dialog, DialogTitle, IconButton, Stack, Tooltip } from "@mui/material"; import ReplyIcon from "@mui/icons-material/Reply"; import DialogTransition from "@/core/components/DialogTransition"; -import ReferFormContext from "@/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext"; +import ReferFormContext from "./ReferFormContext"; import { useState } from "react"; const ReferForm = ({ rowId, mutate }) => { diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/TaskDetail/DetailDialog.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/TaskDetail/DetailDialog.jsx new file mode 100644 index 0000000..aff1058 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/TaskDetail/DetailDialog.jsx @@ -0,0 +1,75 @@ +"use client"; + +import { Dialog, DialogContent } from "@mui/material"; +import { object, string } from "yup"; +import useRequest from "@/lib/hooks/useRequest"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import StyledForm from "@/core/components/StyledForm"; +import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; + +const fakeData = { + id: 1, + shomareh_darkhast: "2124", + ostan: "ostan", + shahr: "shahr", + shahrestan: "shahrestan", + bakhsh: "bakhsh", + roosta: "roosta", + tarikh_darkhast: "tarikh_darkhast", + sazman: "sazman", + masahat_zamin: "masahat_zamin", + masahat_tarh: "masahat_tarh", + gorooh_tarh: "gorooh_tarh", + onvane_tarh: "onvane_tarh", + address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر", + file_mosavab: "file", + polygon: [ + [51.515, -0.09], + [51.52, -0.1], + [51.52, -0.12], + ], +}; + +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), +}); + +const DetailDialog = ({ taskModal, setTaskModal, rowId, mutate }) => { + const requestServer = useRequest({ auth: true }); + const defaultValues = { + description: "", + }; + const handleClose = () => { + setTaskModal(false); + }; + + const { + register, + handleSubmit, + formState: { isSubmitting, errors, touchedFields }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "onBlur" }); + + const onSubmit = async (data) => { + const formData = new FormData(); + formData.append("description", data.description); + requestServer(`api-for-send-to-harim/${rowId}`, "post", { + data: formData, + }) + .then(() => { + handleClose(); + mutate(); + }) + .catch(() => {}); + }; + return ( + + + + + + + + ); +}; +export default DetailDialog; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/TaskDetail/index.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/TaskDetail/index.jsx new file mode 100644 index 0000000..24f6b31 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/TaskDetail/index.jsx @@ -0,0 +1,26 @@ +"use client"; + +import { IconButton, Tooltip } from "@mui/material"; +import AssignmentIcon from "@mui/icons-material/Assignment"; +import DetailDialog from "./DetailDialog"; +import { useState } from "react"; + +const TaskDetail = ({ rowId, mutate }) => { + const [taskModal, setTaskModal] = useState(false); + + const openDetailDialog = () => { + setTaskModal(true); + }; + + return ( + <> + + + + + + + + ); +}; +export default TaskDetail; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/index.jsx new file mode 100644 index 0000000..c2b1970 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/index.jsx @@ -0,0 +1,11 @@ +import TaskDetail from "./TaskDetail"; +import { Box } from "@mui/material"; + +const RowActions = ({ row, mutate }) => { + return ( + + + + ); +}; +export default RowActions; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx index c52ff33..396cffc 100644 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx @@ -1,9 +1,9 @@ "use client"; import { useMemo } from "react"; -import { Box, IconButton, Tooltip } from "@mui/material"; +import { Box } from "@mui/material"; import DataTableWithAuth from "@/core/components/DataTableWithAuth"; -import AssignmentIcon from "@mui/icons-material/Assignment"; +import RowActions from "./RowActions"; const TaskList = () => { const columns = useMemo( @@ -112,13 +112,7 @@ const TaskList = () => { table_name={"generalManagerZaminGovList"} enableRowActions positionActionsColumn={"last"} - renderRowActions={({ row, table }) => ( - - console.log("next part")}> - - - - )} + renderRowActions={({ row }) => } /> diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx index cee580a..c3a3012 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx @@ -2,7 +2,7 @@ import { Dialog, DialogTitle, IconButton, Stack, Tooltip } from "@mui/material"; import ReplyIcon from "@mui/icons-material/Reply"; import DialogTransition from "@/core/components/DialogTransition"; import { useState } from "react"; -import ReferFormContext from "@/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext"; +import ReferFormContext from "./ReferFormContext"; const ReferForm = ({ rowId, mutate }) => { const [openReferDialog, setOpenReferDialog] = useState(false); diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/TaskDetail/DetailDialog.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/TaskDetail/DetailDialog.jsx new file mode 100644 index 0000000..aff1058 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/TaskDetail/DetailDialog.jsx @@ -0,0 +1,75 @@ +"use client"; + +import { Dialog, DialogContent } from "@mui/material"; +import { object, string } from "yup"; +import useRequest from "@/lib/hooks/useRequest"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import StyledForm from "@/core/components/StyledForm"; +import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; + +const fakeData = { + id: 1, + shomareh_darkhast: "2124", + ostan: "ostan", + shahr: "shahr", + shahrestan: "shahrestan", + bakhsh: "bakhsh", + roosta: "roosta", + tarikh_darkhast: "tarikh_darkhast", + sazman: "sazman", + masahat_zamin: "masahat_zamin", + masahat_tarh: "masahat_tarh", + gorooh_tarh: "gorooh_tarh", + onvane_tarh: "onvane_tarh", + address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر", + file_mosavab: "file", + polygon: [ + [51.515, -0.09], + [51.52, -0.1], + [51.52, -0.12], + ], +}; + +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), +}); + +const DetailDialog = ({ taskModal, setTaskModal, rowId, mutate }) => { + const requestServer = useRequest({ auth: true }); + const defaultValues = { + description: "", + }; + const handleClose = () => { + setTaskModal(false); + }; + + const { + register, + handleSubmit, + formState: { isSubmitting, errors, touchedFields }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "onBlur" }); + + const onSubmit = async (data) => { + const formData = new FormData(); + formData.append("description", data.description); + requestServer(`api-for-send-to-harim/${rowId}`, "post", { + data: formData, + }) + .then(() => { + handleClose(); + mutate(); + }) + .catch(() => {}); + }; + return ( + + + + + + + + ); +}; +export default DetailDialog; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/TaskDetail/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/TaskDetail/index.jsx new file mode 100644 index 0000000..24f6b31 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/TaskDetail/index.jsx @@ -0,0 +1,26 @@ +"use client"; + +import { IconButton, Tooltip } from "@mui/material"; +import AssignmentIcon from "@mui/icons-material/Assignment"; +import DetailDialog from "./DetailDialog"; +import { useState } from "react"; + +const TaskDetail = ({ rowId, mutate }) => { + const [taskModal, setTaskModal] = useState(false); + + const openDetailDialog = () => { + setTaskModal(true); + }; + + return ( + <> + + + + + + + + ); +}; +export default TaskDetail; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx index 4e64b09..cd07b61 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx @@ -1,8 +1,13 @@ -import ReferForm from "@/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer"; +import ReferForm from "./Refer"; +import TaskDetail from "./TaskDetail"; +import { Box } from "@mui/material"; const RowActions = ({ row, mutate }) => { return ( - //rowId should pass + + + + ); }; export default RowActions; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx index f057708..2a7e7ec 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx @@ -1,10 +1,9 @@ "use client"; import { useMemo } from "react"; -import { Box, IconButton, Tooltip } from "@mui/material"; +import { Box } from "@mui/material"; import DataTableWithAuth from "@/core/components/DataTableWithAuth"; -import AssignmentIcon from "@mui/icons-material/Assignment"; -import RowActions from "@/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions"; +import RowActions from "./RowActions"; const TaskList = () => { const columns = useMemo( @@ -121,7 +120,7 @@ const TaskList = () => { table_name={"provinceAdminZaminGovList"} enableRowActions positionActionsColumn={"last"} - renderRowActions={({ row, table }) => } + renderRowActions={({ row }) => } /> diff --git a/src/core/components/ApplicantRequestDetail/index.jsx b/src/core/components/ApplicantRequestDetail/index.jsx index b97279a..bfdbf35 100644 --- a/src/core/components/ApplicantRequestDetail/index.jsx +++ b/src/core/components/ApplicantRequestDetail/index.jsx @@ -11,11 +11,7 @@ const ApplicantRequestDetail = ({ data }) => { return ( <> - + {Object.entries(data).map(([key, value]) => ( From dceaf5332bbbf416c40af0b262ada6002522f3e8 Mon Sep 17 00:00:00 2001 From: Amin Ghasempoor Date: Sun, 29 Sep 2024 07:27:17 +0000 Subject: [PATCH 28/31] Feature/road safety form --- src/app/api/fake-prev-state-opinion/route.js | 9 ++ .../RoadSafetyForm/DescriptionForm.jsx | 29 +++++++ .../ManagerOrAssistantSubmit.jsx | 15 ++++ .../RoadSafetyForm/PrevCartableOpinion.jsx | 25 ++++++ .../RoadSafetyForm/QuestionSafetyForm.jsx | 35 ++++++++ .../RoadSafetyForm/RoadSafetyFormContext.jsx | 82 +++++++++++++++++++ .../RowActions/RoadSafetyForm/index.jsx | 52 ++++++++++++ .../assistant/zaminGov/RowActions/index.jsx | 2 + .../assistant/zaminGov/TaskList.jsx | 26 +++++- .../RowActions/Refer/ReferFormContext.jsx | 2 +- .../cityAdmin/zaminGov/TaskList.jsx | 16 ++++ .../RoadSafetyForm/DescriptionForm.jsx | 29 +++++++ .../ManagerOrAssistantSubmit.jsx | 15 ++++ .../RoadSafetyForm/PrevCartableOpinion.jsx | 26 ++++++ .../RoadSafetyForm/QuestionSafetyForm.jsx | 35 ++++++++ .../RoadSafetyForm/RoadSafetyFormContext.jsx | 82 +++++++++++++++++++ .../RowActions/RoadSafetyForm/index.jsx | 52 ++++++++++++ .../zaminGov/RowActions/index.jsx | 2 + .../generalManager/zaminGov/TaskList.jsx | 26 +++++- .../RowActions/Refer/ReferFormContext.jsx | 2 +- .../RoadSafetyForm/DescriptionForm.jsx | 29 +++++++ .../RoadSafetyForm/PrevCartableOpinion.jsx | 27 ++++++ .../RoadSafetyForm/QuestionSafetyForm.jsx | 57 +++++++++++++ .../RoadSafetyForm/RoadSaftyFormContext.jsx | 80 ++++++++++++++++++ .../RoadSafetyForm/SubmitButtonsAdmin.jsx | 21 +++++ .../RowActions/RoadSafetyForm/index.jsx | 52 ++++++++++++ .../zaminGov/RowActions/index.jsx | 2 + .../provinceAdmin/zaminGov/TaskList.jsx | 18 +++- src/core/components/Toasts/success.jsx | 2 +- src/core/utils/routes.js | 2 + src/lib/hooks/useCities.js | 4 +- src/lib/hooks/usePrevStateopinion.js | 31 +++++++ src/lib/hooks/useProvince.js | 4 +- 33 files changed, 883 insertions(+), 8 deletions(-) create mode 100644 src/app/api/fake-prev-state-opinion/route.js create mode 100644 src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/ManagerOrAssistantSubmit.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/ManagerOrAssistantSubmit.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/SubmitButtonsAdmin.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/index.jsx create mode 100644 src/lib/hooks/usePrevStateopinion.js diff --git a/src/app/api/fake-prev-state-opinion/route.js b/src/app/api/fake-prev-state-opinion/route.js new file mode 100644 index 0000000..abd03e4 --- /dev/null +++ b/src/app/api/fake-prev-state-opinion/route.js @@ -0,0 +1,9 @@ +export async function GET() { + return Response.json({ + message: + "به موجب این نامه، به استحضار جنابعالی می رساند، این‌ جانب ……… از تاریخ ……… افتخار همکاری\n" + + "با مجموعه ……… را دارم. اما متاسفانه، به علت ………، تقاضای استعفای خود را از تاریخ ………\n" + + "اعلام میدارم. ضمن تشکر پیشاپیش از همکاری شما خواهشمند است، دستور اقدامات لازم در این\n" + + "زمینه را صادر فرمایید.", + }); +} diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx new file mode 100644 index 0000000..49ffa3c --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx @@ -0,0 +1,29 @@ +import { FormControl, FormHelperText, InputLabel, OutlinedInput, Stack } from "@mui/material"; + +const DescriptionForm = ({ errors, register }) => { + return ( + + + + توضیحات + + + + {errors.description ? errors.description.message : null} + + + + ); +}; +export default DescriptionForm; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/ManagerOrAssistantSubmit.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/ManagerOrAssistantSubmit.jsx new file mode 100644 index 0000000..a515950 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/ManagerOrAssistantSubmit.jsx @@ -0,0 +1,15 @@ +import { Button } from "@mui/material"; + +const ManagerOrAssistantSubmit = ({ isSubmitting }) => { + return ( + <> + + + + ); +}; +export default ManagerOrAssistantSubmit; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx new file mode 100644 index 0000000..6197267 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx @@ -0,0 +1,25 @@ +import { Card, CardContent, CardHeader, CircularProgress, Divider, Stack, Typography } from "@mui/material"; + +const PrevCartableOpinion = ({ message, loadingMessage, errorMessage }) => { + return ( + + + + + {errorMessage ? ( + خطا در دریافت اطلاعات !!! + ) : loadingMessage ? ( + + + درحال دریافت اطلاعات + + ) : ( + {message} + )} + + + + + ); +}; +export default PrevCartableOpinion; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx new file mode 100644 index 0000000..f0be54c --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx @@ -0,0 +1,35 @@ +import {Card, CardContent, FormControl, FormLabel, Stack, Typography} from "@mui/material"; + +const QuestionSafetyForm = () => { + return ( + + + + + + + آیا ایمنی راه این طرح مورد تایید است ؟ + + + + + دفتر حریم راه :{" "} + + + بله + + + + + + + ); +}; +export default QuestionSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx new file mode 100644 index 0000000..64fbdb9 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx @@ -0,0 +1,82 @@ +import { DialogActions, DialogContent, Stack } from "@mui/material"; +import StyledForm from "@/core/components/StyledForm"; +import useRequest from "@/lib/hooks/useRequest"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { object, string } from "yup"; +import { SUBMIT_ROAD_SAFETY_FORM } from "@/core/utils/routes"; +import usePrevStateOpinion from "@/lib/hooks/usePrevStateopinion"; +import QuestionSafetyForm from "./QuestionSafetyForm"; +import PrevCartableOpinion from "./PrevCartableOpinion"; +import DescriptionForm from "./DescriptionForm"; +import ManagerOrAssistantSubmit from "./ManagerOrAssistantSubmit"; +import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; +const fakeData = { + id: 1, + shomareh_darkhast: "2124", + ostan: "ostan", + shahr: "shahr", + shahrestan: "shahrestan", + bakhsh: "bakhsh", + roosta: "roosta", + tarikh_darkhast: "tarikh_darkhast", + sazman: "sazman", + masahat_zamin: "masahat_zamin", + masahat_tarh: "masahat_tarh", + gorooh_tarh: "gorooh_tarh", + onvane_tarh: "onvane_tarh", + address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر", + file_mosavab: "file", + polygon: [ + [51.515, -0.09], + [51.52, -0.1], + [51.52, -0.12], + ], +}; +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), +}); +const RoadSafetyFormContext = ({ rowId, mutate, setOpenRoadSafetyForm }) => { + const defaultValues = { + description: "", + }; + const requestServer = useRequest({ notification : {success : true, show : true} }); + const { message, loadingMessage, errorMessage } = usePrevStateOpinion(); + const { + register, + handleSubmit, + formState: { isSubmitting, errors }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "onBlur" }); + const onSubmit = async (data) => { + const formData = new FormData(); + formData.append("description", data.description); + requestServer(`${SUBMIT_ROAD_SAFETY_FORM}/${rowId}`, "post", { + data: formData, + }) + .then(() => { + setOpenRoadSafetyForm(false); + mutate(); + }) + .catch(() => {}); + }; + return ( + + + + + + + + + + + + + + ); +}; +export default RoadSafetyFormContext; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/index.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/index.jsx new file mode 100644 index 0000000..9c57473 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/index.jsx @@ -0,0 +1,52 @@ +import { Dialog, IconButton, Stack, Tooltip } from "@mui/material"; +import EngineeringIcon from "@mui/icons-material/Engineering"; +import DialogTransition from "@/core/components/DialogTransition"; +import { useState } from "react"; +import { Close } from "@mui/icons-material"; +import RoadSafetyFormContext from "./RoadSafetyFormContext"; + +const RoadSafetyForm = ({ rowId, mutate }) => { + const [openRoadSafetyForm, setOpenRoadSafetyForm] = useState(false); + return ( + + + { + setOpenRoadSafetyForm(true); + }} + > + + + + + setOpenRoadSafetyForm(false)} + sx={{ + position: "absolute", + right: 8, + top: 8, + zIndex: 10, + color: (theme) => theme.palette.grey[500], + }} + > + + + + + + ); +}; +export default RoadSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/index.jsx index c2b1970..b7434f8 100644 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/index.jsx @@ -1,10 +1,12 @@ import TaskDetail from "./TaskDetail"; import { Box } from "@mui/material"; +import RoadSafetyForm from "./RoadSafetyForm"; const RowActions = ({ row, mutate }) => { return ( + ); }; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx index 82a4786..8f158d9 100644 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx @@ -8,6 +8,14 @@ import RowActions from "./RowActions"; const TaskList = () => { const columns = useMemo( () => [ + { + accessorKey: "id", + header: "کد یکتا", + id: "id", + enableColumnFilter: false, + datatype: "text", + filterFn: "notEquals", + }, { accessorKey: "aplication_number", header: "شماره درخواست", @@ -32,6 +40,14 @@ const TaskList = () => { datatype: "text", filterFn: "equals", }, + { + accessorKey: "township", + header: "شهرستان", + id: "township", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, { accessorKey: "city", header: "شهر", @@ -96,6 +112,14 @@ const TaskList = () => { datatype: "text", filterFn: "equals", }, + { + accessorKey: "state", + header: "وضعیت درخواست", + id: "state", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, ], [] ); @@ -112,7 +136,7 @@ const TaskList = () => { table_name={"assistantZaminGovList"} enableRowActions positionActionsColumn={"last"} - renderRowActions={({ row }) => } + RowActions={RowActions} /> diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx index eea9c34..7c1b0aa 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx @@ -31,7 +31,7 @@ const ReferFormContext = ({ setOpenReferDialog, rowId, mutate }) => { city: "", }; const { cities, loadingCities, errorCities } = useCities(); - const requestServer = useRequest({ auth: true }); + const requestServer = useRequest({notification : {show : true, success : true}}); const { control, register, diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx index fbb62cd..83e2f6c 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx @@ -40,6 +40,14 @@ const TaskList = () => { datatype: "text", filterFn: "equals", }, + { + accessorKey: "township", + header: "شهرستان", + id: "township", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, { accessorKey: "city", header: "شهر", @@ -104,6 +112,14 @@ const TaskList = () => { datatype: "text", filterFn: "equals", }, + { + accessorKey: "state", + header: "وضعیت درخواست", + id: "state", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, ], [] ); diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx new file mode 100644 index 0000000..49ffa3c --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx @@ -0,0 +1,29 @@ +import { FormControl, FormHelperText, InputLabel, OutlinedInput, Stack } from "@mui/material"; + +const DescriptionForm = ({ errors, register }) => { + return ( + + + + توضیحات + + + + {errors.description ? errors.description.message : null} + + + + ); +}; +export default DescriptionForm; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/ManagerOrAssistantSubmit.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/ManagerOrAssistantSubmit.jsx new file mode 100644 index 0000000..a515950 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/ManagerOrAssistantSubmit.jsx @@ -0,0 +1,15 @@ +import { Button } from "@mui/material"; + +const ManagerOrAssistantSubmit = ({ isSubmitting }) => { + return ( + <> + + + + ); +}; +export default ManagerOrAssistantSubmit; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx new file mode 100644 index 0000000..d2587c5 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx @@ -0,0 +1,26 @@ +import { Card, CardContent, CardHeader, CircularProgress, Divider, Stack, Typography } from "@mui/material"; +import usePrevStateOpinion from "@/lib/hooks/usePrevStateopinion"; + +const PrevCartableOpinion = ({ message, loadingMessage, errorMessage }) => { + return ( + + + + + {errorMessage ? ( + خطا در دریافت اطلاعات !!! + ) : loadingMessage ? ( + + + درحال دریافت اطلاعات + + ) : ( + {message} + )} + + + + + ); +}; +export default PrevCartableOpinion; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx new file mode 100644 index 0000000..f0be54c --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx @@ -0,0 +1,35 @@ +import {Card, CardContent, FormControl, FormLabel, Stack, Typography} from "@mui/material"; + +const QuestionSafetyForm = () => { + return ( + + + + + + + آیا ایمنی راه این طرح مورد تایید است ؟ + + + + + دفتر حریم راه :{" "} + + + بله + + + + + + + ); +}; +export default QuestionSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx new file mode 100644 index 0000000..ba31373 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx @@ -0,0 +1,82 @@ +import { DialogActions, DialogContent, Stack } from "@mui/material"; +import StyledForm from "@/core/components/StyledForm"; +import useRequest from "@/lib/hooks/useRequest"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { object, string } from "yup"; +import { SUBMIT_ROAD_SAFETY_FORM } from "@/core/utils/routes"; +import QuestionSafetyForm from "./QuestionSafetyForm"; +import PrevCartableOpinion from "./PrevCartableOpinion"; +import DescriptionForm from "./DescriptionForm"; +import ManagerOrAssistantSubmit from "./ManagerOrAssistantSubmit"; +import usePrevStateOpinion from "@/lib/hooks/usePrevStateopinion"; +import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; +const fakeData = { + id: 1, + shomareh_darkhast: "2124", + ostan: "ostan", + shahr: "shahr", + shahrestan: "shahrestan", + bakhsh: "bakhsh", + roosta: "roosta", + tarikh_darkhast: "tarikh_darkhast", + sazman: "sazman", + masahat_zamin: "masahat_zamin", + masahat_tarh: "masahat_tarh", + gorooh_tarh: "gorooh_tarh", + onvane_tarh: "onvane_tarh", + address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر", + file_mosavab: "file", + polygon: [ + [51.515, -0.09], + [51.52, -0.1], + [51.52, -0.12], + ], +}; +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), +}); +const RoadSafetyFormContext = ({ rowId, mutate, setOpenRoadSafetyForm }) => { + const defaultValues = { + description: "", + }; + const requestServer = useRequest({ notification : {success : true, show : true} }); + const { message, loadingMessage, errorMessage } = usePrevStateOpinion(); + const { + register, + handleSubmit, + formState: { isSubmitting, errors }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "onBlur" }); + const onSubmit = async (data) => { + const formData = new FormData(); + formData.append("description", data.description); + requestServer(`${SUBMIT_ROAD_SAFETY_FORM}/${rowId}`, "post", { + data: formData, + }) + .then(() => { + setOpenRoadSafetyForm(false); + mutate(); + }) + .catch(() => {}); + }; + return ( + + + + + + + + + + + + + + ); +}; +export default RoadSafetyFormContext; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/index.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/index.jsx new file mode 100644 index 0000000..9c57473 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/index.jsx @@ -0,0 +1,52 @@ +import { Dialog, IconButton, Stack, Tooltip } from "@mui/material"; +import EngineeringIcon from "@mui/icons-material/Engineering"; +import DialogTransition from "@/core/components/DialogTransition"; +import { useState } from "react"; +import { Close } from "@mui/icons-material"; +import RoadSafetyFormContext from "./RoadSafetyFormContext"; + +const RoadSafetyForm = ({ rowId, mutate }) => { + const [openRoadSafetyForm, setOpenRoadSafetyForm] = useState(false); + return ( + + + { + setOpenRoadSafetyForm(true); + }} + > + + + + + setOpenRoadSafetyForm(false)} + sx={{ + position: "absolute", + right: 8, + top: 8, + zIndex: 10, + color: (theme) => theme.palette.grey[500], + }} + > + + + + + + ); +}; +export default RoadSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/index.jsx index c2b1970..b7434f8 100644 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/index.jsx @@ -1,10 +1,12 @@ import TaskDetail from "./TaskDetail"; import { Box } from "@mui/material"; +import RoadSafetyForm from "./RoadSafetyForm"; const RowActions = ({ row, mutate }) => { return ( + ); }; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx index 396cffc..92f500b 100644 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx @@ -8,6 +8,14 @@ import RowActions from "./RowActions"; const TaskList = () => { const columns = useMemo( () => [ + { + accessorKey: "id", + header: "کد یکتا", + id: "id", + enableColumnFilter: false, + datatype: "text", + filterFn: "notEquals", + }, { accessorKey: "aplication_number", header: "شماره درخواست", @@ -32,6 +40,14 @@ const TaskList = () => { datatype: "text", filterFn: "equals", }, + { + accessorKey: "township", + header: "شهرستان", + id: "township", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, { accessorKey: "city", header: "شهر", @@ -96,6 +112,14 @@ const TaskList = () => { datatype: "text", filterFn: "equals", }, + { + accessorKey: "state", + header: "وضعیت درخواست", + id: "state", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, ], [] ); @@ -112,7 +136,7 @@ const TaskList = () => { table_name={"generalManagerZaminGovList"} enableRowActions positionActionsColumn={"last"} - renderRowActions={({ row }) => } + RowActions={RowActions} /> diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx index df3ccaf..fdf9278 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx @@ -31,7 +31,7 @@ const ReferFormContext = ({ setOpenReferDialog, rowId, mutate }) => { province: "", }; const { provinces, loadingProvinces, errorProvinces } = useProvinces(); - const requestServer = useRequest({ auth: true }); + const requestServer = useRequest({notification : {show : true, success : true}}); const { control, register, diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx new file mode 100644 index 0000000..49ffa3c --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx @@ -0,0 +1,29 @@ +import { FormControl, FormHelperText, InputLabel, OutlinedInput, Stack } from "@mui/material"; + +const DescriptionForm = ({ errors, register }) => { + return ( + + + + توضیحات + + + + {errors.description ? errors.description.message : null} + + + + ); +}; +export default DescriptionForm; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx new file mode 100644 index 0000000..8d14fd0 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx @@ -0,0 +1,27 @@ +import { Card, CardContent, CardHeader, CircularProgress, Divider, Stack, Typography } from "@mui/material"; +import usePrevStateOpinion from "@/lib/hooks/usePrevStateopinion"; + +const PrevCartableOpinion = () => { + const { message, loadingMessage, errorMessage } = usePrevStateOpinion(); + return ( + + + + + {errorMessage ? ( + خطا در دریافت اطلاعات !!! + ) : loadingMessage ? ( + + + درحال دریافت اطلاعات + + ) : ( + {message} + )} + + + + + ); +}; +export default PrevCartableOpinion; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx new file mode 100644 index 0000000..4c5faae --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx @@ -0,0 +1,57 @@ +import { + Card, + CardContent, + FormControl, + FormControlLabel, + FormLabel, + RadioGroup, + Stack, + Typography, +} from "@mui/material"; +import Radio from "@mui/material/Radio"; + +const QuestionSafetyForm = ({ register, errors }) => { + return ( + + + + + + + آیا ایمنی راه این طرح مورد تایید است ؟ + + + + + } + label="بله" + {...register("RadioGroup")} + /> + } + label="خیر" + {...register("RadioGroup")} + /> + + + {errors.RadioGroup && ( + + {errors.RadioGroup.message} + + )} + + + + + ); +}; +export default QuestionSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx new file mode 100644 index 0000000..64ab7c7 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx @@ -0,0 +1,80 @@ +import { DialogActions, DialogContent, Stack } from "@mui/material"; +import StyledForm from "@/core/components/StyledForm"; +import useRequest from "@/lib/hooks/useRequest"; +import { useForm } from "react-hook-form"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { object, string } from "yup"; +import QuestionSafetyForm from "./QuestionSafetyForm"; +import PrevCartableOpinion from "./PrevCartableOpinion"; +import DescriptionForm from "./DescriptionForm"; +import SubmitButtonsAdmin from "./SubmitButtonsAdmin"; +import { SUBMIT_ROAD_SAFETY_FORM } from "@/core/utils/routes"; +import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; +const fakeData = { + id: 1, + shomareh_darkhast: "2124", + ostan: "ostan", + shahr: "shahr", + shahrestan: "shahrestan", + bakhsh: "bakhsh", + roosta: "roosta", + tarikh_darkhast: "tarikh_darkhast", + sazman: "sazman", + masahat_zamin: "masahat_zamin", + masahat_tarh: "masahat_tarh", + gorooh_tarh: "gorooh_tarh", + onvane_tarh: "onvane_tarh", + address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر", + file_mosavab: "file", + polygon: [ + [51.515, -0.09], + [51.52, -0.1], + [51.52, -0.12], + ], +}; +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), + RadioGroup: string().required("تاییدیه ایمنی راه ضروریست!"), +}); +const RoadSafetyFormContext = ({ rowId, mutate, setOpenRoadSafetyForm }) => { + const defaultValues = { + description: "", + RadioGroup: "", + }; + const requestServer = useRequest({ notification : {success : true, show : true} }); + const { + register, + handleSubmit, + formState: { isSubmitting, errors }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "onBlur" }); + const onSubmit = async (data) => { + const formData = new FormData(); + formData.append("description", data.description); + formData.append("provinceId", data.RadioGroup); + + requestServer(`${SUBMIT_ROAD_SAFETY_FORM}/${rowId}`, "post", { + data: formData, + }) + .then(() => { + setOpenRoadSafetyForm(false); + mutate(); + }) + .catch(() => {}); + }; + return ( + + + + + + + + + + + + + + ); +}; +export default RoadSafetyFormContext; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/SubmitButtonsAdmin.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/SubmitButtonsAdmin.jsx new file mode 100644 index 0000000..6b46447 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/SubmitButtonsAdmin.jsx @@ -0,0 +1,21 @@ +import { Button } from "@mui/material"; + +const SubmitButtonsAdmin = ({ setOpenRoadSafetyForm, isSubmitting }) => { + return ( + <> + + + + ); +}; +export default SubmitButtonsAdmin; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/index.jsx new file mode 100644 index 0000000..652e809 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/index.jsx @@ -0,0 +1,52 @@ +import { Dialog, IconButton, Stack, Tooltip } from "@mui/material"; +import EngineeringIcon from "@mui/icons-material/Engineering"; +import DialogTransition from "@/core/components/DialogTransition"; +import { useState } from "react"; +import RoadSafetyFormContext from "./RoadSaftyFormContext"; +import { Close } from "@mui/icons-material"; + +const RoadSafetyForm = ({ rowId, mutate }) => { + const [openRoadSafetyForm, setOpenRoadSafetyForm] = useState(false); + return ( + + + { + setOpenRoadSafetyForm(true); + }} + > + + + + + setOpenRoadSafetyForm(false)} + sx={{ + position: "absolute", + right: 8, + top: 8, + zIndex: 10, + color: (theme) => theme.palette.grey[500], + }} + > + + + + + + ); +}; +export default RoadSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx index cd07b61..8da978b 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx @@ -1,12 +1,14 @@ import ReferForm from "./Refer"; import TaskDetail from "./TaskDetail"; import { Box } from "@mui/material"; +import RoadSafetyForm from "./RoadSafetyForm"; const RowActions = ({ row, mutate }) => { return ( + ); }; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx index 2a7e7ec..550e152 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx @@ -40,6 +40,14 @@ const TaskList = () => { datatype: "text", filterFn: "equals", }, + { + accessorKey: "township", + header: "شهرستان", + id: "township", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, { accessorKey: "city", header: "شهر", @@ -104,6 +112,14 @@ const TaskList = () => { datatype: "text", filterFn: "equals", }, + { + accessorKey: "state", + header: "وضعیت درخواست", + id: "state", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, ], [] ); @@ -120,7 +136,7 @@ const TaskList = () => { table_name={"provinceAdminZaminGovList"} enableRowActions positionActionsColumn={"last"} - renderRowActions={({ row }) => } + RowActions={RowActions} /> diff --git a/src/core/components/Toasts/success.jsx b/src/core/components/Toasts/success.jsx index 36023c6..fc11759 100644 --- a/src/core/components/Toasts/success.jsx +++ b/src/core/components/Toasts/success.jsx @@ -16,7 +16,7 @@ export const successToast = (toastContainer) => - {"Your operation was successful"} + {"عملیات با موفقیت انجام شد"} diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index a980707..14bf801 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -10,3 +10,5 @@ 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"; export const GET_PROVINCE_LISTS = "/v3/api/fake-provinces"; +export const GET_PREV_STATE_OPINION = "/v3/api/fake-prev-state-opinion"; +export const SUBMIT_ROAD_SAFETY_FORM = "/v3/api/fake-submit"; diff --git a/src/lib/hooks/useCities.js b/src/lib/hooks/useCities.js index e4012b7..47bf99b 100644 --- a/src/lib/hooks/useCities.js +++ b/src/lib/hooks/useCities.js @@ -1,8 +1,10 @@ import { useState, useEffect } from "react"; import axios from "axios"; import { GET_CITY_LISTS } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; const useCities = () => { + const requestServer = useRequest() const [cities, setCities] = useState([]); const [loadingCities, setLoadingCities] = useState(true); const [errorCities, setErrorCities] = useState(null); @@ -10,7 +12,7 @@ const useCities = () => { useEffect(() => { const fetchCities = async () => { try { - const response = await axios.get(`${GET_CITY_LISTS}`); + const response = await requestServer(`${GET_CITY_LISTS}`); setCities(response.data.data); setLoadingCities(false); } catch (e) { diff --git a/src/lib/hooks/usePrevStateopinion.js b/src/lib/hooks/usePrevStateopinion.js new file mode 100644 index 0000000..f7c0d47 --- /dev/null +++ b/src/lib/hooks/usePrevStateopinion.js @@ -0,0 +1,31 @@ +import { useState, useEffect } from "react"; +import axios from "axios"; +import { GET_PREV_STATE_OPINION } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; + +const usePrevStateOpinion = () => { + const requestServer = useRequest() + const [message, setMessage] = useState([]); + const [loadingMessage, setLoadingMessage] = useState(true); + const [errorMessage, setErrorMessage] = useState(null); + + useEffect(() => { + const fetchCities = async () => { + try { + const response = await requestServer(`${GET_PREV_STATE_OPINION}`); + setMessage(response.data.message); + setLoadingMessage(false); + } catch (e) { + console.error("Error fetching cities:", e); + setErrorMessage(e); + setLoadingMessage(false); + } + }; + + fetchCities(); + }, []); + + return { message, loadingMessage, errorMessage }; +}; + +export default usePrevStateOpinion; diff --git a/src/lib/hooks/useProvince.js b/src/lib/hooks/useProvince.js index 699b462..b0a7dc9 100644 --- a/src/lib/hooks/useProvince.js +++ b/src/lib/hooks/useProvince.js @@ -1,8 +1,10 @@ import { useState, useEffect } from "react"; import axios from "axios"; import { GET_PROVINCE_LISTS } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; const useProvinces = () => { + const requestServer = useRequest() const [provinces, setProvinces] = useState([]); const [loadingProvinces, setLoadingProvinces] = useState(true); const [errorProvinces, setErrorProvinces] = useState(null); @@ -10,7 +12,7 @@ const useProvinces = () => { useEffect(() => { const fetchCities = async () => { try { - const response = await axios.get(`${GET_PROVINCE_LISTS}`); // Fetch the cities from the API + const response = await requestServer(`${GET_PROVINCE_LISTS}`); // Fetch the cities from the API setProvinces(response.data.data); // Set the cities data setLoadingProvinces(false); // Set loading to false after successful fetch } catch (e) { From 12e73ee502d5c009808dc560d423fcc5de62515d Mon Sep 17 00:00:00 2001 From: Mohammad Jalali Date: Sat, 12 Oct 2024 06:57:10 +0000 Subject: [PATCH 29/31] Feature/map modify --- package.json | 1 + src/assets/scss/map-styles.scss | 28 +++++ .../RoadSafetyForm/QuestionSafetyForm.jsx | 12 +- .../RoadSafetyForm/RoadSafetyFormContext.jsx | 2 +- .../RowActions/Refer/ReferFormContext.jsx | 2 +- .../RoadSafetyForm/QuestionSafetyForm.jsx | 12 +- .../RoadSafetyForm/RoadSafetyFormContext.jsx | 2 +- .../RowActions/MapModify/MapActionButtons.jsx | 96 ++++++++++++++ .../RowActions/MapModify/MapModifyDialog.jsx | 91 ++++++++++++++ .../RowActions/MapModify/PolygonForDesign.jsx | 118 ++++++++++++++++++ .../zaminGov/RowActions/MapModify/index.jsx | 25 ++++ .../RowActions/Refer/ReferFormContext.jsx | 2 +- .../RoadSafetyForm/RoadSaftyFormContext.jsx | 2 +- .../zaminGov/RowActions/index.jsx | 14 ++- src/lib/hooks/useCities.js | 2 +- src/lib/hooks/usePrevStateopinion.js | 2 +- src/lib/hooks/useProvince.js | 2 +- 17 files changed, 385 insertions(+), 28 deletions(-) create mode 100644 src/assets/scss/map-styles.scss create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapActionButtons.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapModifyDialog.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/PolygonForDesign.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/index.jsx diff --git a/package.json b/package.json index 4132581..9641fc0 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "react-dom": "^18", "react-hook-form": "^7.52.1", "react-leaflet": "^4.2.1", + "react-leaflet-draw": "^0.20.4", "react-toastify": "^10.0.5", "sass": "^1.75.0", "sharp": "^0.33.4", diff --git a/src/assets/scss/map-styles.scss b/src/assets/scss/map-styles.scss new file mode 100644 index 0000000..851873f --- /dev/null +++ b/src/assets/scss/map-styles.scss @@ -0,0 +1,28 @@ +.leaflet-draw-tooltip { + background-color: #4f4f4f; + font-family: IRANSans; + color: #fff; + font-size: 10px; + padding: 2px 8px; + margin-right: 15px; + border-radius: 4px; + box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1); +} + +.leaflet-draw-tooltip:before { + content: ""; + position: absolute; + bottom: 100%; + left: 103%; + transform: rotate(90deg); + margin-left: -6px; + border-width: 6px; + border-style: solid; + border-color: transparent transparent #333 transparent; +} + +.leaflet-draw-tooltip-subtext { + font-size: 12px; + color: #ffeb3b; +} + diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx index f0be54c..cc9be16 100644 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx @@ -1,10 +1,10 @@ -import {Card, CardContent, FormControl, FormLabel, Stack, Typography} from "@mui/material"; +import { Card, CardContent, FormControl, FormLabel, Stack, Typography } from "@mui/material"; const QuestionSafetyForm = () => { return ( - + @@ -15,13 +15,11 @@ const QuestionSafetyForm = () => { - - دفتر حریم راه :{" "} - + دفتر حریم راه : بله diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx index 64fbdb9..def0666 100644 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx @@ -40,7 +40,7 @@ const RoadSafetyFormContext = ({ rowId, mutate, setOpenRoadSafetyForm }) => { const defaultValues = { description: "", }; - const requestServer = useRequest({ notification : {success : true, show : true} }); + const requestServer = useRequest({ notification: { success: true, show: true } }); const { message, loadingMessage, errorMessage } = usePrevStateOpinion(); const { register, diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx index 7c1b0aa..10b8e38 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx @@ -31,7 +31,7 @@ const ReferFormContext = ({ setOpenReferDialog, rowId, mutate }) => { city: "", }; const { cities, loadingCities, errorCities } = useCities(); - const requestServer = useRequest({notification : {show : true, success : true}}); + const requestServer = useRequest({ notification: { show: true, success: true } }); const { control, register, diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx index f0be54c..cc9be16 100644 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx @@ -1,10 +1,10 @@ -import {Card, CardContent, FormControl, FormLabel, Stack, Typography} from "@mui/material"; +import { Card, CardContent, FormControl, FormLabel, Stack, Typography } from "@mui/material"; const QuestionSafetyForm = () => { return ( - + @@ -15,13 +15,11 @@ const QuestionSafetyForm = () => { - - دفتر حریم راه :{" "} - + دفتر حریم راه : بله diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx index ba31373..7ced8b8 100644 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx @@ -40,7 +40,7 @@ const RoadSafetyFormContext = ({ rowId, mutate, setOpenRoadSafetyForm }) => { const defaultValues = { description: "", }; - const requestServer = useRequest({ notification : {success : true, show : true} }); + const requestServer = useRequest({ notification: { success: true, show: true } }); const { message, loadingMessage, errorMessage } = usePrevStateOpinion(); const { register, diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapActionButtons.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapActionButtons.jsx new file mode 100644 index 0000000..4986160 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapActionButtons.jsx @@ -0,0 +1,96 @@ +import {Box, Button, ButtonGroup} from "@mui/material"; +import AutoModeIcon from "@mui/icons-material/AutoMode"; +import DeleteIcon from "@mui/icons-material/Delete"; +import EditLocationAltIcon from "@mui/icons-material/EditLocationAlt"; +import SaveIcon from "@mui/icons-material/Save"; +import CancelIcon from "@mui/icons-material/Cancel"; + +const MapActionButtons = ({ + disableToCreate, + disableToEditAndDelete, + disableToSaveAndCancel, + onDraw, + onEdit, + onRemove, + onSave, + onCancel, + }) => ( + <> + + + + + + + + + + + + + +); + +export default MapActionButtons; \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapModifyDialog.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapModifyDialog.jsx new file mode 100644 index 0000000..55566a2 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapModifyDialog.jsx @@ -0,0 +1,91 @@ +"use client"; + +import { + Box, + Button, + Chip, + Dialog, + DialogActions, + DialogContent, + Divider, + FormControl, + FormControlLabel, + FormLabel, + Radio, + RadioGroup, + Typography, +} from "@mui/material"; +import dynamic from "next/dynamic"; +import MapLoading from "@/core/components/MapLayer/Loading"; +import "leaflet-draw/dist/leaflet.draw.css"; +import GppMaybeIcon from "@mui/icons-material/GppMaybe"; +import PolygonForDesign from "./PolygonForDesign"; + +const MapLayer = dynamic(() => import("@/core/components/MapLayer"), { + loading: () => , + ssr: false, +}); + +const MapModifyDialog = ({mapModifyModal, setMapModifyModal}) => { + const handleClose = () => { + setMapModifyModal(false); + }; + + return ( + + + + + + + + + + + + + + نکته: اصلاح ننمودن طرح به منزله تایید طرح میباشد. + + + + + آیا + طرح نیاز به ایجاد راه + دسترسی + دارد؟ + + } label="بله"/> + } label="خیر"/> + + + + + + + + + + ); +}; + +export default MapModifyDialog; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/PolygonForDesign.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/PolygonForDesign.jsx new file mode 100644 index 0000000..9dd400f --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/PolygonForDesign.jsx @@ -0,0 +1,118 @@ +"use client"; + +import "leaflet-draw/dist/leaflet.draw.css"; +import "@/assets/scss/map-styles.scss" +import {FeatureGroup, useMap} from "react-leaflet"; +import {EditControl} from "react-leaflet-draw"; +import {useEffect, useRef, useState} from "react"; +import MapActionButtons from "./MapActionButtons"; + + +const PolygonForDesign = () => { + const map = useMap(); + const editableFG = useRef(null); + const [polygonLayer, setPolygonLayer] = useState(null); + const [disableToCreate, setDisableToCreate] = useState(false); + const [disableToEditAndDelete, setDisableToEditAndDelete] = useState(true); + const [disableToSaveAndCancel, setDisableToSaveAndCancel] = useState(true); + const [editToolbar, setEditToolbar] = useState(null); + + useEffect(() => { + const {L} = window; + L.drawLocal.draw.handlers.polygon.tooltip = { + start: "برای شروع کشیدن پلیگان، کلیک کنید.", + cont: "گوشه های دیگر پلیگان را نیز انتخاب کنید.", + end: "برای اتمام رسم پلیگان، نقطه آخر را به اول متصل نمایید.", + }; + L.drawLocal.edit.handlers.edit.tooltip = { + text: "برای ذخیر یا لغو تغییرات، از دکمه های بالا سمت چپ استفاده نمایید.", + subtext: "نقاط مشخص شده را گرفته و برای ویرایش جابجا نمایید.", + }; + }, []); + + const handleDrawPolygon = () => { + const {L} = window; + const drawControl = new L.Draw.Polygon(map); + drawControl.enable(); + setDisableToCreate(true); + }; + + const handleEditPolygon = () => { + const {L} = window; + if (editableFG.current && polygonLayer) { + const editControlInstance = new L.EditToolbar.Edit(map, { + featureGroup: editableFG.current, + }); + editControlInstance.enable(); + setEditToolbar(editControlInstance); + setDisableToEditAndDelete(true); + setDisableToSaveAndCancel(false); + } + }; + + const handleRemovePolygon = () => { + if (polygonLayer && editableFG.current) { + editableFG.current.removeLayer(polygonLayer); + setPolygonLayer(null); + setDisableToEditAndDelete(true); + setDisableToCreate(false); + } + }; + + const handleSavePolygon = () => { + if (editToolbar) { + editToolbar.save(); + editToolbar.disable(); + setDisableToEditAndDelete(false); + setDisableToSaveAndCancel(true); + } + }; + + const handleCancelEdit = () => { + if (editToolbar) { + editToolbar.revertLayers(); + editToolbar.disable(); + setDisableToEditAndDelete(false); + setDisableToSaveAndCancel(true); + } + }; + + const handlePolygonCreate = (e) => { + const layer = e.layer; + setPolygonLayer(layer); + editableFG.current.addLayer(layer); + setDisableToEditAndDelete(false); + }; + + return ( + <> + + + + + + ); +}; + +export default PolygonForDesign; \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/index.jsx new file mode 100644 index 0000000..5a96741 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/index.jsx @@ -0,0 +1,25 @@ +import {IconButton, Tooltip} from "@mui/material"; +import MapIcon from "@mui/icons-material/Map"; +import {useState} from "react"; +import MapModifyDialog from "./MapModifyDialog"; + +const MapModify = ({rowId, mutate}) => { + const [mapModifyModal, setMapModifyModal] = useState(false); + + const openMapModifyDialog = () => { + setMapModifyModal(true); + }; + + return ( + <> + + + + + + + + ); +}; +export default MapModify; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx index fdf9278..26f9bf8 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx @@ -31,7 +31,7 @@ const ReferFormContext = ({ setOpenReferDialog, rowId, mutate }) => { province: "", }; const { provinces, loadingProvinces, errorProvinces } = useProvinces(); - const requestServer = useRequest({notification : {show : true, success : true}}); + const requestServer = useRequest({ notification: { show: true, success: true } }); const { control, register, diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx index 64ab7c7..861400a 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx @@ -41,7 +41,7 @@ const RoadSafetyFormContext = ({ rowId, mutate, setOpenRoadSafetyForm }) => { description: "", RadioGroup: "", }; - const requestServer = useRequest({ notification : {success : true, show : true} }); + const requestServer = useRequest({ notification: { success: true, show: true } }); const { register, handleSubmit, diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx index 8da978b..778eaa7 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx @@ -1,14 +1,16 @@ import ReferForm from "./Refer"; import TaskDetail from "./TaskDetail"; -import { Box } from "@mui/material"; +import {Box} from "@mui/material"; import RoadSafetyForm from "./RoadSafetyForm"; +import MapModify from "./MapModify"; -const RowActions = ({ row, mutate }) => { +const RowActions = ({row, mutate}) => { return ( - - - - + + + + + ); }; diff --git a/src/lib/hooks/useCities.js b/src/lib/hooks/useCities.js index 47bf99b..e1af9aa 100644 --- a/src/lib/hooks/useCities.js +++ b/src/lib/hooks/useCities.js @@ -4,7 +4,7 @@ import { GET_CITY_LISTS } from "@/core/utils/routes"; import useRequest from "@/lib/hooks/useRequest"; const useCities = () => { - const requestServer = useRequest() + const requestServer = useRequest(); const [cities, setCities] = useState([]); const [loadingCities, setLoadingCities] = useState(true); const [errorCities, setErrorCities] = useState(null); diff --git a/src/lib/hooks/usePrevStateopinion.js b/src/lib/hooks/usePrevStateopinion.js index f7c0d47..9104366 100644 --- a/src/lib/hooks/usePrevStateopinion.js +++ b/src/lib/hooks/usePrevStateopinion.js @@ -4,7 +4,7 @@ import { GET_PREV_STATE_OPINION } from "@/core/utils/routes"; import useRequest from "@/lib/hooks/useRequest"; const usePrevStateOpinion = () => { - const requestServer = useRequest() + const requestServer = useRequest(); const [message, setMessage] = useState([]); const [loadingMessage, setLoadingMessage] = useState(true); const [errorMessage, setErrorMessage] = useState(null); diff --git a/src/lib/hooks/useProvince.js b/src/lib/hooks/useProvince.js index b0a7dc9..a21744b 100644 --- a/src/lib/hooks/useProvince.js +++ b/src/lib/hooks/useProvince.js @@ -4,7 +4,7 @@ import { GET_PROVINCE_LISTS } from "@/core/utils/routes"; import useRequest from "@/lib/hooks/useRequest"; const useProvinces = () => { - const requestServer = useRequest() + const requestServer = useRequest(); const [provinces, setProvinces] = useState([]); const [loadingProvinces, setLoadingProvinces] = useState(true); const [errorProvinces, setErrorProvinces] = useState(null); From 45d1665155f0c3f2b846da1e1efa2b9b6ffb3edb Mon Sep 17 00:00:00 2001 From: Mohammad Jalali Date: Sat, 26 Oct 2024 05:31:11 +0000 Subject: [PATCH 30/31] complete design of adding new test and bundling and saving map data next step... --- src/app/(withAuth)/dashboard/test/page.js | 7 + src/app/api/fake-tests-type/route.js | 18 + src/app/api/fake-tests/route.js | 71 ++++ src/assets/images/examine_marker.png | Bin 0 -> 15040 bytes src/assets/images/examine_marker_active.png | Bin 0 -> 13021 bytes src/assets/scss/global.scss | 9 +- src/assets/scss/map-styles.scss | 1 - .../create/CreateDialog/ChooseLocation.jsx | 162 ++++++++ .../create/CreateDialog/CreateTimeLine.jsx | 59 +++ .../Actions/create/CreateDialog/MapBox.jsx | 39 ++ .../create/CreateDialog/TestGeneralInfo.jsx | 387 ++++++++++++++++++ .../Actions/create/CreateDialog/index.jsx | 187 +++++++++ .../dashboard/test/Actions/create/index.jsx | 33 ++ .../test/ShowLocation/ShowLocationMarker.jsx | 105 +++++ .../dashboard/test/ShowLocation/index.jsx | 50 +++ src/components/dashboard/test/TestList.jsx | 135 ++++++ src/components/dashboard/test/Toolbar.jsx | 10 + src/components/dashboard/test/index.jsx | 15 + src/core/utils/pageMenu.js | 81 ++-- src/core/utils/routes.js | 3 + src/lib/hooks/useProvince.js | 7 +- src/lib/hooks/useTest.js | 30 ++ 22 files changed, 1363 insertions(+), 46 deletions(-) create mode 100644 src/app/(withAuth)/dashboard/test/page.js create mode 100644 src/app/api/fake-tests-type/route.js create mode 100644 src/app/api/fake-tests/route.js create mode 100644 src/assets/images/examine_marker.png create mode 100644 src/assets/images/examine_marker_active.png create mode 100644 src/components/dashboard/test/Actions/create/CreateDialog/ChooseLocation.jsx create mode 100644 src/components/dashboard/test/Actions/create/CreateDialog/CreateTimeLine.jsx create mode 100644 src/components/dashboard/test/Actions/create/CreateDialog/MapBox.jsx create mode 100644 src/components/dashboard/test/Actions/create/CreateDialog/TestGeneralInfo.jsx create mode 100644 src/components/dashboard/test/Actions/create/CreateDialog/index.jsx create mode 100644 src/components/dashboard/test/Actions/create/index.jsx create mode 100644 src/components/dashboard/test/ShowLocation/ShowLocationMarker.jsx create mode 100644 src/components/dashboard/test/ShowLocation/index.jsx create mode 100644 src/components/dashboard/test/TestList.jsx create mode 100644 src/components/dashboard/test/Toolbar.jsx create mode 100644 src/components/dashboard/test/index.jsx create mode 100644 src/lib/hooks/useTest.js diff --git a/src/app/(withAuth)/dashboard/test/page.js b/src/app/(withAuth)/dashboard/test/page.js new file mode 100644 index 0000000..7baafa7 --- /dev/null +++ b/src/app/(withAuth)/dashboard/test/page.js @@ -0,0 +1,7 @@ +import TestPage from "@/components/dashboard/test"; + +const Page = () => { + return ; +}; + +export default Page; diff --git a/src/app/api/fake-tests-type/route.js b/src/app/api/fake-tests-type/route.js new file mode 100644 index 0000000..943b759 --- /dev/null +++ b/src/app/api/fake-tests-type/route.js @@ -0,0 +1,18 @@ +const data = [ + { + id: 1, + name: "تست نوع 1", + }, + { + id: 2, + name: "تست نوع 2", + }, + { + id: 3, + name: "تست نوع 3", + }, +]; + +export async function GET() { + return Response.json({data}); +} diff --git a/src/app/api/fake-tests/route.js b/src/app/api/fake-tests/route.js new file mode 100644 index 0000000..7d9c077 --- /dev/null +++ b/src/app/api/fake-tests/route.js @@ -0,0 +1,71 @@ +const data = [ + { + id: 1, + test_type_name: 1, + project_name: "نوع پروژه", + employer: "کارفرما", + consultant: "مشاور", + contractor: "پیمانکار", + applicant: "متقاضی", + work_number: "شماره کار", + request_number: "شماره درخواست", + request_date: "تاریخ درخواست", + report_date: "تاریخ گزارش" + }, + { + id: 2, + test_type_name: 5, + project_name: "نوع پروژه", + employer: "کارفرما", + consultant: "مشاور", + contractor: "پیمانکار", + applicant: "متقاضی", + work_number: "شماره کار", + request_number: "شماره درخواست", + request_date: "تاریخ درخواست", + report_date: "تاریخ گزارش" + }, + { + id: 3, + test_type_name: 2, + project_name: "نوع پروژه", + employer: "کارفرما", + consultant: "مشاور", + contractor: "پیمانکار", + applicant: "متقاضی", + work_number: "شماره کار", + request_number: "شماره درخواست", + request_date: "تاریخ درخواست", + report_date: "تاریخ گزارش" + }, + { + id: 4, + test_type_name: 4, + project_name: "نوع پروژه", + employer: "کارفرما", + consultant: "مشاور", + contractor: "پیمانکار", + applicant: "متقاضی", + work_number: "شماره کار", + request_number: "شماره درخواست", + request_date: "تاریخ درخواست", + report_date: "تاریخ گزارش" + }, + { + id: 5, + test_type_name: 3, + project_name: "نوع پروژه", + employer: "کارفرما", + consultant: "مشاور", + contractor: "پیمانکار", + applicant: "متقاضی", + work_number: "شماره کار", + request_number: "شماره درخواست", + request_date: "تاریخ درخواست", + report_date: "تاریخ گزارش" + }, +]; + +export async function GET() { + return Response.json({data}); +} diff --git a/src/assets/images/examine_marker.png b/src/assets/images/examine_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..ac2446dc43e7040cc612847335003cc7ecf6591c GIT binary patch literal 15040 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/examine_marker_active.png b/src/assets/images/examine_marker_active.png new file mode 100644 index 0000000000000000000000000000000000000000..07cbca51f4cff8ee207e6f3e7890b937fc73e6d8 GIT binary patch literal 13021 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 { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + + const mapTestMarker = useRef(); + const defaultIconSize = [35, 35]; + const createCustomIcon = (size, iconUrl) => { + return L.icon({ + iconUrl: iconUrl, + iconSize: size, + iconAnchor: [size[0] / 2, size[1]], + popupAnchor: [0, -size[1]] + }); + }; + + const map = useMapEvents({ + move(e) { + if (!mapBoxData) { + mapTestMarker.current.setLatLng(e.target.getCenter()); + } + }, + movestart() { + if (!mapBoxData) { + mapTestMarker.current.setIcon(createCustomIcon([45, 45], TestIcon.src)); + } + }, + moveend() { + if (!mapBoxData) { + mapTestMarker.current.setIcon(createCustomIcon(defaultIconSize, TestIcon.src)); + } + } + }); + + useEffect(() => { + if (mapTestMarker.current) { + const newIcon = mapBoxData + ? createCustomIcon([45, 45], TestActiveIcon.src) + : createCustomIcon(defaultIconSize, TestIcon.src); + mapTestMarker.current.setIcon(newIcon); + } + if (mapBoxData) { + mapTestMarker.current.setLatLng(mapBoxData); + map.flyTo(mapBoxData, 14); + } + }, [mapBoxData]); + + const handleMarkerClick = () => { + if (!mapBoxData) { + setMapBoxData({lat: mapTestMarker.current.getLatLng().lat, lng: mapTestMarker.current.getLatLng().lng}); + } + }; + + const handleEditLocation = () => { + setMapBoxData(null); + } + + return ( + <> + + + + + + + طول جغرافیایی + + + {mapBoxData ? : + } + + } + label="طول جغرافیایی" + /> + + + + + + عرض جغرافیایی + + + {mapBoxData ? : + } + + } + label="عرض جغرافیایی" + /> + + + + + + + ); +}; + +export default ChooseLocation; \ No newline at end of file diff --git a/src/components/dashboard/test/Actions/create/CreateDialog/CreateTimeLine.jsx b/src/components/dashboard/test/Actions/create/CreateDialog/CreateTimeLine.jsx new file mode 100644 index 0000000..49a7d90 --- /dev/null +++ b/src/components/dashboard/test/Actions/create/CreateDialog/CreateTimeLine.jsx @@ -0,0 +1,59 @@ +"use client"; + +import {Box, Typography} from "@mui/material"; +import TextSnippetIcon from '@mui/icons-material/TextSnippet'; +import TravelExploreIcon from '@mui/icons-material/TravelExplore'; +import { + Timeline, + TimelineConnector, + TimelineContent, + TimelineDot, + TimelineItem, + timelineItemClasses, + TimelineSeparator +} from "@mui/lab"; + +const CreateTimeLine = ({tabState}) => { + return ( + + + + + + + + + + + + + نقشه + + ثبت مختصات محل + آزمایش + + + + + + + + + + + + + مشخصات آزمایش + + ثبت مشخصات اولیه + + + + + ); +}; +export default CreateTimeLine; diff --git a/src/components/dashboard/test/Actions/create/CreateDialog/MapBox.jsx b/src/components/dashboard/test/Actions/create/CreateDialog/MapBox.jsx new file mode 100644 index 0000000..8b1611c --- /dev/null +++ b/src/components/dashboard/test/Actions/create/CreateDialog/MapBox.jsx @@ -0,0 +1,39 @@ +"use client"; + +import {Box, Stack} from "@mui/material"; +import dynamic from "next/dynamic"; +import MapLoading from "@/core/components/MapLayer/Loading"; +import ChooseLocation from "./ChooseLocation"; + +const MapLayer = dynamic(() => import("@/core/components/MapLayer"), { + loading: () => , + ssr: false, +}); + +const MapBox = ({mapBoxData, setMapBoxData}) => { + return ( + + + + + + + + + + ); +}; +export default MapBox; diff --git a/src/components/dashboard/test/Actions/create/CreateDialog/TestGeneralInfo.jsx b/src/components/dashboard/test/Actions/create/CreateDialog/TestGeneralInfo.jsx new file mode 100644 index 0000000..d424a1a --- /dev/null +++ b/src/components/dashboard/test/Actions/create/CreateDialog/TestGeneralInfo.jsx @@ -0,0 +1,387 @@ +"use client"; + +import {Controller} from "react-hook-form"; +import { + Autocomplete, + CircularProgress, + FormControl, + FormHelperText, + Grid, + IconButton, + InputAdornment, + InputLabel, + OutlinedInput, + TextField, + Typography +} from "@mui/material"; +import useTest from "@/lib/hooks/useTest"; +import useProvinces from "@/lib/hooks/useProvince"; +import {LocalizationProvider, MobileDatePicker} from "@mui/x-date-pickers"; +import {AdapterDateFnsJalali} from "@mui/x-date-pickers/AdapterDateFnsJalali"; +import {faIR} from "@mui/x-date-pickers/locales"; +import ClearIcon from "@mui/icons-material/Clear"; +import React from "react"; + +const TestGeneralInfo = ({control, register, setValue, errors}) => { + const {tests, errorTests, loadingTests} = useTest(); + const {provinces, errorProvinces, loadingProvinces} = useProvinces(); + + return ( + + + ( + + + {errorTests ? ( + + خطایی در دریافت لیست آزمایش ها رخ داده است! + + ) : loadingTests ? ( + + + درحال دریافت لیست آزمایش ها + + ) : ( + test.id === value) || null} + disablePortal + options={tests} + getOptionLabel={(test) => test.name} + isOptionEqualToValue={(option, value) => option.id === value?.id} + onChange={(event, newValue) => { + onChange(newValue ? newValue.id : ""); + setValue("azmayesh_type_name", newValue ? newValue.name : ""); + }} + renderInput={(params) => ( + + )} + /> + )} + + {errors.azmayesh_type_id ? errors.azmayesh_type_id.message : null} + + + )} + /> + + + ( + + + {errorProvinces ? ( + + خطایی در دریافت لیست استان ها رخ داده است! + + ) : loadingProvinces ? ( + + + درحال دریافت لیست استان ها + + ) : ( + province.id === value) || null} + disablePortal + options={provinces} + getOptionLabel={(province) => province.name} + isOptionEqualToValue={(option, value) => option.id === value?.id} + onChange={(event, newValue) => { + onChange(newValue ? newValue.id : ""); + setValue("province_name", newValue ? newValue.name : ""); + }} + renderInput={(params) => ( + + )} + /> + )} + + {errors.province_id ? errors.province_id.message : null} + + + )} + /> + + + + + پروژه + + + + {errors.project_name ? errors.project_name.message : null} + + + + + + + کارفرما + + + + {errors.employer ? errors.employer.message : null} + + + + + + + مشاور + + + + {errors.consultant ? errors.consultant.message : null} + + + + + + + پیمانکار + + + + {errors.contractor ? errors.contractor.message : null} + + + + + + + متقاضی + + + + {errors.applicant ? errors.applicant.message : null} + + + + + + + شماره کار + + + + {errors.work_number ? errors.work_number.message : null} + + + + + + + شماره درخواست + + + + {errors.request_number ? errors.request_number.message : null} + + + + + ( + + + { + onChange(newValue); + }} + slotProps={{ + textField: { + size: "small", + error: !!errors.request_date, + placeholder: "تاریخ درخواست", + InputProps: { + endAdornment: ( + + { + event.stopPropagation(); + setValue("request_date", ""); + }} + sx={{ + color: "#bfbfbf", + "&:hover": { + backgroundColor: "rgba(189, 189, 189, 0.1)", + color: "#363434", + }, + }} + > + + + + ), + }, + }, + }} + /> + + + {errors.request_date ? errors.request_date.message : null} + + + )} + /> + + + ( + + + { + onChange(newValue); + }} + slotProps={{ + textField: { + size: "small", + error: !!errors.report_date, + placeholder: "تاریخ گزارش", + InputProps: { + endAdornment: ( + + { + event.stopPropagation(); + setValue("report_date", ""); + }} + sx={{ + color: "#bfbfbf", + "&:hover": { + backgroundColor: "rgba(189, 189, 189, 0.1)", + color: "#363434", + }, + }} + > + + + + ), + }, + }, + }} + /> + + + {errors.report_date ? errors.report_date.message : null} + + + )} + /> + + + ); +}; +export default TestGeneralInfo; \ No newline at end of file diff --git a/src/components/dashboard/test/Actions/create/CreateDialog/index.jsx b/src/components/dashboard/test/Actions/create/CreateDialog/index.jsx new file mode 100644 index 0000000..f52c42a --- /dev/null +++ b/src/components/dashboard/test/Actions/create/CreateDialog/index.jsx @@ -0,0 +1,187 @@ +"use client"; + +import {Box, Button, Dialog, DialogActions, DialogContent, Tab, Tabs, useMediaQuery} from "@mui/material"; +import {useTheme} from "@emotion/react"; +import React, {useState} from "react"; +import MapBox from "./MapBox"; +import TravelExploreIcon from '@mui/icons-material/TravelExplore'; +import TextSnippetIcon from '@mui/icons-material/TextSnippet'; +import KeyboardDoubleArrowRightIcon from '@mui/icons-material/KeyboardDoubleArrowRight'; +import KeyboardDoubleArrowLeftIcon from '@mui/icons-material/KeyboardDoubleArrowLeft'; +import ExitToAppIcon from '@mui/icons-material/ExitToApp'; +import BeenhereIcon from '@mui/icons-material/Beenhere'; +import CreateTimeLine from "./CreateTimeLine"; +import {useForm} from "react-hook-form"; +import StyledForm from "@/core/components/StyledForm"; +import {object, string} from "yup"; +import useRequest from "@/lib/hooks/useRequest"; +import {yupResolver} from "@hookform/resolvers/yup"; +import moment from "jalali-moment"; +import {POST_TEST} from "@/core/utils/routes"; +import TestGeneralInfo from "@/components/dashboard/test/Actions/create/CreateDialog/TestGeneralInfo"; + +function TabPanel(props) { + const {children, value, index} = props; + + return ( + + ); +} + +const CreateDialog = ({open, setOpen}) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const [tabState, setTabState] = useState(0); + const [mapBoxData, setMapBoxData] = useState(null); + + const handleClose = () => { + setOpen(false); + }; + + const handleChangeTab = (event, newValue) => { + setTabState(newValue); + }; + + const handlePrev = () => { + if (tabState === 0) { + handleClose(); + } else { + setTabState(tabState - 1) + } + }; + + const validationSchema = object({ + azmayesh_type_id: string().required("نوع آزمایش را مشخص کنید!"), + province_id: string().required("استان را وارد کنید!"), + project_name: string().required("عنوان پروژه را وارد کنید!"), + employer: string().required("کارفرما را وارد کنید!"), + consultant: string().required("مشاور را وارد کنید!"), + contractor: string().required("پیمانکار را وارد کنید!"), + applicant: string().required("متقاضی را وارد کنید!"), + work_number: string().required("شماره کار را وارد کنید!"), + request_number: string().required("شماره درخواست را وارد کنید!"), + request_date: string().required("تاریخ درخواست را وارد کنید!"), + report_date: string().required("تاریخ گزارش را وارد کنید!"), + }); + const requestServer = useRequest({auth: true}); + + const defaultValues = { + azmayesh_type_id: "", + azmayesh_type_name: "", + province_id: "", + province_name: "", + project_name: "", + employer: "", + consultant: "", + contractor: "", + applicant: "", + work_number: "", + request_number: "", + request_date: "", + report_date: "", + }; + + const { + control, + register, + handleSubmit, + setValue, + formState: {isSubmitting, errors, touchedFields}, + } = useForm({defaultValues, resolver: yupResolver(validationSchema), mode: "onBlur"}); + + const onSubmit = async (data) => { + console.log("data", data); + const formData = new FormData(); + formData.append("lat", mapBoxData.lat); + formData.append("lng", mapBoxData.lng); + formData.append("azmayesh_type_id", data.azmayesh_type_id); + formData.append("azmayesh_type_name", data.azmayesh_type_name); + formData.append("province_id", data.province_id); + formData.append("province_name", data.province_name); + formData.append("project_name", data.project_name); + formData.append("employer", data.employer); + formData.append("consultant", data.consultant); + formData.append("contractor", data.contractor); + formData.append("applicant", data.applicant); + formData.append("work_number", data.work_number); + formData.append("request_number", data.request_number); + formData.append("request_date", moment(data.request_date).format("YYYY-MM-DD")); + formData.append("report_date", moment(data.report_date).format("YYYY-MM-DD")); + + for (var pair of formData.entries()) { + console.log(pair[0] + ', ' + pair[1]); + } + + requestServer(POST_TEST, "post", { + data: formData, + }) + .then(() => { + handleClose(); + }) + .catch(() => { + }); + }; + + return ( + + + + } label="انتخاب محل آزمایش"> + } label="مشخصات آزمایش"> + + + + + + + + + + + {!isMobile && ( + + + + )} + + + + { + tabState === 0 ? : + } + + + + ); +}; +export default CreateDialog; diff --git a/src/components/dashboard/test/Actions/create/index.jsx b/src/components/dashboard/test/Actions/create/index.jsx new file mode 100644 index 0000000..9d59d00 --- /dev/null +++ b/src/components/dashboard/test/Actions/create/index.jsx @@ -0,0 +1,33 @@ +"use client"; + +import {Button, IconButton, useMediaQuery} from "@mui/material"; +import {useTheme} from "@emotion/react"; +import {useState} from "react"; +import {AddCircle} from "@mui/icons-material"; +import CreateDialog from "./CreateDialog"; + +const TestCreate = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const [open, setOpen] = useState(false); + + const handleOpen = () => { + setOpen(true); + }; + + return ( + <> + {isMobile ? ( + + + + ) : ( + + )} + {open && } + + ); +}; +export default TestCreate; diff --git a/src/components/dashboard/test/ShowLocation/ShowLocationMarker.jsx b/src/components/dashboard/test/ShowLocation/ShowLocationMarker.jsx new file mode 100644 index 0000000..6b65250 --- /dev/null +++ b/src/components/dashboard/test/ShowLocation/ShowLocationMarker.jsx @@ -0,0 +1,105 @@ +"use client"; + +import {Marker, useMap} from "react-leaflet"; +import {useEffect, useRef} from "react"; +import L from "leaflet"; +import TestActiveIcon from "@/assets/images/examine_marker_active.png"; +import {Box, FormControl, InputAdornment, InputLabel, OutlinedInput, Stack, useMediaQuery} from "@mui/material"; +import VerifiedIcon from '@mui/icons-material/Verified'; +import {useTheme} from "@emotion/react"; + +const ShowLocationMarker = ({lat, lng}) => { + const map = useMap(); + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + + const mapTestMarker = useRef(); + const defaultIconSize = [35, 35]; + const createCustomIcon = (size, iconUrl) => { + return L.icon({ + iconUrl: iconUrl, + iconSize: size, + iconAnchor: [size[0] / 2, size[1]], + popupAnchor: [0, -size[1]] + }); + }; + + useEffect(() => { + map.flyTo({lat: lat, lng: lng}, 14); + }, []); + + + return ( + <> + + + + + + طول جغرافیایی + + + + + } + label="طول جغرافیایی" + /> + + + + عرض جغرافیایی + + + + + } + label="عرض جغرافیایی" + /> + + + + + ); +}; + +export default ShowLocationMarker; \ No newline at end of file diff --git a/src/components/dashboard/test/ShowLocation/index.jsx b/src/components/dashboard/test/ShowLocation/index.jsx new file mode 100644 index 0000000..557a780 --- /dev/null +++ b/src/components/dashboard/test/ShowLocation/index.jsx @@ -0,0 +1,50 @@ +"use client"; + +import ExploreIcon from "@mui/icons-material/Explore"; +import {Box, Button, Dialog, DialogActions, DialogContent, IconButton} from "@mui/material"; +import {useState} from "react"; +import dynamic from "next/dynamic"; +import MapLoading from "@/core/components/MapLayer/Loading"; +import ShowLocationMarker from "./ShowLocationMarker"; + +const MapLayer = dynamic(() => import("@/core/components/MapLayer"), { + loading: () => , + ssr: false, +}); + +const ShowLocation = ({lat, lng}) => { + const [openShowLocationModal, setOpenShowLocationModal] = useState(false); + + const handleOpenShowLocationModal = () => { + setOpenShowLocationModal(true); + }; + + const handleCloseShowLocationModal = () => { + setOpenShowLocationModal(false); + }; + + return ( + + + + + + + + + + + + + + + + ); +}; +export default ShowLocation; diff --git a/src/components/dashboard/test/TestList.jsx b/src/components/dashboard/test/TestList.jsx new file mode 100644 index 0000000..2c735f4 --- /dev/null +++ b/src/components/dashboard/test/TestList.jsx @@ -0,0 +1,135 @@ +"use client"; + +import {useMemo} from "react"; +import {Box, Typography} from "@mui/material"; +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import Toolbar from "./Toolbar"; +import {GET_AZMAYESH_LIST} from "@/core/utils/routes"; +import moment from "jalali-moment"; +import ShowLocation from "./ShowLocation"; + +const TestList = () => { + const columns = useMemo( + () => [ + { + accessorKey: "id", + header: "کد یکتا", + id: "id", + enableColumnFilter: false, + datatype: "text", + filterFn: "notEquals", + }, + { + accessorKey: "azmayesh_type_name", + header: "نوع آزمایش", + id: "azmayesh_type_name", + enableColumnFilter: false, + datatype: "text", + filterFn: "notEquals", + }, + { + accessorKey: "project_name", + header: "پروژه", + id: "project_name", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "lat", + header: "نمایش مختصات", + id: "lat", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + Cell: ({row}) => (), + }, + { + accessorKey: "employer", + header: "کارفرما", + id: "employer", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "consultant", + header: "مشاور", + id: "consultant", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "contractor", + header: "پیمانکار", + id: "contractor", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "applicant", + header: "متقاضی", + id: "applicant", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "work_number", + header: "شماره کار", + id: "work_number", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "request_number", + header: "شماره درخواست", + id: "request_number", + enableColumnFilter: false, + datatype: "text", + filterFn: "equals", + }, + { + accessorKey: "request_date", + header: "تاریخ درخواست", + id: "request_date", + enableColumnFilter: false, + datatype: "date", + filterFn: "equals", + Cell: ({renderedCellValue}) => ({moment(renderedCellValue).locale("fa").format("YYYY/MM/DD")}), + }, + { + accessorKey: "report_date", + header: "تاریخ گزارش", + id: "report_date", + enableColumnFilter: false, + datatype: "date", + filterFn: "equals", + Cell: ({renderedCellValue}) => ({moment(renderedCellValue).locale("fa").format("YYYY/MM/DD")}), + }, + ], + [] + ); + + return ( + <> + + + + + ); +}; +export default TestList; diff --git a/src/components/dashboard/test/Toolbar.jsx b/src/components/dashboard/test/Toolbar.jsx new file mode 100644 index 0000000..8aaa0a9 --- /dev/null +++ b/src/components/dashboard/test/Toolbar.jsx @@ -0,0 +1,10 @@ +import TestCreate from "./Actions/Create"; + +const Toolbar = ({mutate}) => { + return ( + <> + + + ); +}; +export default Toolbar; diff --git a/src/components/dashboard/test/index.jsx b/src/components/dashboard/test/index.jsx new file mode 100644 index 0000000..d2503a0 --- /dev/null +++ b/src/components/dashboard/test/index.jsx @@ -0,0 +1,15 @@ +"use client"; + +import PageTitle from "@/core/components/PageTitle"; +import {Stack} from "@mui/material"; +import TestList from "./TestList"; + +const TestPage = () => { + return ( + + + + + ); +}; +export default TestPage; diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js index 7ab77de..1f9100c 100644 --- a/src/core/utils/pageMenu.js +++ b/src/core/utils/pageMenu.js @@ -18,6 +18,7 @@ import EngineeringIcon from "@mui/icons-material/Engineering"; import ReportIcon from "@mui/icons-material/Report"; import AssignmentLateIcon from "@mui/icons-material/AssignmentLate"; import LineAxisIcon from "@mui/icons-material/LineAxis"; +import ScienceIcon from '@mui/icons-material/Science'; export const pageMenu = [ { @@ -25,7 +26,7 @@ export const pageMenu = [ label: "پیشخوان", type: "page", route: "/dashboard", - icon: , + icon: , permissions: ["all"], }, { @@ -33,14 +34,14 @@ export const pageMenu = [ label: "مدیریت کاربران", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/user_management", - icon: , + icon: , permissions: ["full-user-management", "limited-user-management"], }, { id: "projectsManagment", label: "پروژه های راهداری", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -48,7 +49,7 @@ export const pageMenu = [ label: "ثبت قرارداد و پروژه", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/rahdari_projects/finance", - icon: , + icon: , permissions: ["show-contract", "show-contract-province"], }, { @@ -56,7 +57,7 @@ export const pageMenu = [ label: "لیست پروژه ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/rahdari_projects/projects_list", - icon: , + icon: , permissions: ["all"], }, { @@ -64,7 +65,7 @@ export const pageMenu = [ label: "پروژه های پیشنهادی", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/rahdari_projects/proposal", - icon: , + icon: , permissions: ["show-proposal", "show-proposal-province"], }, { @@ -72,7 +73,7 @@ export const pageMenu = [ label: "درخواست نمایندگان", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/rahdari_projects/lawmakers", - icon: , + icon: , permissions: ["show-lawmaker", "show-lawmaker-province"], }, { @@ -80,7 +81,7 @@ export const pageMenu = [ label: "پراکندگی بر روی نقشه", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=rahdari_projects", - icon: , + icon: , permissions: ["all"], }, ], @@ -89,7 +90,7 @@ export const pageMenu = [ id: "roadItemManagment", label: "فعالیت های روزانه", type: "menu", - icon: , + icon: , hasSubitems: true, badges: ["road_items.total"], Subitems: [ @@ -97,7 +98,7 @@ export const pageMenu = [ id: "roadItemManagmentSupervisor", label: "ارزیابی", type: "menu", - icon: , + icon: , hasSubitems: true, badges: ["road_items.supervise_cnt"], Subitems: [ @@ -117,7 +118,7 @@ export const pageMenu = [ id: "roadItemManagmentOparation", label: "عملیات", type: "menu", - icon: , + icon: , hasSubitems: true, badges: ["road_items.operation_cnt"], Subitems: [ @@ -142,7 +143,7 @@ export const pageMenu = [ label: "پراکندگی بر روی نقشه", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=road_items", - icon: , + icon: , permissions: [ "show-road-item-supervise-cartable", "show-road-item-supervise-cartable-province", @@ -154,7 +155,7 @@ export const pageMenu = [ label: "گزارش ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_items/report", - icon: , + icon: , permissions: [ "show-road-item-supervise-cartable", "show-road-item-supervise-cartable-province", @@ -167,7 +168,7 @@ export const pageMenu = [ id: "roadPatrolManagment", label: "گشت راهداری و ترابری", type: "menu", - icon: , + icon: , hasSubitems: true, badges: ["road_patrols.total"], Subitems: [ @@ -175,7 +176,7 @@ export const pageMenu = [ id: "roadPatrolManagmentSupervisor", label: "ارزیابی", type: "menu", - icon: , + icon: , hasSubitems: true, badges: ["road_patrols.supervise_cnt"], Subitems: [ @@ -195,7 +196,7 @@ export const pageMenu = [ id: "roadPatrolManagmentOparation", label: "عملیات", type: "menu", - icon: , + icon: , hasSubitems: true, badges: ["road_patrols.operation_cnt"], Subitems: [ @@ -220,7 +221,7 @@ export const pageMenu = [ label: "پراکندگی بر روی نقشه", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=road_patrols", - icon: , + icon: , permissions: [ "add-road-patrol", "show-road-patrol-supervise-cartable", @@ -232,7 +233,7 @@ export const pageMenu = [ label: "گزارش ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_patrols/report", - icon: , + icon: , permissions: [ "add-road-patrol", "show-road-patrol-supervise-cartable", @@ -245,7 +246,7 @@ export const pageMenu = [ id: "inquiryPrivacyManagment", label: "استعلام حریم راه", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -282,7 +283,7 @@ export const pageMenu = [ id: "safetyAndPrivacyManagment", label: "نگهداری حریم راه", type: "menu", - icon: , + icon: , hasSubitems: true, badges: ["safety_and_privacy.step_one", "safety_and_privacy.step_two"], Subitems: [ @@ -290,7 +291,7 @@ export const pageMenu = [ id: "safetyAndPrivacyManagmentOparation", label: "عملیات", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -318,7 +319,7 @@ export const pageMenu = [ label: "پراکندگی بر روی نقشه", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=safety_and_privacy", - icon: , + icon: , permissions: [ "show-safety-and-privacy-operator-cartable", "show-safety-and-privacy-operator-cartable-province", @@ -331,7 +332,7 @@ export const pageMenu = [ label: "گزارش ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/safety_and_privacy/report", - icon: , + icon: , permissions: [ "show-safety-and-privacy-operator-cartable", "show-safety-and-privacy-operator-cartable-province", @@ -345,7 +346,7 @@ export const pageMenu = [ id: "roadObservationsManagment", label: "واکنش سریع", type: "menu", - icon: , + icon: , hasSubitems: true, badges: ["road_observations.total"], Subitems: [ @@ -353,7 +354,7 @@ export const pageMenu = [ id: "roadObservationsManagmentSupervisor", label: "ارزیابی", type: "menu", - icon: , + icon: , hasSubitems: true, badges: ["road_observations.supervise_cnt"], Subitems: [ @@ -371,14 +372,14 @@ export const pageMenu = [ label: "رسیدگی به شکایات", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_observations", - icon: , + icon: , permissions: ["show-fast-react", "show-fast-react-province", "show-fast-react-edarate-shahri"], }, { id: "roadObservationsManagmentOparation", label: "عملیات", type: "menu", - icon: , + icon: , hasSubitems: true, badges: ["road_observations.operation_cnt"], Subitems: [ @@ -396,7 +397,7 @@ export const pageMenu = [ label: "پراکندگی بر روی نقشه", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=road_observations", - icon: , + icon: , permissions: ["all"], }, { @@ -404,7 +405,7 @@ export const pageMenu = [ label: "گزارش ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_observations/report/index", - icon: , + icon: , permissions: ["all"], }, ], @@ -413,7 +414,7 @@ export const pageMenu = [ id: "winterCampManagment", label: "قرارگاه زمستانی", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -421,7 +422,7 @@ export const pageMenu = [ label: "محور های انسدادی", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/winter_camp", - icon: , + icon: , permissions: ["show-camp", "show-camp-province"], }, { @@ -429,7 +430,7 @@ export const pageMenu = [ label: "محور های حلقه اول", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=camp", - icon: , + icon: , permissions: ["show-camp", "show-camp-province"], }, { @@ -437,7 +438,7 @@ export const pageMenu = [ label: "گزارش ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=campNew", - icon: , + icon: , permissions: ["show-camp", "show-camp-province"], }, ], @@ -446,14 +447,14 @@ export const pageMenu = [ id: "receiptManagment", label: "خسارات وارده بر ابنیه فنی و تاسیسات راه", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { id: "receiptManagmentOparation", label: "عملیات", type: "menu", - icon: , + icon: , hasSubitems: true, Subitems: [ { @@ -470,9 +471,17 @@ export const pageMenu = [ label: "گزارش ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/receipt/report", - icon: , + icon: , permissions: ["all"], }, ], }, + { + id: "test", + label: "آزمایشات", + type: "page", + route: "/dashboard/test", + icon: , + permissions: ["all"], + }, ]; diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index 14bf801..0e60709 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -12,3 +12,6 @@ export const GET_CITY_LISTS = "/v3/api/fake-cities"; export const GET_PROVINCE_LISTS = "/v3/api/fake-provinces"; export const GET_PREV_STATE_OPINION = "/v3/api/fake-prev-state-opinion"; export const SUBMIT_ROAD_SAFETY_FORM = "/v3/api/fake-submit"; +export const POST_TEST = api + "/api/v3/azmayeshes/store"; +export const GET_TESTS_LIST = api + "/api/v3/azmayesh_types"; +export const GET_AZMAYESH_LIST = api + "/api/v3/azmayeshes"; diff --git a/src/lib/hooks/useProvince.js b/src/lib/hooks/useProvince.js index a21744b..7a058f6 100644 --- a/src/lib/hooks/useProvince.js +++ b/src/lib/hooks/useProvince.js @@ -1,6 +1,5 @@ -import { useState, useEffect } from "react"; -import axios from "axios"; -import { GET_PROVINCE_LISTS } from "@/core/utils/routes"; +import {useEffect, useState} from "react"; +import {GET_PROVINCE_LISTS} from "@/core/utils/routes"; import useRequest from "@/lib/hooks/useRequest"; const useProvinces = () => { @@ -25,7 +24,7 @@ const useProvinces = () => { fetchCities(); // Call the fetch function }, []); // Empty dependency array to ensure it only runs once - return { provinces, loadingProvinces, errorProvinces }; + return {provinces, loadingProvinces, errorProvinces}; }; export default useProvinces; diff --git a/src/lib/hooks/useTest.js b/src/lib/hooks/useTest.js new file mode 100644 index 0000000..ea1a386 --- /dev/null +++ b/src/lib/hooks/useTest.js @@ -0,0 +1,30 @@ +import {useEffect, useState} from "react"; +import {GET_TESTS_LIST} from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; + +const useTest = () => { + const requestServer = useRequest(); + const [tests, setTests] = useState([]); + const [loadingTests, setLoadingTests] = useState(true); + const [errorTests, setErrorTests] = useState(null); + + useEffect(() => { + const fetchTests = async () => { + try { + const response = await requestServer(`${GET_TESTS_LIST}`); + setTests(response.data.data); + setLoadingTests(false); + } catch (e) { + console.error("Error fetching tests types:", e); + setErrorTests(e); + setLoadingTests(false); + } + }; + + fetchTests(); + }, []); + + return {tests, loadingTests, errorTests}; +}; + +export default useTest; From b6f0e96bcf2909261ae3bd7def04a4272416f47f Mon Sep 17 00:00:00 2001 From: Amirhossein Mahmoodi Date: Sat, 26 Oct 2024 09:08:53 +0330 Subject: [PATCH 31/31] change version --- .env.local.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.local.example b/.env.local.example index 898913f..99ed3dd 100644 --- a/.env.local.example +++ b/.env.local.example @@ -1,3 +1,3 @@ -NEXT_PUBLIC_VERSION="0.6.1" +NEXT_PUBLIC_VERSION="0.7.0" NEXT_PUBLIC_API_URL="https://rms.witel.ir" NEXT_PUBLIC_MAPTILE_ENDPOINT="https://rmsmap.rmto.ir/141map" \ No newline at end of file