diff --git a/src/app/api/admin/donasi/[id]/route.ts b/src/app/api/admin/donasi/[id]/route.ts new file mode 100644 index 00000000..a2739b1e --- /dev/null +++ b/src/app/api/admin/donasi/[id]/route.ts @@ -0,0 +1,57 @@ +import backendLogger from "@/util/backendLogger"; +import { NextResponse } from "next/server"; +import prisma from "@/lib/prisma"; + +export async function GET(req: Request, { params }: { params: { id: string } }) { + + try { + const { id } = params; + const donasiId = id; + const data = await prisma.donasi.findUnique({ + where: { + id: donasiId, + }, + select: { + id: true, + title: true, + target: true, + active: true, + createdAt: true, + updatedAt: true, + publishTime: true, + catatan: true, + progres: true, + terkumpul: true, + authorId: true, + namaBank: true, + rekening: true, + totalPencairan: true, + akumulasiPencairan: true, + imagesId: true, + donasiMaster_KategoriId: true, + donasiMaster_DurasiId: true, + donasiMaster_StatusDonasiId: true, + Author: true, + imageDonasi: true, + CeritaDonasi: true, + DonasiMaster_Ketegori: true, + DonasiMaster_Durasi: true, + DonasiMaster_Status: true, + imageId: true, + } + }) + + return NextResponse.json({ + success: true, + message: "Data Donasi Berhasil Diambil", + data: data, + }, { status: 200 }); + } catch (error) { + backendLogger.error("Error Get Data Donasi >>", error); + return NextResponse.json({ + success: false, + message: "Error get detail Investasi", + reason: (error as Error).message, + }, { status: 500 }); + } +} \ No newline at end of file diff --git a/src/app/api/admin/donasi/status/[name]/route.ts b/src/app/api/admin/donasi/status/[name]/route.ts index 36bcf781..d6c6bfa5 100644 --- a/src/app/api/admin/donasi/status/[name]/route.ts +++ b/src/app/api/admin/donasi/status/[name]/route.ts @@ -42,8 +42,13 @@ export async function GET(request: Request, imageDonasi: true, DonasiMaster_Ketegori: true, DonasiMaster_Durasi: true, - imageId: true, - }, + Author: { + select: { + id: true, + username: true, + }, + }, + }, }) } else { const data = await prisma.donasi.findMany({ @@ -71,9 +76,13 @@ export async function GET(request: Request, imageDonasi: true, DonasiMaster_Ketegori: true, DonasiMaster_Durasi: true, - imageId: true, - - }, + Author: { + select: { + id: true, + username: true, + }, + }, + }, }) const nCount = await prisma.donasi.count({ diff --git a/src/app/dev/admin/donasi/detail/publish/[id]/page.tsx b/src/app/dev/admin/donasi/detail/publish/[id]/page.tsx index 6407215a..44ab8124 100644 --- a/src/app/dev/admin/donasi/detail/publish/[id]/page.tsx +++ b/src/app/dev/admin/donasi/detail/publish/[id]/page.tsx @@ -7,7 +7,7 @@ import adminDonasi_getMasterStatus from "@/app_modules/admin/donasi/fun/master/g export default async function Page({ params }: { params: { id: string } }) { let donasiId = params.id; - const dataPublish = await AdminDonasi_getOneById(params.id); + // const dataPublish = await AdminDonasi_getOneById(params.id); const countDonatur = await AdminDonasi_funCountDonatur(params.id); const listMasterStatus = await adminDonasi_getMasterStatus(); const listDonatur = await adminDonasi_getListDonatur({ @@ -19,7 +19,7 @@ export default async function Page({ params }: { params: { id: string } }) { return ( <> - + ); } diff --git a/src/app/dev/admin/donasi/detail/review/[id]/page.tsx b/src/app/dev/admin/donasi/detail/review/[id]/page.tsx index 230bfefc..2a7f9020 100644 --- a/src/app/dev/admin/donasi/detail/review/[id]/page.tsx +++ b/src/app/dev/admin/donasi/detail/review/[id]/page.tsx @@ -1,8 +1,8 @@ import { AdminDonasi_DetailReview } from "@/app_modules/admin/donasi"; import { AdminDonasi_getOneById } from "@/app_modules/admin/donasi/fun/get/get_one_by_id"; -export default async function Page({ params }: { params: { id: string } }) { - const dataReview = await AdminDonasi_getOneById(params.id); +export default async function Page() { + - return ; + return ; } diff --git a/src/app/dev/admin/donasi/main/page.tsx b/src/app/dev/admin/donasi/main/page.tsx index 133a7c09..48821986 100644 --- a/src/app/dev/admin/donasi/main/page.tsx +++ b/src/app/dev/admin/donasi/main/page.tsx @@ -2,10 +2,7 @@ import { AdminDonasi_Main } from "@/app_modules/admin/donasi"; import AdminDonasi_funCountByStatus from "@/app_modules/admin/donasi/fun/count/fun_count_donasi_by_status"; export default async function Page() { - const countPublish = await AdminDonasi_funCountByStatus("1"); - const countReview = await AdminDonasi_funCountByStatus("2"); - const countDraft = await AdminDonasi_funCountByStatus("3"); - const countReject = await AdminDonasi_funCountByStatus("4"); + return ( <> diff --git a/src/app_modules/admin/donasi/component/skeleton_detail donasi_reject.tsx b/src/app_modules/admin/donasi/component/skeleton_detail donasi_reject.tsx new file mode 100644 index 00000000..95bb4dad --- /dev/null +++ b/src/app_modules/admin/donasi/component/skeleton_detail donasi_reject.tsx @@ -0,0 +1,37 @@ +import CustomSkeleton from '@/app_modules/components/CustomSkeleton'; +import { Box, SimpleGrid, Stack } from '@mantine/core'; +import React from 'react'; + +function SkeletonAdminDetailDonasiReject() { + return ( + <> + + + + + + + + + + + + + + + + + ); +} + +export default SkeletonAdminDetailDonasiReject; + + diff --git a/src/app_modules/admin/donasi/component/skeleton_detail_donasi_publish.tsx b/src/app_modules/admin/donasi/component/skeleton_detail_donasi_publish.tsx new file mode 100644 index 00000000..8eeb0d79 --- /dev/null +++ b/src/app_modules/admin/donasi/component/skeleton_detail_donasi_publish.tsx @@ -0,0 +1,18 @@ +import CustomSkeleton from '@/app_modules/components/CustomSkeleton'; +import { Box, Stack } from '@mantine/core'; + +function SkeletonAdminDetailDonasiPublish() { + return ( + <> + + + + + + + + + ); +} + +export default SkeletonAdminDetailDonasiPublish; diff --git a/src/app_modules/admin/donasi/component/skeleton_detail_donasi_review.tsx b/src/app_modules/admin/donasi/component/skeleton_detail_donasi_review.tsx new file mode 100644 index 00000000..07b13b62 --- /dev/null +++ b/src/app_modules/admin/donasi/component/skeleton_detail_donasi_review.tsx @@ -0,0 +1,31 @@ +import CustomSkeleton from "@/app_modules/components/CustomSkeleton"; +import { Stack, Box, SimpleGrid } from "@mantine/core"; + +function SkeletonAdminDetailDonasiReview() { + return ( + <> + + + + + + + + + + + + + + ); +} + +export default SkeletonAdminDetailDonasiReview; diff --git a/src/app_modules/admin/donasi/component/tampilan_detail_cerita.tsx b/src/app_modules/admin/donasi/component/tampilan_detail_cerita.tsx index 57e692b4..cd5e6be5 100644 --- a/src/app_modules/admin/donasi/component/tampilan_detail_cerita.tsx +++ b/src/app_modules/admin/donasi/component/tampilan_detail_cerita.tsx @@ -4,6 +4,7 @@ import { RouterDonasi } from "@/lib/router_hipmi/router_donasi"; import { MODEL_CERITA_DONASI } from "@/app_modules/donasi/model/interface"; import { Paper, Stack, Title, Box, AspectRatio, Image, Text } from "@mantine/core"; import { Admin_ComponentLoadImageLandscape } from "../../_admin_global"; +import { AdminColor } from "@/app_modules/_global/color/color_pallet"; export default function ComponentAdminDonasi_CeritaPenggalangDana({ cerita, @@ -13,16 +14,16 @@ export default function ComponentAdminDonasi_CeritaPenggalangDana({ return ( <> {/*
{JSON.stringify(cerita, null, 2)}
*/} - + - Cerita Penggalang Dana - {cerita.pembukaan} + Cerita Penggalang Dana + {cerita.pembukaan} - {cerita.cerita} + {cerita.cerita} diff --git a/src/app_modules/admin/donasi/component/tampilan_detail_donasi.tsx b/src/app_modules/admin/donasi/component/tampilan_detail_donasi.tsx index 8bdc432a..471ae4f8 100644 --- a/src/app_modules/admin/donasi/component/tampilan_detail_donasi.tsx +++ b/src/app_modules/admin/donasi/component/tampilan_detail_donasi.tsx @@ -16,6 +16,7 @@ import { import { Admin_ComponentLoadImageLandscape } from "../../_admin_global"; import ComponentAdminGlobal_TampilanRupiahDonasi from "../../_admin_global/tampilan_rupiah"; import { ComponentGlobal_TampilanRupiah } from "@/app_modules/_global/component"; +import { AdminColor } from "@/app_modules/_global/color/color_pallet"; export default function ComponentAdminDonasi_TampilanDetailDonasi({ donasi, @@ -24,33 +25,33 @@ export default function ComponentAdminDonasi_TampilanDetailDonasi({ }) { return ( <> - + - Detail Data Donasi + Detail Data Donasi - {donasi.title} - + {donasi.title} + Durasi: {donasi.DonasiMaster_Durasi.name} hari - Dana dibutuhkan + Dana dibutuhkan <ComponentGlobal_TampilanRupiah - color="black" + color={AdminColor.yellow} nominal={+donasi.target} /> - Kategori + Kategori {donasi.DonasiMaster_Ketegori.name} diff --git a/src/app_modules/admin/donasi/detail/detail_reject.tsx b/src/app_modules/admin/donasi/detail/detail_reject.tsx index 9b14ddd5..07cfd889 100644 --- a/src/app_modules/admin/donasi/detail/detail_reject.tsx +++ b/src/app_modules/admin/donasi/detail/detail_reject.tsx @@ -17,7 +17,7 @@ import { Textarea, Title, } from "@mantine/core"; -import { useDisclosure } from "@mantine/hooks"; +import { useDisclosure, useShallowEffect } from "@mantine/hooks"; import React, { useState } from "react"; import { ComponentAdminGlobal_NotifikasiBerhasil } from "../../_admin_global/admin_notifikasi/notifikasi_berhasil"; import AdminGlobal_ComponentBackButton from "../../_admin_global/back_button"; @@ -27,38 +27,68 @@ import { AdminDonasi_getOneById } from "../fun/get/get_one_by_id"; import { AdminDonasi_funUpdateCatatanReject } from "../fun/update/fun_update_catatan_reject"; import { ComponentAdminGlobal_NotifikasiGagal } from "../../_admin_global/admin_notifikasi/notifikasi_gagal"; import { Admin_ComponentModalReport } from "../../_admin_global/_component"; +import { AdminColor } from "@/app_modules/_global/color/color_pallet"; +import { useParams } from "next/navigation"; +import { apiGetAdminDonasiById } from "../lib/api_fetch_admin_donasi"; +import { clientLogger } from "@/util/clientLogger"; +import CustomSkeletonAdmin from "../../_admin_global/_component/skeleton/customSkeletonAdmin"; +import SkeletonAdminDetailDonasiReject from "../component/skeleton_detail donasi_reject"; -export default function AdminDonasi_DetailReject({ - dataReject, -}: { - dataReject: MODEL_DONASI; -}) { - const [data, setData] = useState(dataReject); +export default function AdminDonasi_DetailReject() { + const [data, setData] = useState(null); + const params = useParams<{ id: string }>(); + + useShallowEffect(() => { + const loadInitialData = async () => { + try { + const response = await apiGetAdminDonasiById({ + id: params.id, + }) + + if (response?.success && response?.data) { + setData(response.data); + } else { + console.error("Invalid data format recieved:", response); + setData(null); + } + } catch (error) { + clientLogger.error("Invalid data format recieved:", error); + setData(null); + } + } + loadInitialData(); + }) return ( <> - - - - - - - + {!data ? ( + + ) : ( + <> + + + + + + + + )} + ); } @@ -177,10 +207,10 @@ function ButtonOnHeader({ function CatatanReject({ catatan }: { catatan: string }) { return ( <> - + - Alasan Penolakan : - {catatan} + Alasan Penolakan : + {catatan} diff --git a/src/app_modules/admin/donasi/detail/detail_review.tsx b/src/app_modules/admin/donasi/detail/detail_review.tsx index 76191957..bb4ce628 100644 --- a/src/app_modules/admin/donasi/detail/detail_review.tsx +++ b/src/app_modules/admin/donasi/detail/detail_review.tsx @@ -1,58 +1,83 @@ "use client"; -import { IRealtimeData } from "@/lib/global_state"; +import { MainColor } from "@/app_modules/_global/color"; import ComponentGlobal_InputCountDown from "@/app_modules/_global/component/input_countdown"; +import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/_global/notif_global"; +import { donasi_checkStatus } from "@/app_modules/donasi/fun"; import { MODEL_DONASI } from "@/app_modules/donasi/model/interface"; +import { IRealtimeData } from "@/lib/global_state"; +import { clientLogger } from "@/util/clientLogger"; import { Button, Group, SimpleGrid, Stack } from "@mantine/core"; -import { useDisclosure } from "@mantine/hooks"; -import { useRouter } from "next/navigation"; +import { useDisclosure, useShallowEffect } from "@mantine/hooks"; +import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; import { WibuRealtime } from "wibu-pkg"; import { Admin_ComponentModalReport } from "../../_admin_global/_component"; +import Admin_ComponentModalPublish from "../../_admin_global/_component/comp_admin_modal_publish"; import { ComponentAdminGlobal_NotifikasiBerhasil } from "../../_admin_global/admin_notifikasi/notifikasi_berhasil"; import { ComponentAdminGlobal_NotifikasiGagal } from "../../_admin_global/admin_notifikasi/notifikasi_gagal"; import { ComponentAdminGlobal_NotifikasiPeringatan } from "../../_admin_global/admin_notifikasi/notifikasi_peringatan"; import AdminGlobal_ComponentBackButton from "../../_admin_global/back_button"; +import adminNotifikasi_funCreateToAllUser from "../../notifikasi/fun/create/fun_create_notif_to_all_user"; import adminNotifikasi_funCreateToUser from "../../notifikasi/fun/create/fun_create_notif_user"; + import ComponentAdminDonasi_CeritaPenggalangDana from "../component/tampilan_detail_cerita"; import ComponentAdminDonasi_TampilanDetailDonasi from "../component/tampilan_detail_donasi"; import { AdminDonasi_getOneById } from "../fun/get/get_one_by_id"; import { AdminDonasi_funUpdateStatusPublish } from "../fun/update/fun_status_publish"; import { AdminDonasi_funUpdateStatusReject } from "../fun/update/fun_status_reject"; -import { donasi_checkStatus } from "@/app_modules/donasi/fun"; -import { ComponentGlobal_NotifikasiPeringatan } from "@/app_modules/_global/notif_global"; -import adminNotifikasi_funCreateToAllUser from "../../notifikasi/fun/create/fun_create_notif_to_all_user"; -import { clientLogger } from "@/util/clientLogger"; -import { apiGetAllUserWithExceptId } from "@/app_modules/_global/lib/api_user"; -import Admin_ComponentModalPublish from "../../_admin_global/_component/comp_admin_modal_publish"; -import { MainColor } from "@/app_modules/_global/color"; +import { apiGetAdminDonasiById } from "../lib/api_fetch_admin_donasi"; +import SkeletonAdminDetailDonasiReview from "../component/skeleton_detail_donasi_review"; -export default function AdminDonasi_DetailReview({ - dataReview, -}: { - dataReview: MODEL_DONASI; -}) { - const [data, setData] = useState(dataReview); +export default function AdminDonasi_DetailReview() { + const params = useParams<{ id: string }>(); + const [data, setData] = useState(null); + useShallowEffect(() => { + const loadInitialData = async () => { + try { + const response = await apiGetAdminDonasiById({ + id: params.id, + }) + + if (response?.success && response?.data) { + setData(response.data); + } else { + console.error("Invalid data format recieved:", response); + setData(null); + } + } catch (error) { + clientLogger.error("Invalid data format recieved:", error); + setData(null); + } + } + loadInitialData(); + }) return ( <> - - - - - - + {!data ? ( + + ) : ( + <> + + + + + + + )} + ); } @@ -138,6 +163,7 @@ function ButtonOnHeader({ const newData = await AdminDonasi_getOneById(donasi?.id); setData(newData); + // router.back() ComponentAdminGlobal_NotifikasiBerhasil( "Berhasil Mengubah Status Donasi" ); @@ -273,36 +299,36 @@ function ButtonOnHeader({ } /> - - - } - buttonKanan={ - <> - - - } + opened={openedPublish} + onClose={closePublish} + title={"Anda yakin ingin publish donasi ini?"} + buttonKiri={ + <> + + + } + buttonKanan={ + <> + + + } /> diff --git a/src/app_modules/admin/donasi/detail/publish/detail_publish.tsx b/src/app_modules/admin/donasi/detail/publish/detail_publish.tsx index 347826b3..6a255814 100644 --- a/src/app_modules/admin/donasi/detail/publish/detail_publish.tsx +++ b/src/app_modules/admin/donasi/detail/publish/detail_publish.tsx @@ -38,34 +38,40 @@ import { TextInput, Title, } from "@mantine/core"; -import { useDisclosure } from "@mantine/hooks"; +import { useDisclosure, useShallowEffect } from "@mantine/hooks"; import { IconReload } from "@tabler/icons-react"; import _, { toNumber } from "lodash"; import moment from "moment"; -import { useRouter } from "next/navigation"; +import { useParams, useRouter } from "next/navigation"; import { useState } from "react"; import { adminDonasi_getListDonatur } from "../../fun/get/get_list_donatur_by_id"; import { AdminDonasi_getOneById } from "../../fun/get/get_one_by_id"; import adminDonasi_funUpdateStatusDanTotal from "../../fun/update/fun_update_status_dan_total"; import { ComponentAdminGlobal_TitlePage } from "@/app_modules/admin/_admin_global/_component"; import { AccentColor, AdminColor } from "@/app_modules/_global/color/color_pallet"; +import CustomSkeletonAdmin from "@/app_modules/admin/_admin_global/_component/skeleton/customSkeletonAdmin"; +import { apiGetAdminDonasiById } from "../../lib/api_fetch_admin_donasi"; +import { clientLogger } from "@/util/clientLogger"; +import SkeletonAdminDetailDonasiReject from "../../component/skeleton_detail donasi_reject"; +import SkeletonAdminDetailDonasiPublish from "../../component/skeleton_detail_donasi_publish"; export default function AdminDonasi_DetailPublish({ - dataPublish, + listDonatur, countDonatur, listPencairan, listMasterStatus, }: { - dataPublish: MODEL_DONASI; + listDonatur: any[]; countDonatur: number; listPencairan: MODEL_DONASI_PENCAIRAN_DANA[]; listMasterStatus: MODEL_NEW_DEFAULT_MASTER[]; }) { - const [dataDonasi, setDataDonasi] = useState(dataPublish); + const params = useParams<{ id: string }>(); + const [data, setData] = useState(null); const [pencairan, setPencairan] = useState(listPencairan); - const selectedData = _.omit(dataDonasi, [ + const selectedData = _.omit(data, [ "Author", "imageDonasi", "CeritaDonasi", @@ -74,23 +80,50 @@ export default function AdminDonasi_DetailPublish({ "DonasiMaster_Status", ]); + useShallowEffect(() => { + const loadInitialData = async () => { + try { + const response = await apiGetAdminDonasiById({ + id: params.id, + }) + + if (response?.success && response?.data) { + setTimeout(() => { + setData(response.data) + }, 3000); + } else { + console.log("Invalid data format recieved:", response); + setData(null) + } + } catch (error) { + clientLogger.error("Invalid data format recieved:", error); + setData(null); + } + } + loadInitialData(); + }) return ( <> {/*
{JSON.stringify(pencairan, null, 2)}
*/} - - - { - setDataDonasi(val); - }} - /> - + {!data ? + () : ( + <> + + + { + setData(val); + }} + /> + + + )} ); @@ -387,7 +420,7 @@ function TampilanListDonatur({
- +
@@ -757,17 +790,17 @@ function TampilanListPencairan({ color={AdminColor.softBlue} component={ - { - // onRelaod(); - }} - > - - - {/* ({ @@ -778,10 +811,10 @@ function TampilanListPencairan({ onSelect(val); }} /> */} - + } /> - + @@ -802,7 +835,7 @@ function TampilanListPencairan({ - + diff --git a/src/app_modules/admin/donasi/lib/api_fetch_admin_donasi.ts b/src/app_modules/admin/donasi/lib/api_fetch_admin_donasi.ts index 67d8f1db..baf8a5a7 100644 --- a/src/app_modules/admin/donasi/lib/api_fetch_admin_donasi.ts +++ b/src/app_modules/admin/donasi/lib/api_fetch_admin_donasi.ts @@ -2,7 +2,8 @@ export { apiGetAdminDonasiStatusCountDashboard, apiGetAdminDonasiKategoriCountDashboard, apiGetAdminDonasiByStatus, - apiGetAdminDonasiKategori + apiGetAdminDonasiKategori, + apiGetAdminDonasiById, }; const apiGetAdminDonasiStatusCountDashboard = async ({ name }: { name: "Publish" | "Review" | "Reject" }) => { @@ -81,4 +82,19 @@ const apiGetAdminDonasiKategori = async () => { } }) return await response.json().catch(() => null); +} +const apiGetAdminDonasiById = async ({id} : {id: string}) => { + const { token } = await fetch("/api/get-cookie").then((res) => res.json()); + if (!token) return await token.json().catch(() => null); + + const response = await fetch(`/api/admin/donasi/${id}`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Accept: "application/json", + "Access-Control-Allow-Origin": "*", + Authorization: `Bearer ${token}` + } + }) + return await response.json().catch(() => null); } \ No newline at end of file diff --git a/src/app_modules/admin/donasi/sub_menu/table_kategori.tsx b/src/app_modules/admin/donasi/sub_menu/table_kategori.tsx index 47a099d6..d8b9fef5 100644 --- a/src/app_modules/admin/donasi/sub_menu/table_kategori.tsx +++ b/src/app_modules/admin/donasi/sub_menu/table_kategori.tsx @@ -269,11 +269,11 @@ function TableView() { {isCreate ? ( - + Tambah Kategori} + label={Tambah Kategori} placeholder="Masukan kategori baru" onChange={(val) => { setCreate(val.currentTarget.value); @@ -313,11 +313,11 @@ function TableView() { )} {isUpdate ? ( - + Update Kategori} + label={Update Kategori} placeholder="Update kategori" onChange={(val) => { const data = _.clone(updateKategori); diff --git a/src/app_modules/admin/vote/child/table_reject/index.tsx b/src/app_modules/admin/vote/child/table_reject/index.tsx index 0a69f776..467d3802 100644 --- a/src/app_modules/admin/vote/child/table_reject/index.tsx +++ b/src/app_modules/admin/vote/child/table_reject/index.tsx @@ -281,6 +281,7 @@ function TableStatus() {
Judul
DeskripsiDeskripsi
Bukti Transfer