Alur pembayaran donasi

# feat
- Tampilan invoce
- Proses acc admin
- Transaksi berhasil
# Issue: Hitungan progres masih salah
This commit is contained in:
2024-01-08 13:56:14 +08:00
parent 4fc158bdc5
commit b4fe35e7d8
113 changed files with 2840 additions and 1274 deletions

View File

@@ -1,159 +0,0 @@
"use client";
import {
AspectRatio,
Box,
Divider,
Grid,
Group,
Image,
Pagination,
Paper,
Progress,
ScrollArea,
SimpleGrid,
Stack,
Table,
Text,
Title,
} from "@mantine/core";
import AdminDonasi_TombolKembali from "../component/tombol_kembali";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import {
IconClover,
IconMessageChatbot,
IconMoneybag,
} from "@tabler/icons-react";
import router from "next/router";
import moment from "moment";
export default function AdminDonasi_DetailPublish() {
return (
<>
<Stack>
<AdminDonasi_TombolKembali />
<SimpleGrid
cols={2}
spacing="lg"
breakpoints={[
{ maxWidth: "md", cols: 2, spacing: "md" },
{ maxWidth: "sm", cols: 1, spacing: "sm" },
{ maxWidth: "xs", cols: 1, spacing: "xs" },
]}
>
<TampilanDetailDonasi />
<TampilanListDonatur />
</SimpleGrid>
</Stack>
</>
);
}
function TampilanDetailDonasi() {
return (
<>
<Paper radius={"md"} bg={"blue.1"} p={"md"}>
<Stack>
<Stack>
<AspectRatio ratio={16 / 9}>
<Paper radius={"md"}>
<Image alt="Foto" src={"/aset/no-img.png"} />
</Paper>
</AspectRatio>
<Title order={4}>Judul Donasi</Title>
<Stack spacing={0}>
<Group position="apart">
<Stack spacing={0}>
<Text fz={12}>Dana dibutuhkan</Text>
<Title order={4} c="blue">
Rp. 50.000.000
</Title>
</Stack>
<Text fz={"xs"}>
Sisa hari{" "}
<Text span inherit fw={"bold"}>
100
</Text>{" "}
</Text>
</Group>
</Stack>
<Progress size={"lg"} value={50} />
{/* <Grid>
<Grid.Col
span={"auto"}
// onClick={() => router.push(RouterDonasi.donatur)}
>
<Stack align="center" spacing={"xs"}>
<Group>
<IconClover color="skyblue" />
<Text>50</Text>
</Group>
<Text>Donatur</Text>
</Stack>
</Grid.Col>
<Divider orientation="vertical" />
<Grid.Col
span={"auto"}
// onClick={() => router.push(RouterDonasi.kabar)}
>
<Stack spacing={"sm"} align="center">
<IconMessageChatbot color="skyblue" />
<Text>Kabar Terbaru</Text>
</Stack>
</Grid.Col>
<Divider orientation="vertical" />
<Grid.Col
span={"auto"}
// onClick={() => router.push(RouterDonasi.pencairan_dana)}
>
<Stack spacing={"sm"} align="center">
<IconMoneybag color="skyblue" />
<Text>Pencairan Dana</Text>
</Stack>
</Grid.Col>
</Grid> */}
</Stack>
</Stack>
</Paper>
</>
);
}
function TampilanListDonatur() {
const tableRows = Array(10)
.fill(0)
.map((e, i) => (
<tr key={i}>
<td>User {`${i + 1}`}</td>
<td>
Rp.{" "}
{`${new Intl.NumberFormat("id-ID", {
maximumFractionDigits: 10,
}).format(i + 100000)}`}
</td>
<td> {`${moment(Date.now()).format("ll")}`}</td>
</tr>
));
return (
<>
<Paper radius={"md"} bg={"cyan.1"} p={"md"}>
<Stack>
<Title order={4}>List Donatur</Title>
<ScrollArea h={300}>
<Table>
<thead>
<tr>
<th>Nama</th>
<th>Jumlah Donasi</th>
<th>Tanggal Donasi</th>
</tr>
</thead>
<tbody>{tableRows}</tbody>
</Table>
</ScrollArea>
</Stack>
</Paper>
</>
);
}

View File

@@ -1,17 +1,115 @@
"use client";
import { Button, Stack, Text } from "@mantine/core";
import { MODEL_DONASI } from "@/app_modules/donasi/model/interface";
import {
AspectRatio,
Button,
Divider,
Group,
Image,
Paper,
SimpleGrid,
Stack,
Text,
Title,
} from "@mantine/core";
import { useState } from "react";
import AdminDonasi_TombolKembali from "../component/tombol_kembali";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah";
export default function AdminDonasi_DetailReject({
closeModal,
dataReject,
}: {
closeModal: any;
dataReject: MODEL_DONASI;
}) {
const [donasi, setDonasi] = useState(dataReject);
return (
<>
<Stack>
<Text>Cooming Soon</Text>
<Button onClick={() => closeModal()}>close</Button>
<ButtonOnHeader />
<SimpleGrid
cols={2}
spacing="lg"
breakpoints={[
{ maxWidth: "md", cols: 2, spacing: "md" },
{ maxWidth: "sm", cols: 1, spacing: "sm" },
{ maxWidth: "xs", cols: 1, spacing: "xs" },
]}
>
<TampilanDetailDonasi donasi={donasi} />
<CatatanReject catatan={donasi.catatan} />
</SimpleGrid>
</Stack>
</>
);
}
function ButtonOnHeader() {
return (
<>
<Stack>
<Group position="apart">
<AdminDonasi_TombolKembali />
<Button radius={"xl"} bg={"orange"} color="orange">
Tambah catatan
</Button>
</Group>
<Divider />
</Stack>
</>
);
}
function TampilanDetailDonasi({ donasi }: { donasi: MODEL_DONASI }) {
return (
<>
<Paper radius={"md"} p={"md"}>
<Stack>
<Stack>
<AspectRatio ratio={16 / 9}>
<Paper radius={"md"}>
<Image
alt="Foto"
src={RouterDonasi.api_gambar + `${donasi.imagesId}`}
/>
</Paper>
</AspectRatio>
<Stack spacing={0}>
<Title order={4}>{donasi.title}</Title>
<Text fz={"xs"}>
Durasi: {donasi.DonasiMaster_Durasi.name} hari
</Text>
</Stack>
<Stack spacing={0}>
<Group>
<Text fz={12}>Dana dibutuhkan</Text>
<Title order={4} c="blue">
<TampilanRupiahDonasi nominal={+donasi.target} />
</Title>
</Group>
<Group>
<Text fz={12}>Kategori</Text>
<Title order={4} c="blue">
{donasi.DonasiMaster_Ketegori.name}
</Title>
</Group>
</Stack>
</Stack>
</Stack>
</Paper>
</>
);
}
function CatatanReject({ catatan }: { catatan: string }) {
return (
<>
<Stack>
<Title order={6}>Alasan Penolakan</Title>
<Text>{catatan}</Text>
</Stack>
</>
);

View File

@@ -84,7 +84,7 @@ function ButtonOnHeader({ donasi }: { donasi: MODEL_DONASI }) {
(res) => {
if (res.status === 200) {
NotifBerhasil(res.message);
router.back()
router.back();
} else {
NotifGagal(res.message);
}

View File

@@ -0,0 +1,222 @@
"use client";
import {
AspectRatio,
Badge,
Box,
Button,
Center,
Divider,
Grid,
Group,
Image,
Pagination,
Paper,
Progress,
ScrollArea,
SimpleGrid,
Stack,
Table,
Text,
Title,
} from "@mantine/core";
import AdminDonasi_TombolKembali from "../../component/tombol_kembali";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import {
IconClover,
IconMessageChatbot,
IconMoneybag,
} from "@tabler/icons-react";
import router from "next/router";
import moment from "moment";
import {
MODEL_DONASI,
MODEL_DONASI_INVOICE,
} from "@/app_modules/donasi/model/interface";
import { useState } from "react";
import { RouterAdminDonasi } from "@/app/lib/router_hipmi/router_admin";
import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah";
import _ from "lodash";
import { useRouter } from "next/navigation";
import { useInterval, useShallowEffect } from "@mantine/hooks";
import { Donasi_getOneById } from "@/app_modules/donasi/fun/get/get_one_donasi_by_id";
export default function AdminDonasi_DetailPublish({
dataPublish,
listDonatur,
countDonatur,
}: {
dataPublish: MODEL_DONASI;
listDonatur: any[];
countDonatur: number;
}) {
const [donasi, setDonasi] = useState(dataPublish);
const [donatur, setDoanutur] = useState(listDonatur);
const interval = useInterval(() => reloadData(donasi.id), 5000);
useShallowEffect(() => {
interval.start();
}, []);
async function reloadData(donasiId: string) {
const data = await Donasi_getOneById(donasiId);
setDonasi(data as any)
return data;
}
return (
<>
{/* <pre>{JSON.stringify(donatur.map((e) => e), null, 2)}</pre> */}
<Stack>
<AdminDonasi_TombolKembali />
<TampilanDetailDonasi donasi={donasi} countDonatur={countDonatur} />
<TampilanListDonatur donatur={donatur} donasi={donasi} />
</Stack>
</>
);
}
function TampilanDetailDonasi({
donasi,
countDonatur,
}: {
donasi: MODEL_DONASI;
countDonatur: number;
}) {
return (
<>
<Paper radius={"md"} p={"md"}>
<Stack>
<Grid>
<Grid.Col span={6}>
<AspectRatio ratio={16 / 9}>
<Paper radius={"md"}>
<Image
alt="Foto"
src={RouterDonasi.api_gambar + `${donasi.imagesId}`}
/>
</Paper>
</AspectRatio>
</Grid.Col>
<Grid.Col span={6}>
<Stack spacing={7}>
<Title order={4}>{donasi.title}</Title>
<Text fz={"xs"}>
Durasi: {donasi.DonasiMaster_Durasi.name} hari
</Text>
<Group>
<Text fz={12}>Dana dibutuhkan</Text>
<Title order={5} c="blue">
<TampilanRupiahDonasi nominal={+donasi.target} />
</Title>
</Group>
<Group>
<Text fz={12}>Kategori</Text>
<Title order={5} c="blue">
{donasi.DonasiMaster_Ketegori.name}
</Title>
</Group>
<Group>
<Text fz={12}>Total donatur</Text>
<Title order={5} c="blue">
{countDonatur}
</Title>
</Group>
<Group>
<Text fz={12}>Progres</Text>
<Title order={5} c="blue">
{donasi.progres} %
</Title>
</Group>
<Group>
<Text fz={12}>Dana terkumpul</Text>
<Title order={5} c="blue">
<TampilanRupiahDonasi nominal={+donasi.terkumpul} />
</Title>
</Group>
</Stack>
</Grid.Col>
</Grid>
</Stack>
</Paper>
</>
);
}
function TampilanListDonatur({
donatur,
donasi,
}: {
donatur: MODEL_DONASI_INVOICE[];
donasi: MODEL_DONASI;
}) {
const router = useRouter();
const tableRows = donatur.map((e, i) => (
<tr key={i}>
<td>{e.Author.username}</td>
<td>
<TampilanRupiahDonasi nominal={+e.nominal} />
</td>
<td> {`${moment(e.createdAt).format("ll")}`}</td>
<td>
<Center>
<Badge w={150} variant="dot">
{e.DonasiMaster_StatusInvoice.name}
</Badge>
</Center>
</td>
</tr>
));
return (
<>
<Paper radius={"md"} p={"md"}>
<Stack>
<Group position="apart">
<Title order={3}>Update List Donatur</Title>
<Button
radius={"xl"}
variant="outline"
onClick={() =>
router.push(RouterAdminDonasi.proses_transaksi + `${donasi.id}`)
}
>
Proses transaksi
</Button>
</Group>
{_.isEmpty(donatur) ? (
<Paper bg={"gray.1"} p={"xs"}>
<Center>BELUM ADA DONATUR</Center>
</Paper>
) : (
<Paper withBorder p={"xs"}>
<Table>
<thead>
<tr>
<th>Nama Donatur</th>
<th>Jumlah Donasi</th>
<th>Tanggal</th>
<th>
<Center>Status</Center>
</th>
{/* <th>
<Center>Aksi</Center>
</th> */}
</tr>
</thead>
<tbody>{tableRows}</tbody>
</Table>
</Paper>
)}
{/* <Group position="apart">
{[{ id: 1 }, { id: 2 },{ id: 3 }, { id: 4 }].map((e, i) => (
<Button key={i}>Status</Button>
))}
</Group> */}
</Stack>
</Paper>
</>
);
}

View File

@@ -0,0 +1,153 @@
"use client";
import {
ActionIcon,
Box,
Button,
Center,
Group,
HoverCard,
Paper,
Stack,
Table,
Text,
Title,
} from "@mantine/core";
import AdminDonasi_TombolKembali from "../../component/tombol_kembali";
import { MODEL_DONASI_INVOICE } from "@/app_modules/donasi/model/interface";
import { useState } from "react";
import moment from "moment";
import { IconQuestionMark } from "@tabler/icons-react";
import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah";
import { AdminDonasi_funUpdateStatusInvoice } from "../../fun/update/fun_update_status_invoice";
import { NotifBerhasil } from "@/app_modules/donasi/component/notifikasi/notif_berhasil";
import { NotifGagal } from "@/app_modules/donasi/component/notifikasi/notif_gagal";
import { AdminDonasi_getListStatusInvoiceProses } from "../../fun/get/get_list_status_invoice_proses";
import { AdminDonasi_funUpdateProgresDanTerkumpul } from "../../fun/update/fun_update_progres_dan_terkumpul";
export default function AdminDonasi_ProsesTransaksi({
listProses,
}: {
listProses: MODEL_DONASI_INVOICE[];
}) {
const [invoice, setInvoice] = useState<MODEL_DONASI_INVOICE[] | any[]>(
listProses
);
async function onClick(invoice: MODEL_DONASI_INVOICE) {
let nominal: number = +invoice.nominal;
let terkumpulSementaras: number = +invoice.Donasi.terkumpul;
const totalTerkumpul = terkumpulSementaras + nominal;
await AdminDonasi_funUpdateStatusInvoice(invoice.id, "1").then(
async (res) => {
if (res.status === 200) {
NotifBerhasil(res.message);
await AdminDonasi_funUpdateProgresDanTerkumpul(
invoice.Donasi.id,
totalTerkumpul
).then(async (res) => {
if (res.status === 200) {
await AdminDonasi_getListStatusInvoiceProses(
invoice.Donasi.id
).then((res) => {
setInvoice(res);
});
} else {
NotifGagal(res.message);
}
});
} else {
NotifGagal(res.message);
}
}
);
}
const rowTable = invoice.map((e) => (
<tr key={e.id}>
<td>{e.Author.username}</td>
<td>
<TampilanRupiahDonasi nominal={+e.nominal} />
</td>
<td>
<Center>{e.DonasiMaster_Bank.name}</Center>
</td>
<td>{`${moment(e.createdAt).format("ll")}`}</td>
<td>
<Center>
<Button
radius={"xl"}
variant="outline"
color="green"
onClick={() => onClick(e)}
>
Accept
</Button>
</Center>{" "}
</td>
</tr>
));
return (
<>
{/* <pre>{JSON.stringify(invoice, null, 2)}</pre> */}
<Stack>
<AdminDonasi_TombolKembali />
<Stack>
<HeaderPage />
<Paper p={"md"} withBorder>
<Table>
<thead>
<tr>
<th>Nama</th>
<th>Nominal</th>
<th>
<Center>Metode Pembayaran</Center>
</th>
<th>Tanggal</th>
<th>
<Center>Aksi</Center>
</th>
</tr>
</thead>
<tbody>{rowTable}</tbody>
</Table>
</Paper>
</Stack>
</Stack>
</>
);
}
function HeaderPage() {
return (
<>
<Group position="apart" px={"md"}>
<Title order={5}>Update Status Donatur</Title>
<Group position="left">
<HoverCard width={280} shadow="md">
<HoverCard.Target>
<ActionIcon bg={"gray.3"} radius={"xl"}>
<IconQuestionMark color="black" />
</ActionIcon>
</HoverCard.Target>
<HoverCard.Dropdown>
<Group spacing={4}>
<Text fz="sm">Sebelum melakukan aksi</Text>
<Text fz="sm" fw={"bold"} c={"green"}>
ACCEPT
</Text>
<Text fz={"sm"}>
Pastikan kembali transaksi donatur sesuai dengan mutasi pada
Bank tertuju
</Text>
</Group>
</HoverCard.Dropdown>
</HoverCard>
</Group>
</Group>
</>
);
}

View File

@@ -0,0 +1,13 @@
"use server";
import prisma from "@/app/lib/prisma";
export async function AdminDonasi_funCountDonatur(donasiId: string) {
const donatur = await prisma.donasi_Invoice.count({
where: {
donasiId: donasiId
}
});
return donatur;
}

View File

@@ -0,0 +1,23 @@
"use server";
import prisma from "@/app/lib/prisma";
export async function AdminDonasi_getListDonatur(donasiId: string) {
// console.log(donasiId)
const data = await prisma.donasi_Invoice.findMany({
where: {
donasiId: donasiId,
},
select: {
id: true,
nominal: true,
createdAt: true,
Author: true,
DonasiMaster_StatusInvoice: true
},
});
// console.log(data)
return data;
}

View File

@@ -0,0 +1,48 @@
"use server";
import prisma from "@/app/lib/prisma";
export async function AdminDonasi_getListStatusInvoiceProses(donasiId: string) {
const dataStatus = await prisma.donasi_Invoice.findMany({
where: {
donasiId: donasiId,
donasiMaster_StatusInvoiceId: {
equals: "2",
},
},
select: {
id: true,
nominal: true,
createdAt: true,
Author: true,
Donasi: {
select: {
id: true,
title: true,
target: true,
active: true,
createdAt: true,
updatedAt: true,
publishTime: true,
catatan: true,
terkumpul: true,
authorId: 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,
},
},
DonasiMaster_Bank: true,
DonasiMaster_StatusInvoice: true,
},
});
return dataStatus;
}

View File

@@ -15,6 +15,9 @@ export async function AdminDonasi_getById(id: string) {
createdAt: true,
updatedAt: true,
publishTime: true,
catatan: true,
progres: true,
terkumpul: true,
authorId: true,
imagesId: true,
donasiMaster_KategoriId: true,

View File

@@ -22,7 +22,7 @@ export async function AdminDonasi_funUpdateStatusPublish(
});
if (!data) return { status: 400, message: "Data tidak ditemukan" };
revalidatePath(RouterAdminDonasi.table_review);
revalidatePath("/dev/admin/donasi/table/review");
return {
status: 200,
message: "Status berhasil diganti",

View File

@@ -10,19 +10,18 @@ export async function AdminDonasi_funUpdateStatusReject(
statusId: string,
catatan: string
) {
const data = await prisma.donasi.update({
where: {
id: donasiId,
},
data: {
donasiMaster_StatusDonasiId: statusId,
catatan: catatan
catatan: catatan,
},
});
if (!data) return { status: 400, message: "Data tidak ditemukan" };
revalidatePath(RouterAdminDonasi.table_review);
revalidatePath("/dev/admin/donasi/table/review");
return {
status: 200,
message: "Status berhasil diganti",

View File

@@ -0,0 +1,38 @@
"use server";
import prisma from "@/app/lib/prisma";
export async function AdminDonasi_funUpdateProgresDanTerkumpul(
donasiId: string,
terkumpul: number
) {
const danaTerkumpul = terkumpul.toString();
const update = await prisma.donasi.update({
where: {
id: donasiId,
},
data: {
terkumpul: danaTerkumpul,
},
});
if (!update) return { status: 400, message: "Update dana terkumpul gagal" };
let target: number = +update.target;
let totalTerkumpul = Number(update.terkumpul);
let progresSementarsa = Number(update.progres);
const progress = (totalTerkumpul / target) * 100;
const totalProgres = progresSementarsa + progress;
const updateProgres = await prisma.donasi.update({
where: { id: donasiId },
data: { progres: totalProgres.toString() },
});
if (!updateProgres) return { status: 400, message: "Update progres gagal" };
return {
status: 200,
message: "Berhasil update data donasi",
};
}

View File

@@ -0,0 +1,25 @@
"use server";
import prisma from "@/app/lib/prisma";
import { RouterAdminDonasi } from "@/app/lib/router_hipmi/router_admin";
import { revalidatePath } from "next/cache";
export async function AdminDonasi_funUpdateStatusInvoice(
invoiceId: string,
statusId: string
) {
const update = await prisma.donasi_Invoice.update({
where: {
id: invoiceId,
},
data: {
donasiMaster_StatusInvoiceId: statusId,
},
});
if (!update) return { status: 400, message: "Update gagal" };
revalidatePath("/dev/admin/donasi/detail/publish")
return {
status: 200,
message: "Update berhasil",
};
}

View File

@@ -1,10 +1,11 @@
import AdminDonasi_Main from "./main";
import AdminDonasi_TablePublish from "./table_status/table_publish";
import AdminDonasi_DetailPublish from "./detail_table/detail_publish";
import AdminDonasi_DetailPublish from "./detail_table/publish/detail_publish";
import AdminDonasi_TableReview from "./table_status/table_review";
import AdminDonasi_DetailReview from "./detail_table/detail_review";
import AdminDonasi_TableReject from "./table_status/table_reject";
import AdminDonasi_DetailReject from "./detail_table/detail_reject";
import AdminDonasi_ProsesTransaksi from "./detail_table/publish/proses_transaksi";
export {
AdminDonasi_Main,

View File

@@ -37,9 +37,7 @@ export default function AdminDonasi_TablePublish({
function TableStatus({ listPublish }: { listPublish: MODEL_DONASI[] }) {
const router = useRouter();
const [donasi, setDonasi] = useState(listPublish);
async function onClick() {
router.push(RouterAdminDonasi.detail_publish);
}
const TableRows = donasi.map((e, i) => (
<tr key={i}>
@@ -57,7 +55,7 @@ function TableStatus({ listPublish }: { listPublish: MODEL_DONASI[] }) {
leftIcon={<IconEyeCheck />}
radius={"xl"}
variant="outline"
onClick={onClick}
onClick={() => router.push(RouterAdminDonasi.detail_publish + `${e.id}`)}
>
Tampilkan
</Button>

View File

@@ -42,17 +42,6 @@ function TableStatus({ dataReject }: { dataReject: MODEL_DONASI[] }) {
const [opened, { open, close }] = useDisclosure(false);
const [donasi, setDonasi] = useState(dataReject);
function onClick() {
return (
<Modal opened={opened} onClose={close} centered withCloseButton={false}>
<Stack>
<Title order={6}>Alasan penolakan</Title>
<Text>{"test"}</Text>
</Stack>
</Modal>
);
}
const TableRows = donasi.map((e, i) => (
<tr key={i}>
<td>{e.title}</td>
@@ -61,7 +50,6 @@ function TableStatus({ dataReject }: { dataReject: MODEL_DONASI[] }) {
</td>
<td>{e.DonasiMaster_Ketegori.name}</td>
<td>{e.DonasiMaster_Durasi.name} hari</td>
<td>{e.catatan}</td>
<td>
<Center>
<Button
@@ -70,20 +58,33 @@ function TableStatus({ dataReject }: { dataReject: MODEL_DONASI[] }) {
leftIcon={<IconEyeCheck />}
radius={"xl"}
variant="outline"
onClick={() => {
onClick()
// onClick(e.catatan);
}}
onClick={() => router.push(RouterAdminDonasi.detail_reject + `${e.id}`)}
>
Tampilkan
</Button>
</Center>
{/* <ModalReject opened={opened} close={close} /> */}
</td>
</tr>
));
return (
<>
{donasi.map((e,i) => (
<Modal
key={e.id}
opened={opened}
onClose={close}
centered
withCloseButton={false}
>
<Stack>
<Title order={6}>Alasan penolakan</Title>
<Text>{i}</Text>
</Stack>
</Modal>
))}
<Box>
<Box bg={"red.1"} p={"xs"}>
<Title order={6} c={"red"}>
@@ -104,7 +105,6 @@ function TableStatus({ dataReject }: { dataReject: MODEL_DONASI[] }) {
<th>Target</th>
<th>Ketegori</th>
<th>Durasi</th>
<th>Catatan</th>
<th>
<Center>Lihat alasan</Center>
</th>
@@ -116,3 +116,16 @@ function TableStatus({ dataReject }: { dataReject: MODEL_DONASI[] }) {
</>
);
}
async function ModalReject(opened: any, close: any) {
return (
<>
<Modal opened={opened} onClose={close} centered withCloseButton={false}>
<Stack>
<Title order={6}>Alasan penolakan</Title>
<Text>{"test"}</Text>
</Stack>
</Modal>
</>
);
}