From a4758e097095ee7274b9c32fb3cdbfc767e5a89e Mon Sep 17 00:00:00 2001 From: nico Date: Thu, 13 Feb 2025 17:22:26 +0800 Subject: [PATCH 1/2] API Admin Detail Review & Detail Publish Investasi --- src/app/api/admin/event/[id]/peserta/route.ts | 8 ++ .../{detail/[id] => [id]/detail}/route.ts | 5 +- .../investasi/{ => status}/[status]/route.ts | 0 src/app/api/admin/job/[status]/route.ts | 5 +- .../investasi/detail/publish/[id]/page.tsx | 25 ++-- .../admin/investasi/konfirmasi/[id]/page.tsx | 8 +- .../_component/detail_data_author.tsx | 87 +++++------ .../_component/detail_data_investasi.tsx | 136 +++++++++--------- .../_component/skeleton_admin_investasi.tsx | 38 +++++ .../_lib/api_fetch_admin_investasi.ts | 5 +- .../_view/detail/view_detail_data.tsx | 17 ++- .../admin/investasi/detail/detail_publish.tsx | 33 ++++- .../admin/investasi/detail/detail_review.tsx | 66 +++++---- src/middleware.ts | 1 - 14 files changed, 264 insertions(+), 170 deletions(-) rename src/app/api/admin/investasi/{detail/[id] => [id]/detail}/route.ts (97%) rename src/app/api/admin/investasi/{ => status}/[status]/route.ts (100%) create mode 100644 src/app_modules/admin/investasi/_component/skeleton_admin_investasi.tsx diff --git a/src/app/api/admin/event/[id]/peserta/route.ts b/src/app/api/admin/event/[id]/peserta/route.ts index 65be8b1c..ccd6d66b 100644 --- a/src/app/api/admin/event/[id]/peserta/route.ts +++ b/src/app/api/admin/event/[id]/peserta/route.ts @@ -25,6 +25,7 @@ export async function GET(request: Request, User: { username: { contains: search ? search : "", + mode: "insensitive", } } @@ -47,6 +48,7 @@ export async function GET(request: Request, User: { username: { contains: search ? search : "", + mode: "insensitive", } } }, @@ -63,6 +65,12 @@ export async function GET(request: Request, const nCount = await prisma.event_Peserta.count({ where: { eventId: eventId, + User: { + username: { + contains: search ? search : "", + mode: "insensitive", + } + } }, }); diff --git a/src/app/api/admin/investasi/detail/[id]/route.ts b/src/app/api/admin/investasi/[id]/detail/route.ts similarity index 97% rename from src/app/api/admin/investasi/detail/[id]/route.ts rename to src/app/api/admin/investasi/[id]/detail/route.ts index 94145ac8..6fd0ebc9 100644 --- a/src/app/api/admin/investasi/detail/[id]/route.ts +++ b/src/app/api/admin/investasi/[id]/detail/route.ts @@ -5,13 +5,14 @@ import { NextResponse } from "next/server"; export async function GET(req: Request, { params }: { params: { id: string } }) { - console.log("Ini ID", params.id); + try { const { id } = params; + const investasiId = id; const data = await prisma.investasi.findUnique({ where: { - id: id, + id: investasiId, }, select: { imageId: true, diff --git a/src/app/api/admin/investasi/[status]/route.ts b/src/app/api/admin/investasi/status/[status]/route.ts similarity index 100% rename from src/app/api/admin/investasi/[status]/route.ts rename to src/app/api/admin/investasi/status/[status]/route.ts diff --git a/src/app/api/admin/job/[status]/route.ts b/src/app/api/admin/job/[status]/route.ts index 0dfd891f..d86f8740 100644 --- a/src/app/api/admin/job/[status]/route.ts +++ b/src/app/api/admin/job/[status]/route.ts @@ -31,7 +31,7 @@ export async function GET(request: Request, { params }: { const fixStatus = _.startCase(status); if (!page) { - const data = await prisma.job.findMany({ + fixData = await prisma.job.findMany({ orderBy: { updatedAt: "desc" }, @@ -79,6 +79,9 @@ export async function GET(request: Request, { params }: { where: { isActive: true, isArsip: false, + MasterStatus: { + name: fixStatus + }, title: { contains: search ? search : "", mode: "insensitive" diff --git a/src/app/dev/admin/investasi/detail/publish/[id]/page.tsx b/src/app/dev/admin/investasi/detail/publish/[id]/page.tsx index b87747e9..7d8582cd 100644 --- a/src/app/dev/admin/investasi/detail/publish/[id]/page.tsx +++ b/src/app/dev/admin/investasi/detail/publish/[id]/page.tsx @@ -1,4 +1,5 @@ import { AdminInvestasi_DetailPublish } from "@/app_modules/admin/investasi"; +import { apiGetAdminInvestasiById } from "@/app_modules/admin/investasi/_lib/api_fetch_admin_investasi"; import { adminInvestasi_funGetAllTransaksiById, adminInvestasi_getStatusInvestasi, @@ -7,20 +8,24 @@ import getOneInvestasiById from "@/app_modules/investasi/fun/get_one_investasi_b export default async function Page({ params }: { params: { id: string } }) { const investasiId = params.id; - const dataInvestasi = await getOneInvestasiById(investasiId); const statusTransaksi = await adminInvestasi_getStatusInvestasi(); - const dataTransaksi = await adminInvestasi_funGetAllTransaksiById({ - investasiId, - page: 1, - }); + const dataTransaksi = await adminInvestasi_funGetAllTransaksiById({ + investasiId, + page: 1, + }); + // export default async function Page({ params }: { params: { id: string } }) { + // const investasiId = params.id; + // const dataInvestasi = await getOneInvestasiById(investasiId); + // const statusTransaksi = await adminInvestasi_getStatusInvestasi(); + // const dataTransaksi = await adminInvestasi_funGetAllTransaksiById({ + // investasiId, + // page: 1, + // }); return ( <> - ); diff --git a/src/app/dev/admin/investasi/konfirmasi/[id]/page.tsx b/src/app/dev/admin/investasi/konfirmasi/[id]/page.tsx index 96111822..533187e5 100644 --- a/src/app/dev/admin/investasi/konfirmasi/[id]/page.tsx +++ b/src/app/dev/admin/investasi/konfirmasi/[id]/page.tsx @@ -1,14 +1,14 @@ import { Admin_KonfirmasiInvestasi } from "@/app_modules/admin/investasi"; import { adminInvestasi_getOneById } from "@/app_modules/admin/investasi/fun"; -export default async function Page({ params }: { params: { id: string } }) { - const investasiId = params.id; - const dataInvestasi = await adminInvestasi_getOneById({investasiId}); +export default async function Page() { + // const investasiId = params.id; + // const dataInvestasi = await adminInvestasi_getOneById({investasiId}); // console.log(dataUser) return ( <> - + ); } diff --git a/src/app_modules/admin/investasi/_component/detail_data_author.tsx b/src/app_modules/admin/investasi/_component/detail_data_author.tsx index 04c27b8b..97b1d703 100644 --- a/src/app_modules/admin/investasi/_component/detail_data_author.tsx +++ b/src/app_modules/admin/investasi/_component/detail_data_author.tsx @@ -1,55 +1,56 @@ import { AdminColor } from "@/app_modules/_global/color/color_pallet"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; import { MODEL_USER } from "@/app_modules/home/model/interface"; import { Paper, Stack, Title, Grid, Text } from "@mantine/core"; export function ComponentAdminInvestasi_DetailDataAuthor({ data, }: { - data: any; + data: MODEL_USER; }) { return ( - - - - - - - Data User - - - - Nama: - - - {data?.Profile?.name} - - - - - Username: - - - @{data?.username} - - - - - Nomor: - - - + {data?.nomor} - - - - - Alamat: - - - {data?.Profile?.alamat} - - + <> + {!data ? () + : ( + + Data User + + + + Nama: + + + {data?.Profile?.name} + + + + + Username: + + + @{data?.username} + + + + + Nomor: + + + + {data?.nomor} + + + + + Alamat: + + + {data?.Profile?.alamat} + + + - - + )} + ); } +{/* */ } diff --git a/src/app_modules/admin/investasi/_component/detail_data_investasi.tsx b/src/app_modules/admin/investasi/_component/detail_data_investasi.tsx index 21980d70..8e7e1c22 100644 --- a/src/app_modules/admin/investasi/_component/detail_data_investasi.tsx +++ b/src/app_modules/admin/investasi/_component/detail_data_investasi.tsx @@ -1,83 +1,85 @@ import { AdminColor } from "@/app_modules/_global/color/color_pallet"; +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; import { Paper, Stack, Title, Grid, Box, Text } from "@mantine/core"; export function ComponentAdminInvestasi_DetailData({ data }: { data: any }) { return ( <> - - - Rincian Data Investasi - - - - - Judul - {data?.title} - + {!data ? () : + ( + + Rincian Data Investasi + + + + + Judul + {data?.title} + - - Dana Dibutuhkan - - Rp.{" "} - {new Intl.NumberFormat("id-ID", { - maximumFractionDigits: 10, - }).format(+data.targetDana)} - - + + Dana Dibutuhkan + + Rp.{" "} + {new Intl.NumberFormat("id-ID", { + maximumFractionDigits: 10, + }).format(+data?.targetDana)} + + - - Harga Per Lembar - - Rp.{" "} - {new Intl.NumberFormat("id-ID", { - maximumFractionDigits: 10, - }).format(+data.hargaLembar)}{" "} - - + + Harga Per Lembar + + Rp.{" "} + {new Intl.NumberFormat("id-ID", { + maximumFractionDigits: 10, + }).format(+data?.hargaLembar)}{" "} + + - - Total Lembar - - {" "} - {new Intl.NumberFormat("id-ID", { - maximumFractionDigits: 10, - }).format(+data.totalLembar)}{" "} - lembar - - - - + + Total Lembar + + {" "} + {new Intl.NumberFormat("id-ID", { + maximumFractionDigits: 10, + }).format(+data?.totalLembar)}{" "} + lembar + + + + - - - - ROI - {data.roi} % - + + + + ROI + {data?.roi} % + - - Pembagian Deviden - {data.MasterPeriodeDeviden.name} - + + Pembagian Deviden + {data?.MasterPeriodeDeviden.name} + - - Jadwal Pembagian - - {data.MasterPembagianDeviden.name} bulan{" "} - - + + Jadwal Pembagian + + {data?.MasterPembagianDeviden.name} bulan{" "} + + - - Pencarian Investor - - {data.MasterPencarianInvestor.name} hari{" "} - - - - - - - + + Pencarian Investor + + {data?.MasterPencarianInvestor.name} hari{" "} + + + + + + + )} ); } diff --git a/src/app_modules/admin/investasi/_component/skeleton_admin_investasi.tsx b/src/app_modules/admin/investasi/_component/skeleton_admin_investasi.tsx new file mode 100644 index 00000000..bb41f911 --- /dev/null +++ b/src/app_modules/admin/investasi/_component/skeleton_admin_investasi.tsx @@ -0,0 +1,38 @@ +import CustomSkeleton from '@/app_modules/components/CustomSkeleton'; +import { Box, SimpleGrid, Stack } from '@mantine/core'; +import React from 'react'; + +function SkeletonAdminInvestasi() { + return ( + <> + + + + + + + + + + + + + + + + + + + + ); +} + +export default SkeletonAdminInvestasi; diff --git a/src/app_modules/admin/investasi/_lib/api_fetch_admin_investasi.ts b/src/app_modules/admin/investasi/_lib/api_fetch_admin_investasi.ts index dc1d4ed9..e82c8a55 100644 --- a/src/app_modules/admin/investasi/_lib/api_fetch_admin_investasi.ts +++ b/src/app_modules/admin/investasi/_lib/api_fetch_admin_investasi.ts @@ -38,7 +38,7 @@ const apiGetAdminInvestasiByStatus = async ({ status, page, search }: { const isPage = page ? `?page=${page}` : ""; const isSearch = search ? `&search=${search}` : ""; - const response = await fetch(`/api/admin/investasi/${status}${isPage}${isSearch}`, { + const response = await fetch(`/api/admin/investasi/status/${status}${isPage}${isSearch}`, { method: "GET", headers: { "Content-Type": "application/json", @@ -56,7 +56,7 @@ const apiGetAdminInvestasiById = async ({id} : {id: string}) => { if (!token) return await token.json().catch(() => null); - const response = await fetch(`/api/admin/investasi/detail/${id}`, { + const response = await fetch(`/api/admin/investasi/${id}/detail`, { method: "GET", headers: { "Content-Type": "application/json", @@ -66,6 +66,5 @@ const apiGetAdminInvestasiById = async ({id} : {id: string}) => { } }) - console.log("Ini data Response", await response.json()) return await response.json().catch(() => null); } \ No newline at end of file diff --git a/src/app_modules/admin/investasi/_view/detail/view_detail_data.tsx b/src/app_modules/admin/investasi/_view/detail/view_detail_data.tsx index 7761be7c..5b08494b 100644 --- a/src/app_modules/admin/investasi/_view/detail/view_detail_data.tsx +++ b/src/app_modules/admin/investasi/_view/detail/view_detail_data.tsx @@ -4,6 +4,7 @@ import { ComponentAdminInvestasi_DetailDataAuthor } from "../../_component/detai import { ComponentAdminInvestasi_DetailData } from "../../_component/detail_data_investasi"; import { ComponentAdminInvestasi_DetailGambar } from "../../_component/detail_gambar_investasi"; import { ComponentAdminInvestasi_UIDetailFile } from "../../_component/ui_detail_file"; +import SkeletonAdminInvestasi from "../../_component/skeleton_admin_investasi"; export function AdminInvestasi_ViewDetailData({ data, @@ -12,6 +13,7 @@ export function AdminInvestasi_ViewDetailData({ }) { return ( <> + {!data ? () : ( <> {/* Data Author */} - + {/* Data Foto */} - + {/* Data Detail */} - + + )} ); } diff --git a/src/app_modules/admin/investasi/detail/detail_publish.tsx b/src/app_modules/admin/investasi/detail/detail_publish.tsx index 0fc0eeb7..662e2d45 100644 --- a/src/app_modules/admin/investasi/detail/detail_publish.tsx +++ b/src/app_modules/admin/investasi/detail/detail_publish.tsx @@ -12,18 +12,20 @@ import { } from "../_view"; import { useAtom } from "jotai"; import { gs_admin_invetasi_menu_publish } from "../_lib/global_state"; +import { useParams } from "next/navigation"; +import { apiGetAdminInvestasiById } from "../_lib/api_fetch_admin_investasi"; +import { clientLogger } from "@/util/clientLogger"; +import { useShallowEffect } from "@mantine/hooks"; export function AdminInvestasi_DetailPublish({ - data, dataTransaksi, statusTransaksi, - investasiId, }: { - data: MODEL_INVESTASI; dataTransaksi: any[]; statusTransaksi: any[]; - investasiId: string; -}) { + }) { + const params = useParams<{ id: string }>(); + const [data, setData] = useState(null); const [selectPage, setSelectPage] = useAtom(gs_admin_invetasi_menu_publish); const listPage = [ { @@ -43,6 +45,23 @@ export function AdminInvestasi_DetailPublish({ // }, ]; + useShallowEffect(() => { + loadInitialData() + }, []); + const loadInitialData = async () => { + try { + const response = await apiGetAdminInvestasiById({ + id: params.id + }) + + if (response?.success && response?.data) { + setData(response.data) + } + } catch (error) { + clientLogger.error("Invalid data format recieved:", error) + setData(null); + } + } return ( <> @@ -65,13 +84,13 @@ export function AdminInvestasi_DetailPublish({ {selectPage == "1" ? ( - + ) : null} {selectPage == "2" ? ( ) : null} diff --git a/src/app_modules/admin/investasi/detail/detail_review.tsx b/src/app_modules/admin/investasi/detail/detail_review.tsx index 57c3cebd..df0992c3 100644 --- a/src/app_modules/admin/investasi/detail/detail_review.tsx +++ b/src/app_modules/admin/investasi/detail/detail_review.tsx @@ -4,10 +4,10 @@ import { IRealtimeData } from "@/lib/global_state"; import { MainColor } from "@/app_modules/_global/color"; import { MODEL_INVESTASI } from "@/app_modules/investasi/_lib/interface"; import getOneInvestasiById from "@/app_modules/investasi/fun/get_one_investasi_by_id"; -import { Button, Group, SimpleGrid, Stack } from "@mantine/core"; +import { Button, Group, SimpleGrid, Stack, Loader } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; import _ from "lodash"; -import { useRouter } from "next/navigation"; +import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; import { WibuRealtime } from "wibu-pkg"; import { Admin_ComponentModalReport } from "../../_admin_global/_component"; @@ -23,33 +23,49 @@ import { ComponentAdminInvestasi_DetailGambar } from "../_component/detail_gamba import { ComponentAdminInvestasi_UIDetailFile } from "../_component/ui_detail_file"; import { adminInvestasi_funEditStatusPublishById } from "../fun/edit/fun_status_publish_by_id"; import Admin_funRejectInvestasi from "../fun/fun_reject_investasi"; +import { clientLogger } from "@/util/clientLogger"; +import { apiGetAdminInvestasiById } from "../_lib/api_fetch_admin_investasi"; +import SkeletonAdminInvestasi from "../_component/skeleton_admin_investasi"; -export default function AdminInvestasi_DetailReview({ - dataInvestasi, -}: { - dataInvestasi: MODEL_INVESTASI; -}) { +export default function AdminInvestasi_DetailReview() { + const params = useParams<{ id: string }>(); const router = useRouter(); - const [data, setData] = useState(dataInvestasi); + const [data, setData] = useState(null); const [publish, setPublish] = useState(true); const [openModalPublish, setOpenModalPublish] = useState(false); const [openModalReject, setOpenModalReject] = useState(false); const [isLoadingPublish, setIsLoadingPublish] = useState(false); const [isLoadingReject, setIsLoadingReject] = useState(false); const [report, setReport] = useState(""); + const investasiId = params; useShallowEffect(() => { cekStatusPublish(); - // omload() + loadInitialData(); }, []); + const loadInitialData = async () => { + try { + const response = await apiGetAdminInvestasiById({ + id: params.id, + }) + + if (response?.success && response?.data) { + setData(response.data); + } + } catch (error) { + clientLogger.error("Invalid data format recieved:", error); + setData(null); + } +} + async function cekStatusPublish() { - if (data.MasterStatusInvestasi.id === "3") setPublish(false); + if (data?.MasterStatusInvestasi.id === "3") setPublish(false); } async function onReject() { const body = { - id: data.id, + id: data?.id, catatan: report, status: "4", }; @@ -81,8 +97,8 @@ export default function AdminInvestasi_DetailReview({ }); } - const loadData = await getOneInvestasiById(data.id); - setData(loadData as any); + // const loadData = await getOneInvestasiById(data?.id); + // setData(loadData as any); ComponentAdminGlobal_NotifikasiBerhasil(res.message); router.back(); @@ -96,7 +112,7 @@ export default function AdminInvestasi_DetailReview({ async function onPublish() { const res = await adminInvestasi_funEditStatusPublishById({ - investasiId: data.id, + investasiId: data?.id as any, statusId: "1", progesInvestasiId: "1", }); @@ -128,7 +144,7 @@ export default function AdminInvestasi_DetailReview({ dataMessage: dataNotifikasi, }); - const loadData = await getOneInvestasiById(data.id); + const loadData = await getOneInvestasiById(data?.id as any); setData(loadData as any); ComponentAdminGlobal_NotifikasiBerhasil("Proyek Investasi Di Publish"); @@ -143,6 +159,9 @@ export default function AdminInvestasi_DetailReview({ } } + if (!data) { + return + } return ( @@ -151,7 +170,7 @@ export default function AdminInvestasi_DetailReview({ - {data.masterStatusInvestasiId === "2" ? ( + {data?.masterStatusInvestasiId === "2" ? (