diff --git a/bun.lock b/bun.lock index d9dcee17..8f2fcf2f 100644 --- a/bun.lock +++ b/bun.lock @@ -19,7 +19,7 @@ "@mantine/tiptap": "^7.5.3", "@prisma/client": "^6.3.0", "@react-pdf/renderer": "^3.4.4", - "@tabler/icons-react": "^2.38.0", + "@tabler/icons-react": "^3.31.0", "@tiptap/extension-highlight": "^2.2.3", "@tiptap/extension-link": "^2.2.3", "@tiptap/extension-subscript": "^2.2.3", @@ -919,9 +919,9 @@ "@swc/helpers": ["@swc/helpers@0.5.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw=="], - "@tabler/icons": ["@tabler/icons@2.47.0", "", {}, "sha512-4w5evLh+7FUUiA1GucvGj2ReX2TvOjEr4ejXdwL/bsjoSkof6r1gQmzqI+VHrE2CpJpB3al7bCTulOkFa/RcyA=="], + "@tabler/icons": ["@tabler/icons@3.31.0", "", {}, "sha512-dblAdeKY3+GA1U+Q9eziZ0ooVlZMHsE8dqP0RkwvRtEsAULoKOYaCUOcJ4oW1DjWegdxk++UAt2SlQVnmeHv+g=="], - "@tabler/icons-react": ["@tabler/icons-react@2.47.0", "", { "dependencies": { "@tabler/icons": "2.47.0", "prop-types": "^15.7.2" }, "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0" } }, "sha512-iqly2FvCF/qUbgmvS8E40rVeYY7laltc5GUjRxQj59DuX0x/6CpKHTXt86YlI2whg4czvd/c8Ce8YR08uEku0g=="], + "@tabler/icons-react": ["@tabler/icons-react@3.31.0", "", { "dependencies": { "@tabler/icons": "3.31.0" }, "peerDependencies": { "react": ">= 16" } }, "sha512-2rrCM5y/VnaVKnORpDdAua9SEGuJKVqPtWxeQ/vUVsgaUx30LDgBZph7/lterXxDY1IKR6NO//HDhWiifXTi3w=="], "@tiptap/core": ["@tiptap/core@2.11.5", "", { "peerDependencies": { "@tiptap/pm": "^2.7.0" } }, "sha512-jb0KTdUJaJY53JaN7ooY3XAxHQNoMYti/H6ANo707PsLXVeEqJ9o8+eBup1JU5CuwzrgnDc2dECt2WIGX9f8Jw=="], diff --git a/package.json b/package.json index 565a3b91..3ff55e76 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@mantine/tiptap": "^7.5.3", "@prisma/client": "^6.3.0", "@react-pdf/renderer": "^3.4.4", - "@tabler/icons-react": "^2.38.0", + "@tabler/icons-react": "^3.31.0", "@tiptap/extension-highlight": "^2.2.3", "@tiptap/extension-link": "^2.2.3", "@tiptap/extension-subscript": "^2.2.3", diff --git a/run.env.start.dev b/run.env.start.dev index 0ca14666..9dacda79 100644 --- a/run.env.start.dev +++ b/run.env.start.dev @@ -1 +1 @@ -bun --env-file=.env run --bun start -p 3005 \ No newline at end of file +bun --env-file=.env run --bun start -p 3000 \ No newline at end of file diff --git a/src/app/api/validation/route.ts b/src/app/api/validation/route.ts index ac7000f8..5b1b20b0 100644 --- a/src/app/api/validation/route.ts +++ b/src/app/api/validation/route.ts @@ -2,7 +2,6 @@ import { NextResponse } from "next/server"; export async function GET(req: Request) { const token = req.headers.get("Authorization")?.split(" ")[1]; - console.log("Token received in API Validation:", token, `<<<<<<<<<<<<<<<`); if (!token) return NextResponse.json({ success: false }, { status: 401 }); diff --git a/src/app/dev/admin/layout.tsx b/src/app/dev/admin/layout.tsx index b267ac9e..d3654286 100644 --- a/src/app/dev/admin/layout.tsx +++ b/src/app/dev/admin/layout.tsx @@ -6,6 +6,7 @@ import adminNotifikasi_getByUserId from "@/app_modules/admin/notifikasi/fun/get/ import React from "react"; import versionUpdate from "../../../../package.json"; import { redirect } from "next/navigation"; +import { Admin_V3_MainLayout } from "@/app_modules/admin/_components_v3/main_layout"; export default async function Layout({ children, @@ -15,24 +16,33 @@ export default async function Layout({ const userLoginId = await funGetUserIdByToken(); const version = versionUpdate.version; - const dataUser = await funGlobal_getUserById({ - userId: userLoginId as string, - }); - const listNotifikasi = await adminNotifikasi_getByUserId({ page: 1 }); - const countNotifikasi = await adminNotifikasi_countNotifikasi(); - - if (dataUser?.masterUserRoleId == "1") return redirect("/dev/home"); + // const listNotifikasi = await adminNotifikasi_getByUserId({ page: 1 }); + // const countNotifikasi = await adminNotifikasi_countNotifikasi(); + + // const dataUser = await funGlobal_getUserById({ + // userId: userLoginId as string, + // }); + // if (dataUser?.masterUserRoleId == "1") return redirect("/dev/home"); return ( <> - {children} - + */} + + + {children} + ); } diff --git a/src/app/dev/admin/main/dashboard/page.tsx b/src/app/dev/admin/main/dashboard/page.tsx index 51820acf..d7f84c83 100644 --- a/src/app/dev/admin/main/dashboard/page.tsx +++ b/src/app/dev/admin/main/dashboard/page.tsx @@ -1,11 +1,6 @@ import { AdminMain } from "@/app_modules/admin/main_dashboard"; -import { AdminMainDashboard_CountPOrtofolio } from "@/app_modules/admin/main_dashboard/fun/count/fun_count_portofolio"; -import { AdminMainDashboard_CountUser } from "@/app_modules/admin/main_dashboard/fun/count/fun_count_user"; export default async function Page() { - // const countUser = await AdminMainDashboard_CountUser(); - // const countPorto = await AdminMainDashboard_CountPOrtofolio(); - // await new Promise((a, b) => { // setTimeout(a, 4000); // }); diff --git a/src/app_modules/admin/_admin_global/_component/comp_admin_modal.tsx b/src/app_modules/admin/_admin_global/_component/comp_admin_modal.tsx index e7f626f7..53025c56 100644 --- a/src/app_modules/admin/_admin_global/_component/comp_admin_modal.tsx +++ b/src/app_modules/admin/_admin_global/_component/comp_admin_modal.tsx @@ -1,6 +1,5 @@ import { AdminColor } from "@/app_modules/_global/color/color_pallet"; import { Modal } from "@mantine/core"; -import { reject } from "lodash"; export function Admin_ComponentModal({ children, @@ -15,7 +14,7 @@ export function Admin_ComponentModal({ opened: boolean; onClose: () => void; size?: "sm" | "md" | "lg" | "xl"; - title: any; + title?: any; withCloseButton?: boolean | undefined; closeOnClickOutside?: boolean | undefined; }) { diff --git a/src/app_modules/admin/_admin_global/_component/comp_button_user_on_navbar.tsx b/src/app_modules/admin/_admin_global/_component/comp_button_user_on_navbar.tsx index 8fb64a80..0f8e5a2f 100644 --- a/src/app_modules/admin/_admin_global/_component/comp_button_user_on_navbar.tsx +++ b/src/app_modules/admin/_admin_global/_component/comp_button_user_on_navbar.tsx @@ -37,7 +37,7 @@ export function Admin_ComponentButtonUserCircle({ async function onClickLogout() { setLoadingLogout(true); - const res = await fetch(`/api/auth/logout?id=${dataUser.id}`, { + const res = await fetch(`/api/auth/logout?id=${dataUser?.id}`, { method: "GET", }); @@ -69,7 +69,7 @@ export function Admin_ComponentButtonUserCircle({ - {dataUser.username} + {dataUser?.username} @@ -78,7 +78,7 @@ export function Admin_ComponentButtonUserCircle({ - +{dataUser.nomor} + +{dataUser?.nomor} @@ -208,7 +208,7 @@ export function Admin_ComponentButtonUserCircle({ - {dataUser.username} + {dataUser?.username} @@ -218,7 +218,7 @@ export function Admin_ComponentButtonUserCircle({ - +{dataUser.nomor} + +{dataUser?.nomor} diff --git a/src/app_modules/admin/_admin_global/_ui/ui_navbar_admin.tsx b/src/app_modules/admin/_admin_global/_ui/ui_navbar_admin.tsx index d71b65f8..9669cd7c 100644 --- a/src/app_modules/admin/_admin_global/_ui/ui_navbar_admin.tsx +++ b/src/app_modules/admin/_admin_global/_ui/ui_navbar_admin.tsx @@ -14,7 +14,7 @@ export default function Admin_UiNavbar({ setActiveId, setActiveChildId, }: { - userRoleId: string; + userRoleId: string | null; activeId: string; activeChildId: string; setActiveId: (val: any) => void; @@ -199,5 +199,5 @@ export default function Admin_UiNavbar({ )); - return userRoleId == "2" ? adminNavbar : developerNavbar; + return userRoleId == "3" ? developerNavbar : adminNavbar; } diff --git a/src/app_modules/admin/_admin_global/header_tamplate.tsx b/src/app_modules/admin/_admin_global/header_tamplate.tsx index c6ea426a..97039054 100644 --- a/src/app_modules/admin/_admin_global/header_tamplate.tsx +++ b/src/app_modules/admin/_admin_global/header_tamplate.tsx @@ -1,13 +1,13 @@ "use client"; import { AdminColor } from "@/app_modules/_global/color/color_pallet"; -import { Divider, Stack, Title } from "@mantine/core"; +import { Stack, Title } from "@mantine/core"; export default function ComponentAdminGlobal_HeaderTamplate({name}: {name: string}) { return ( <> - {name ? name : null} + {name ? name : null} ); diff --git a/src/app_modules/admin/_components_v3/comp_button_user_circle.tsx b/src/app_modules/admin/_components_v3/comp_button_user_circle.tsx new file mode 100644 index 00000000..e18bebaf --- /dev/null +++ b/src/app_modules/admin/_components_v3/comp_button_user_circle.tsx @@ -0,0 +1,257 @@ +"use client"; + +import { AccentColor } from "@/app_modules/_global/color"; +import { ComponentGlobal_NotifikasiBerhasil } from "@/app_modules/_global/notif_global"; +import { MODEL_USER } from "@/app_modules/home/model/interface"; +import { Warna } from "@/lib/warna"; +import { + ActionIcon, + Button, + Center, + Divider, + Group, + Popover, + SimpleGrid, + Stack, + Text, + Title +} from "@mantine/core"; +import { + IconBell, + IconHierarchy2, + IconLogout, + IconReplaceUser, + IconUser, + IconUserCircle +} from "@tabler/icons-react"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import { Admin_ComponentModal } from "../_admin_global/_component/comp_admin_modal"; + +export function Admin_V3_ComponentButtonUserCircle({ + dataUser, +}: { + dataUser: MODEL_USER | null; +}) { + const router = useRouter(); + const [isOpenMenuUser, setOpenMenuUser] = useState(false); + const [openPop, setOpenPop] = useState(false); + const [openModalLogout, setOpenModalLogout] = useState(false); + const [openModalReplaceUser, setOpenModalReplaceUser] = useState(false); + const [loadingLogout, setLoadingLogout] = useState(false); + const [loadingReplaceUser, setLoadingReplaceUser] = useState(false); + + const listMenu = [ + { + icon: IconUser, + label: dataUser?.username, + }, + { + icon: IconHierarchy2, + label: + dataUser?.masterUserRoleId == "2" + ? "Admin " + : dataUser?.masterUserRoleId == "3" + ? "Super Admin" + : "", + }, + ]; + + const listAction = [ + { + icon: IconBell, + label: "Notifikasi", + color: "", + onClick: () => console.log("Notifikasi"), + }, + { + icon: IconReplaceUser, + label: "Tampilan user", + color: "", + onClick: () => setOpenModalReplaceUser(true), + }, + { + icon: IconLogout, + label: "Logout", + color: "red", + onClick: () => setOpenModalLogout(true), + }, + ]; + + async function onClickLogout() { + setLoadingLogout(true); + const res = await fetch(`/api/auth/logout?id=${dataUser?.id}`, { + method: "GET", + }); + + const result = await res.json(); + if (res.status === 200) { + ComponentGlobal_NotifikasiBerhasil(result.message); + router.push("/", { scroll: false }); + } + } + + return ( + <> + + + { + setOpenPop((o) => !o); + }} + > + + + + + + + {listMenu.map((e, i) => ( + + + {e.label} + + ))} + + + + + {listAction.map((e, i) => ( +
+ + + +
+ ))} +
+ + {/* + + + */} +
+
+
+ + {/* setOpenModal(false)} + centered + withCloseButton={false} + closeOnClickOutside={false} + > + + Anda yakin ingin keluar ? + + + + + + */} + + setOpenModalLogout(false)} + withCloseButton={false} + closeOnClickOutside={false} + > + + + Anda yakin ingin keluar ? + + + + + + + + + setOpenModalReplaceUser(false)} + withCloseButton={false} + closeOnClickOutside={false} + > + + + Anda yakin ingin keluar ? + + + + + + + + + ); +} diff --git a/src/app_modules/admin/_components_v3/main_layout.tsx b/src/app_modules/admin/_components_v3/main_layout.tsx new file mode 100644 index 00000000..c1d5c244 --- /dev/null +++ b/src/app_modules/admin/_components_v3/main_layout.tsx @@ -0,0 +1,213 @@ +"use client"; + +import { AccentColor, MainColor } from "@/app_modules/_global/color"; +import { apiGetUserById } from "@/app_modules/_global/lib/api_user"; +import { MODEL_USER } from "@/app_modules/home/model/interface"; +import { MODEL_NOTIFIKASI } from "@/app_modules/notifikasi/model/interface"; +import { gs_admin_ntf } from "@/lib/global_state"; +import { + AppShell, + Burger, + Divider, + Group, + Header, + MediaQuery, + Navbar, + ScrollArea, + Stack, + Text, + useMantineTheme +} from "@mantine/core"; +import { useDisclosure, useShallowEffect } from "@mantine/hooks"; +import { + IconBriefcase, + IconCoin, + IconHome, + IconMessage, + IconUser +} from "@tabler/icons-react"; +import { useAtom } from "jotai"; +import { usePathname, useRouter } from "next/navigation"; +import type React from "react"; +import { useState } from "react"; +import { + Admin_UiNavbar +} from "../_admin_global"; +import { + gs_admin_navbar_menu, + gs_admin_navbar_subMenu, +} from "../_admin_global/new_global_state"; +import { Admin_V3_ComponentButtonUserCircle } from "./comp_button_user_circle"; + +export function Admin_V3_MainLayout({ + children, + userLoginId, + countNotifikasi, + listNotifikasi, + version, +}: { + children: React.ReactNode; + userLoginId: string; + countNotifikasi: number; + listNotifikasi: MODEL_NOTIFIKASI[]; + version: string; +}) { + const router = useRouter(); + const [dataUser, setDataUser] = useState(null); + const userRoleId = dataUser?.masterUserRoleId; + const [activeId, setActiveId] = useAtom(gs_admin_navbar_menu); + const [activeChildId, setActiveChildId] = useAtom(gs_admin_navbar_subMenu); + const [dataNotifikasi, setDataNotifikasi] = + useState(listNotifikasi); + + // Notifikasi + const [isDrawerNotifikasi, setDrawerNotifikasi] = useState(false); + const [countNtf, setCountNtf] = useState(countNotifikasi); + const [newAdminNtf, setNewAdminNtf] = useAtom(gs_admin_ntf); + + useShallowEffect(() => { + handleLoadUser(); + }, []); + + async function handleLoadUser() { + try { + const response = await apiGetUserById({ id: userLoginId }); + if (response && response.success) { + setDataUser(response.data); + } else { + console.error("Failed to fetch user data", response); + setDataUser(null); + } + } catch (error) { + console.error("Error fetching user data", error); + } + } + + const [opened, { toggle, close }] = useDisclosure(false); + + + return ( + + ); +} diff --git a/src/app_modules/admin/main_dashboard/main/view.tsx b/src/app_modules/admin/main_dashboard/main/view.tsx index 8acc4b4c..f16fdfe7 100644 --- a/src/app_modules/admin/main_dashboard/main/view.tsx +++ b/src/app_modules/admin/main_dashboard/main/view.tsx @@ -16,10 +16,10 @@ export default function AdminMain() { const [countUser, setCountUser] = useState(null); const [countPortofolio, setCountPortofolio] = useState(null); - useShallowEffect(() => { - onLoadDataUser(); - onLoadDataPortofolio(); - }, []); + // useShallowEffect(() => { + // onLoadDataUser(); + // onLoadDataPortofolio(); + // }, []); async function onLoadDataUser() { try { diff --git a/src/app_modules/admin/splash/splash.tsx b/src/app_modules/admin/splash/splash.tsx index 5e8fd71b..8103ded7 100644 --- a/src/app_modules/admin/splash/splash.tsx +++ b/src/app_modules/admin/splash/splash.tsx @@ -11,6 +11,7 @@ import { gs_admin_navbar_subMenu, } from "../_admin_global/new_global_state"; import { IAdmin_ActivePage } from "../notifikasi/route_setting/type_of_select_page"; +import { AccentColor } from "@/app_modules/_global/color"; export default function SplashDashboardAdmin() { const router = useRouter(); @@ -28,7 +29,7 @@ export default function SplashDashboardAdmin() { <>
- Welcome Admin + Welcome Admin Logo