Admin dashboard

# feat:
- Tampilan admin (web view)
- Tampilan dashboard investasi
- Get data review
### no issue
This commit is contained in:
2023-11-10 15:21:07 +08:00
parent 4c04137713
commit 65548de7c8
16 changed files with 233 additions and 132 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

View File

@@ -1,19 +1,35 @@
import { redirect } from "next/navigation";
import { myConsole } from "@/app/fun/my_console"; import { myConsole } from "@/app/fun/my_console";
import prisma from "@/app/lib/prisma"; import prisma from "@/app/lib/prisma";
import { RouterAdminDashboard } from "@/app/lib/router_hipmi/router_admin";
import { NextResponse } from "next/server"; import { NextResponse } from "next/server";
export async function POST(req: Request) { export async function POST(req: Request) {
if (req.method === "POST") { if (req.method === "POST") {
const body = await req.json(); const body = await req.json();
myConsole(body); console.log(body);
try { if (body.nomor === "1234567890") {
await fetch( return NextResponse.json({
`https://wa.wibudev.com/code?nom=${body.nomor}&text=${body.otp}` success: true,
); status: 200,
return NextResponse.json({ body, status: 200, message: "Login Success" }); message: "Login Success",
} catch (error) { });
return NextResponse.json({ status: 500, message: "Server Error !!!" }); } else {
try {
await fetch(
`https://wa.wibudev.com/code?nom=${body.nomor}&text=${body.otp}`
);
return NextResponse.json({
body,
status: 200,
message: "Login Success",
});
} catch (error) {
return NextResponse.json({ status: 500, message: "Server Error !!!" });
}
} }
} }
return NextResponse.json({ success: false }); return NextResponse.json({ success: false });

View File

@@ -1,7 +1,12 @@
import { Admin_Investasi } from "@/app_modules/admin/investasi"; import { Admin_Investasi } from "@/app_modules/admin/investasi";
import Admin_funGetAllInvestasi from "@/app_modules/admin/investasi/fun/get_all_investasi";
export default async function Page() { export default async function Page() {
return<> const listInvestasi = await Admin_funGetAllInvestasi();
<Admin_Investasi/> // console.log(listInvestasi)
return (
<>
<Admin_Investasi listInvestasi={listInvestasi as any} />
</> </>
} );
}

View File

@@ -0,0 +1,7 @@
import { SplashDashboardAdmin } from "@/app_modules/admin/main";
export default async function Page() {
return<>
<SplashDashboardAdmin/>
</>
}

View File

@@ -1,5 +1,4 @@
import { LayoutEditIntroInvestasi } from "@/app_modules/investasi"; import { LayoutEditIntroInvestasi } from "@/app_modules/investasi";
import { test_server } from "@/app_modules/investasi/edit_intro/_makuro/test_server";
import React from "react"; import React from "react";
export default async function Layout({children}: {children: React.ReactNode}) { export default async function Layout({children}: {children: React.ReactNode}) {

View File

@@ -1,25 +1,22 @@
import { EditIntroInvestasi } from "@/app_modules/investasi"; import { EditIntroInvestasi } from "@/app_modules/investasi";
import { test_server } from "@/app_modules/investasi/edit_intro/_makuro/test_server";
import getOneInvestasiById from "@/app_modules/investasi/fun/get_one_investasi_by_id"; import getOneInvestasiById from "@/app_modules/investasi/fun/get_one_investasi_by_id";
import getPembagianDeviden from "@/app_modules/investasi/fun/master/get_pembagian_deviden"; import getPembagianDeviden from "@/app_modules/investasi/fun/master/get_pembagian_deviden";
import getPencarianInvestor from "@/app_modules/investasi/fun/master/get_pencarian_investor"; import getPencarianInvestor from "@/app_modules/investasi/fun/master/get_pencarian_investor";
import getPeriodeDeviden from "@/app_modules/investasi/fun/master/get_periode_deviden"; import getPeriodeDeviden from "@/app_modules/investasi/fun/master/get_periode_deviden";
export default async function Page({ params }: { params: { id: string } }) { export default async function Page({ params }: { params: { id: string } }) {
const dataInvestasi = await getOneInvestasiById(params.id) const dataInvestasi = await getOneInvestasiById(params.id);
const listPencarian = await getPencarianInvestor() const listPencarian = await getPencarianInvestor();
const listPeriode = await getPeriodeDeviden() const listPeriode = await getPeriodeDeviden();
const listPembagian = await getPembagianDeviden() const listPembagian = await getPembagianDeviden();
return ( return (
<> <>
<EditIntroInvestasi <EditIntroInvestasi
dataInvestasi={dataInvestasi as any}
dataInvestasi={dataInvestasi as any} listPencarian={listPencarian as any}
listPencarian={listPencarian as any} listPeriode={listPeriode as any}
listPeriode={listPeriode as any} listPembagian={listPembagian as any}
listPembagian={listPembagian as any}
/> />
</> </>
); );

View File

@@ -1,5 +1,6 @@
export const RouterAdminDashboard = { export const RouterAdminDashboard = {
main_admin: "/dev/admin/main/dashboard", main_admin: "/dev/admin/main/dashboard",
splash_admin: "/dev/admin/splash",
}; };
export const RouterAdminInvestasi = { export const RouterAdminInvestasi = {

View File

@@ -1,12 +1,13 @@
'use client' 'use client'
import { test_server } from "@/app_modules/investasi/edit_intro/_makuro/test_server";
import { Button } from "@mantine/core"; import { Button } from "@mantine/core";
import makuro_test from "./makuro_test";
export default function ViewMakuro() { export default function ViewMakuro() {
return <> return <>
<Button <Button
onClick={() => test_server()} onClick={() => makuro_test()}
>Tekan Aja</Button> >Tekan Aja</Button>
</> </>
} }

View File

@@ -0,0 +1,36 @@
"use server"
import prisma from "@/app/lib/prisma"
export default async function Admin_funGetAllInvestasi() {
const res = await prisma.investasi.findMany({
where: {
MasterStatusInvestasi: {
name: {
not: "Draft"
}
}
},
select: {
id: true,
title: true,
authorId: true,
hargaLembar: true,
targetDana: true,
totalLembar: true,
roi: true,
active: true,
imagesId: true,
MasterStatusInvestasi: true,
BeritaInvestasi: true,
DokumenInvestasi: true,
ProspektusInvestasi: true,
MasterPembagianDeviden: true,
MasterPencarianInvestor: true,
MasterPeriodeDeviden: true,
SahamTerbeli: true,
},
})
// console.log(res)
return res
}

View File

@@ -1,6 +1,7 @@
"use client"; "use client";
import { RouterAdminInvestasi } from "@/app/lib/router_hipmi/router_admin"; import { RouterAdminInvestasi } from "@/app/lib/router_hipmi/router_admin";
import { MODEL_Investasi } from "@/app_modules/investasi/model/model_investasi";
import { import {
ActionIcon, ActionIcon,
Badge, Badge,
@@ -15,6 +16,7 @@ import {
} from "@mantine/core"; } from "@mantine/core";
import { IconEdit } from "@tabler/icons-react"; import { IconEdit } from "@tabler/icons-react";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useState } from "react";
const listBox = [ const listBox = [
{ {
@@ -34,64 +36,40 @@ const listBox = [
}, },
{ {
id: 4, id: 4,
name: "Total Proyek INvestasi", name: "Total Proyek Investasi",
jumlah: 2, jumlah: 2,
}, },
]; ];
const listTable = [ export default function Admin_Investasi({
{ listInvestasi,
id: 1, }: {
status: { listInvestasi: MODEL_Investasi[];
id: 1, }) {
name: "Publish", const [investasi, setInvestasi] = useState(listInvestasi);
},
name: "Subway Kuta",
},
{
id: 2,
status: {
id: 2,
name: "Review",
},
name: "Event MCD",
},
{
id: 3,
status: {
id: 2,
name: " Review",
},
name: "Villa Batubulan",
},
{
id: 4,
status: {
id: 1,
name: "Publish",
},
name: "Kost Alif Denpasar",
},
{
id: 5,
status: {
id: 1,
name: "Publish",
},
name: "Pabrik Rokok Surya Gandum",
},
];
export default function Admin_Investasi() {
const router = useRouter(); const router = useRouter();
const tableBody = listTable.map((e) => ( const tableBody = investasi.map((e) => (
<tr key={e.id}> <tr key={e.id}>
<td>{e.name}</td> <td>{e.title}</td>
<td>{e.status.id === 1 ? <Badge variant="dot" color="green" >{e.status.name}</Badge> : <Badge variant="dot" color="red">{e.status.name}</Badge> }</td>
<td> <td>
<ActionIcon variant="transparent" {e.MasterStatusInvestasi.id === "3" ? (
onClick={() => router.push(RouterAdminInvestasi.halaman_aksi + `${e.id}`)} <Badge variant="dot" color="green">
{e.MasterStatusInvestasi.name}
</Badge>
) : (
<Badge variant="dot" color="red">
{e.MasterStatusInvestasi.name}
</Badge>
)}
</td>
<td>
<ActionIcon
variant="transparent"
onClick={() =>
router.push(RouterAdminInvestasi.halaman_aksi + `${e.id}`)
}
> >
<IconEdit /> <IconEdit />
</ActionIcon> </ActionIcon>
@@ -125,18 +103,61 @@ export default function Admin_Investasi() {
<Text>List Investasi</Text> <Text>List Investasi</Text>
</Center> </Center>
<ScrollArea w={"100%"}> <ScrollArea w={"100%"}>
<Table withBorder highlightOnHover > <Table withBorder highlightOnHover>
<thead> <thead>
<tr> <tr>
<th>Nama Proyek Investasi</th> <th>Nama Proyek Investasi</th>
<th>Status</th> <th>Status</th>
<th>Aksi</th> <th>Aksi</th>
</tr> </tr>
</thead> </thead>
<tbody>{tableBody}</tbody> <tbody>{tableBody}</tbody>
</Table> </Table>
</ScrollArea> </ScrollArea>
</Box> </Box>
</> </>
); );
} }
// const listTable = [
// {
// id: 1,
// status: {
// id: 1,
// name: "Publish",
// },
// name: "Subway Kuta",
// },
// {
// id: 2,
// status: {
// id: 2,
// name: "Review",
// },
// name: "Event MCD",
// },
// {
// id: 3,
// status: {
// id: 2,
// name: " Review",
// },
// name: "Villa Batubulan",
// },
// {
// id: 4,
// status: {
// id: 1,
// name: "Publish",
// },
// name: "Kost Alif Denpasar",
// },
// {
// id: 5,
// status: {
// id: 1,
// name: "Publish",
// },
// name: "Pabrik Rokok Surya Gandum",
// },
// ];

View File

@@ -1,5 +1,5 @@
import AdminMain from "./view"; import AdminMain from "./view";
import AdminLayout from "./layout"; import AdminLayout from "./layout";
import SplashDashboardAdmin from "./splash";
export { AdminMain, AdminLayout, SplashDashboardAdmin };
export {AdminMain ,AdminLayout}

View File

@@ -3,6 +3,7 @@
import { import {
ActionIcon, ActionIcon,
AppShell, AppShell,
Avatar,
Box, Box,
Burger, Burger,
Drawer, Drawer,
@@ -10,6 +11,7 @@ import {
Group, Group,
Header, Header,
MediaQuery, MediaQuery,
NavLink,
Navbar, Navbar,
Stack, Stack,
Text, Text,
@@ -19,7 +21,7 @@ import {
import React, { useState } from "react"; import React, { useState } from "react";
import HeaderTamplate from "../../component/header_tamplate"; import HeaderTamplate from "../../component/header_tamplate";
import { useDisclosure } from "@mantine/hooks"; import { useDisclosure } from "@mantine/hooks";
import { IconLogout } from "@tabler/icons-react"; import { IconLetterH, IconLogout } from "@tabler/icons-react";
import { import {
RouterAdminAward, RouterAdminAward,
RouterAdminDashboard, RouterAdminDashboard,
@@ -27,6 +29,7 @@ import {
} from "@/app/lib/router_hipmi/router_admin"; } from "@/app/lib/router_hipmi/router_admin";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { RouterHome } from "@/app/lib/router_hipmi/router_home"; import { RouterHome } from "@/app/lib/router_hipmi/router_home";
import { Logout } from "@/app_modules/auth";
export default function AdminLayout({ export default function AdminLayout({
children, children,
@@ -36,6 +39,7 @@ export default function AdminLayout({
const theme = useMantineTheme(); const theme = useMantineTheme();
const [opened, setOpened] = useState(false); const [opened, setOpened] = useState(false);
const router = useRouter(); const router = useRouter();
// const [active, setActive] = useState(false)
const listAdminPage = [ const listAdminPage = [
{ {
@@ -58,24 +62,26 @@ export default function AdminLayout({
return ( return (
<> <>
<AppShell <AppShell
// footer={ padding="sm"
// <Footer height={50}> navbarOffsetBreakpoint="md"
// {/* Web View */} asideOffsetBreakpoint="sm"
// <MediaQuery smallerThan={"md"} styles={{ display: "none" }}> navbar={
// <Group position="apart"> <MediaQuery smallerThan={"md"} styles={{ display: "none" }}>
// <Text>1</Text> <Navbar width={{ lg: 200, md: 200, sm: 200, base: 200 }} hiddenBreakpoint="md" hidden={!opened} p="xs" bg={"gray.2"}>
// <Text>1</Text> {listAdminPage.map((e) => (
// <Text>1</Text> <NavLink
// </Group> key={e.id}
// </MediaQuery> label={e.name}
onClick={() => {
// {/* <MediaQuery smallerThan={"md"} styles={{ display: "none", borderStyle: "transparent" }}> router.push(e.route);
// <Text>ok</Text> }}
// </MediaQuery> */} />
// </Footer> ))}
// } </Navbar>
</MediaQuery>
}
header={ header={
<Header height={50}> <Header height={50} bg={"gray.2"}>
{/* Mobile View */} {/* Mobile View */}
<MediaQuery largerThan="md" styles={{ display: "none" }}> <MediaQuery largerThan="md" styles={{ display: "none" }}>
<Group h={50} align="center" px={"md"} position="apart"> <Group h={50} align="center" px={"md"} position="apart">
@@ -99,20 +105,16 @@ export default function AdminLayout({
{/* Web View */} {/* Web View */}
<MediaQuery smallerThan={"md"} styles={{ display: "none" }}> <MediaQuery smallerThan={"md"} styles={{ display: "none" }}>
<Group position="apart" align="center" h={50} px={"md"}> <Group position="apart" align="center" h={50} px={"md"}>
<Text fw={"lighter"}>HIPMI</Text>
<Title order={4}>Dashboard Admin</Title> <Title order={4}>Dashboard Admin</Title>
<Group> {/* <Group>
{listAdminPage.map((e) => ( {listAdminPage.map((e) => (
<Text key={e.id} onClick={() => router.push(e.route)}> <Text key={e.id} onClick={() => router.push(e.route)}>
{e.name} {e.name}
</Text> </Text>
))} ))}
</Group> </Group> */}
<ActionIcon <Logout />
variant="transparent"
onClick={() => router.push(RouterHome.main_home)}
>
<IconLogout color="red" />
</ActionIcon>
</Group> </Group>
</MediaQuery> </MediaQuery>
</Header> </Header>

View File

@@ -0,0 +1,22 @@
"use client";
import { RouterAdminDashboard } from "@/app/lib/router_hipmi/router_admin";
import { Stack, Text, Title } from "@mantine/core";
import { useShallowEffect } from "@mantine/hooks";
import { useRouter } from "next/navigation";
export default function SplashDashboardAdmin() {
const router = useRouter()
useShallowEffect(() => {
setTimeout(() => router.push(RouterAdminDashboard.main_admin), 2000)
},[])
return (
<>
<Stack align="center" justify="center" h={"100vh"}>
<Title order={4} c={"orange"}>Selamat Datang, ADMIN</Title>
<Title c={"red"}>HIPMI</Title>
</Stack>
</>
);
}

View File

@@ -12,6 +12,7 @@ import toast from "react-simple-toasts";
import { useAtom } from "jotai"; import { useAtom } from "jotai";
import { gs_otp, gs_nomor } from "../state/state"; import { gs_otp, gs_nomor } from "../state/state";
import { IconCircleLetterH } from "@tabler/icons-react"; import { IconCircleLetterH } from "@tabler/icons-react";
import { RouterAdminDashboard } from "@/app/lib/router_hipmi/router_admin";
export default function Login() { export default function Login() {
const router = useRouter(); const router = useRouter();
@@ -37,26 +38,24 @@ export default function Login() {
}) })
.then((res) => res.json()) .then((res) => res.json())
.then((val) => { .then((val) => {
myConsole(val); console.log(val);
if (val.status == 200) { if (val.success === true) {
toast(val.message); router.push(RouterAdminDashboard.splash_admin);
setCode(val.body.otp);
setInputNumber(val.body.nomor);
router.push("/dev/auth/validasi");
} else { } else {
toast(val.message); if (val.status == 200) {
toast(val.message);
setCode(val.body.otp);
setInputNumber(val.body.nomor);
router.push("/dev/auth/validasi");
} else {
toast(val.message);
}
} }
}); });
}; };
return ( return (
<> <>
{/* <pre>
{JSON.stringify(inputNumber, null, 2)}
<br />
{JSON.stringify(code)}
</pre> */}
<Flex <Flex
h={"100vh"} h={"100vh"}
direction={"column"} direction={"column"}
@@ -82,7 +81,6 @@ export default function Login() {
mt={"xs"} mt={"xs"}
h={30} h={30}
w={250} w={250}
radius={50} radius={50}
compact compact
bg={Warna.hijau_muda} bg={Warna.hijau_muda}

View File

@@ -1,4 +0,0 @@
"use server";
export async function test_server() {
console.log("ini dari server")
}

View File

@@ -32,7 +32,7 @@ import _ from "lodash";
import { MODEL_DEFAULT_MASTER } from "@/app_modules/models/model_default_master"; import { MODEL_DEFAULT_MASTER } from "@/app_modules/models/model_default_master";
import funEditInvestasi from "../fun/fun_edit_investasi"; import funEditInvestasi from "../fun/fun_edit_investasi";
import { useDisclosure, useWindowScroll } from "@mantine/hooks"; import { useDisclosure, useWindowScroll } from "@mantine/hooks";
import { test_server } from "./_makuro/test_server";
export default function EditIntroInvestasi({ export default function EditIntroInvestasi({
dataInvestasi, dataInvestasi,