Donasi Info Admni

# feat
- info admin
- hapus admin
## Issue: Loading data belum untuk versi alfa
This commit is contained in:
2024-01-15 11:29:39 +08:00
parent 4af3f74a97
commit 01da30bdb5
128 changed files with 2316 additions and 507 deletions

View File

@@ -25,6 +25,7 @@ model User {
TransaksiInvestasi TransaksiInvestasi[] TransaksiInvestasi TransaksiInvestasi[]
Donasi Donasi[] Donasi Donasi[]
Donasi_Invoice Donasi_Invoice[] Donasi_Invoice Donasi_Invoice[]
Donasi_Notif Donasi_Notif[]
} }
model MasterUserRole { model MasterUserRole {
@@ -77,6 +78,8 @@ model Images {
CeritaDonasi Donasi_Cerita[] CeritaDonasi Donasi_Cerita[]
Donasi_TemporaryCreate Donasi_TemporaryCreate[] Donasi_TemporaryCreate Donasi_TemporaryCreate[]
Donasi_Kabar Donasi_Kabar[] Donasi_Kabar Donasi_Kabar[]
Donasi_PencairanDana Donasi_PencairanDana[]
Donasi_Invoice Donasi_Invoice[]
} }
model Katalog { model Katalog {
@@ -275,18 +278,22 @@ model MasterStatusTransaksiInvestasi {
TransaksiInvestasi TransaksiInvestasi[] TransaksiInvestasi TransaksiInvestasi[]
} }
// -------------------- DONASI --------------------- // /// ---------------------------------------- DONASI ----------------------------------------- //
model Donasi { model Donasi {
id String @id @default(cuid()) id String @id @default(cuid())
title String title String
target String target String
active Boolean @default(true) active Boolean @default(true)
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
publishTime DateTime? publishTime DateTime?
catatan String? catatan String?
progres String? @default("0") progres String? @default("0")
terkumpul String? @default("0") terkumpul String? @default("0")
namaBank String?
rekening String?
akumulasiPencairan Int? @default(0)
totalPencairan Int? @default(0)
Author User? @relation(fields: [authorId], references: [id]) Author User? @relation(fields: [authorId], references: [id])
authorId String? authorId String?
@@ -301,6 +308,7 @@ model Donasi {
donasiMaster_StatusDonasiId String? @default("2") donasiMaster_StatusDonasiId String? @default("2")
Donasi_Invoice Donasi_Invoice[] Donasi_Invoice Donasi_Invoice[]
Donasi_Kabar Donasi_Kabar[] Donasi_Kabar Donasi_Kabar[]
Donasi_PencairanDana Donasi_PencairanDana[]
} }
model Donasi_TemporaryCreate { model Donasi_TemporaryCreate {
@@ -395,6 +403,8 @@ model Donasi_Invoice {
donasiMaster_StatusInvoiceId String? @default("3") donasiMaster_StatusInvoiceId String? @default("3")
Author User? @relation(fields: [authorId], references: [id]) Author User? @relation(fields: [authorId], references: [id])
authorId String? authorId String?
Images Images? @relation(fields: [imagesId], references: [id])
imagesId String?
} }
model Donasi_Kabar { model Donasi_Kabar {
@@ -405,8 +415,36 @@ model Donasi_Kabar {
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
Donasi Donasi? @relation(fields: [donasiId], references: [id]) Donasi Donasi? @relation(fields: [donasiId], references: [id])
donasiId String?
ImagesKabar Images? @relation(fields: [imagesId], references: [id])
imagesId String?
Donasi_Notif Donasi_Notif[]
}
model Donasi_Notif {
id String @id @default(cuid())
isRead Boolean @default(false)
active Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
User User? @relation(fields: [userId], references: [id])
userId String?
Donasi_Kabar Donasi_Kabar? @relation(fields: [donasi_KabarId], references: [id])
donasi_KabarId String?
}
model Donasi_PencairanDana {
id String @id @default(cuid())
nominalCair Int
title String
deskripsi String
active Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
Donasi Donasi? @relation(fields: [donasiId], references: [id])
donasiId String? donasiId String?
ImagesKabar Images? @relation(fields: [imagesId], references: [id]) Images Images? @relation(fields: [imagesId], references: [id])
imagesId String? imagesId String?
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -0,0 +1,32 @@
import prisma from "@/app/lib/prisma";
import fs from "fs";
import { NextRequest, NextResponse } from "next/server";
export async function GET(
req: NextRequest,
{ params }: { params: { id: string } }
) {
const get = await prisma.images.findUnique({
where: {
id: params.id,
},
select: {
url: true,
},
});
if (!fs.existsSync(`./public/donasi/invoice/${get?.url}`)) {
const notFile = fs.readFileSync("./public/aset/global/no_img.png");
return new NextResponse(notFile, {
headers: {
"Content-Type": "image/png",
},
});
}
const file = fs.readFileSync(`./public/donasi/invoice/${get?.url}`);
return new NextResponse(file, {
headers: {
"Content-Type": "image/png",
},
});
}

View File

@@ -0,0 +1,34 @@
import prisma from "@/app/lib/prisma";
import fs from "fs";
import { NextRequest, NextResponse } from "next/server";
export async function GET(
req: NextRequest,
{ params }: { params: { id: string } }
) {
const get = await prisma.images.findUnique({
where: {
id: params.id,
},
select: {
url: true,
},
});
if (!fs.existsSync(`./public/donasi/pencairan/${get?.url}`)) {
const notFile = fs.readFileSync("./public/aset/global/no_img.png");
return new NextResponse(notFile, {
headers: {
"Content-Type": "image/png",
},
});
}
const file = fs.readFileSync(`./public/donasi/pencairan/${get?.url}`);
return new NextResponse(file, {
headers: {
"Content-Type": "image/png",
},
});
}

View File

@@ -1,17 +1,24 @@
import { AdminDonasi_DetailPublish } from "@/app_modules/admin/donasi"; import { AdminDonasi_DetailPublish } from "@/app_modules/admin/donasi";
import { AdminDonasi_funCountDonatur } from "@/app_modules/admin/donasi/fun/count/fun_count_donatur"; import { AdminDonasi_funCountDonatur } from "@/app_modules/admin/donasi/fun/count/fun_count_donatur";
import { AdminDonasi_getListDonatur } from "@/app_modules/admin/donasi/fun/get/get_list_donatur_by_id"; import { AdminDonasi_getListDonatur } from "@/app_modules/admin/donasi/fun/get/get_list_donatur_by_id";
import { AdminDonasi_getById } from "@/app_modules/admin/donasi/fun/get/get_one_by_id"; import { AdminDonasi_getListPencairanDana } from "@/app_modules/admin/donasi/fun/get/get_list_pencairan_dana_by_id";
import { AdminDonasi_getOneById } from "@/app_modules/admin/donasi/fun/get/get_one_by_id";
export default async function Page({params}: {params: {id: string}}) {
const dataPublish = await AdminDonasi_getById(params.id)
const listDonatur = await AdminDonasi_getListDonatur(params.id)
const countDonatur = await AdminDonasi_funCountDonatur(params.id)
export default async function Page({ params }: { params: { id: string } }) {
const dataPublish = await AdminDonasi_getOneById(params.id);
const listDonatur = await AdminDonasi_getListDonatur(params.id);
const countDonatur = await AdminDonasi_funCountDonatur(params.id);
const listPencairan = await AdminDonasi_getListPencairanDana(params.id);
// console.log(listDonatur)
return ( return (
<> <>
<AdminDonasi_DetailPublish dataPublish={dataPublish as any} listDonatur={listDonatur} countDonatur={countDonatur} /> <AdminDonasi_DetailPublish
dataPublish={dataPublish as any}
listDonatur={listDonatur}
countDonatur={countDonatur}
listPencairan={listPencairan as any}
/>
</> </>
); );
} }

View File

@@ -1,8 +1,8 @@
import { AdminDonasi_DetailReject } from "@/app_modules/admin/donasi"; import { AdminDonasi_DetailReject } from "@/app_modules/admin/donasi";
import { AdminDonasi_getById } from "@/app_modules/admin/donasi/fun/get/get_one_by_id"; import { AdminDonasi_getOneById } from "@/app_modules/admin/donasi/fun/get/get_one_by_id";
export default async function Page({ params }: { params: { id: string } }) { export default async function Page({ params }: { params: { id: string } }) {
const dataReject = await AdminDonasi_getById(params.id); const dataReject = await AdminDonasi_getOneById(params.id);
return ( return (
<> <>

View File

@@ -1,9 +1,9 @@
import { AdminDonasi_DetailReview } from "@/app_modules/admin/donasi"; import { AdminDonasi_DetailReview } from "@/app_modules/admin/donasi";
import { AdminDonasi_getById } from "@/app_modules/admin/donasi/fun/get/get_one_by_id"; import { AdminDonasi_getOneById } from "@/app_modules/admin/donasi/fun/get/get_one_by_id";
export default async function Page({params}: {params: {id: string}}) { export default async function Page({params}: {params: {id: string}}) {
// console.log(params.id) // console.log(params.id)
const dataReview = await AdminDonasi_getById(params.id) const dataReview = await AdminDonasi_getOneById(params.id)
// console.log(dataReview) // console.log(dataReview)
return <AdminDonasi_DetailReview dataReview={dataReview as any}/> return <AdminDonasi_DetailReview dataReview={dataReview as any}/>
} }

View File

@@ -0,0 +1,6 @@
import { AdminDonasi_PencairanDana } from "@/app_modules/admin/donasi";
export default async function Page({ params }: { params: { id: string } }) {
let donasiId = params.id;
return <AdminDonasi_PencairanDana donasiId={donasiId} />;
}

View File

@@ -1,4 +1,5 @@
import AdminDonasi_ProsesTransaksi from "@/app_modules/admin/donasi/detail_table/publish/proses_transaksi";
import { AdminDonasi_ProsesTransaksi } from "@/app_modules/admin/donasi";
import { AdminDonasi_getListStatusInvoiceProses } from "@/app_modules/admin/donasi/fun/get/get_list_status_invoice_proses"; import { AdminDonasi_getListStatusInvoiceProses } from "@/app_modules/admin/donasi/fun/get/get_list_status_invoice_proses";
export default async function Page({params}: {params: {id: string}}) { export default async function Page({params}: {params: {id: string}}) {

View File

@@ -1,5 +1,5 @@
import { AdminDonasi_TablePublish } from "@/app_modules/admin/donasi"; import { AdminDonasi_TablePublish } from "@/app_modules/admin/donasi";
import { AdminDonasi_getByStatus } from "@/app_modules/admin/donasi/fun/get/get_donasi_by_status"; import { AdminDonasi_getByStatus } from "@/app_modules/admin/donasi/fun/get/get_list_donasi_by_status";
export default async function Page() { export default async function Page() {
const listPublish = await AdminDonasi_getByStatus("1") const listPublish = await AdminDonasi_getByStatus("1")

View File

@@ -1,5 +1,5 @@
import { AdminDonasi_TableReject } from "@/app_modules/admin/donasi"; import { AdminDonasi_TableReject } from "@/app_modules/admin/donasi";
import { AdminDonasi_getByStatus } from "@/app_modules/admin/donasi/fun/get/get_donasi_by_status"; import { AdminDonasi_getByStatus } from "@/app_modules/admin/donasi/fun/get/get_list_donasi_by_status";
export default async function Page() { export default async function Page() {
const dataReject = await AdminDonasi_getByStatus("4") const dataReject = await AdminDonasi_getByStatus("4")

View File

@@ -1,5 +1,5 @@
import { AdminDonasi_TableReview } from "@/app_modules/admin/donasi"; import { AdminDonasi_TableReview } from "@/app_modules/admin/donasi";
import { AdminDonasi_getByStatus } from "@/app_modules/admin/donasi/fun/get/get_donasi_by_status"; import { AdminDonasi_getByStatus } from "@/app_modules/admin/donasi/fun/get/get_list_donasi_by_status";
import { getToken_UserId } from "@/app_modules/fun/get_user_token"; import { getToken_UserId } from "@/app_modules/fun/get_user_token";
export default async function Page() { export default async function Page() {

View File

@@ -0,0 +1,14 @@
import { LayoutCreateDonasi } from "@/app_modules/donasi";
import React from "react";
export default async function Layout({
children,
}: {
children: React.ReactNode;
}) {
return (
<>
<LayoutCreateDonasi>{children}</LayoutCreateDonasi>
</>
);
}

View File

@@ -0,0 +1,10 @@
import { DetailKabarDonasi } from "@/app_modules/donasi";
import { Donasi_getOneKabar } from "@/app_modules/donasi/fun/get/get_one_kabar";
export default async function Page({params}: {params: {id: string}}) {
let kabarId = params.id
const dataDonasi = await Donasi_getOneKabar(kabarId)
return <DetailKabarDonasi dataDonasi={dataDonasi as any}/>
}

View File

@@ -1,5 +0,0 @@
import { DetailKabarDonasi } from "@/app_modules/donasi";
export default async function Page() {
return <DetailKabarDonasi/>
}

View File

@@ -1,16 +1,17 @@
import { DetailMainDonasi } from "@/app_modules/donasi"; import { DetailMainDonasi } from "@/app_modules/donasi";
import { Donasi_getCountDonatur } from "@/app_modules/donasi/fun/count/get_count_donatur"; import { Donasi_getCountDonatur } from "@/app_modules/donasi/fun/count/get_count_donatur";
import { Donasi_getOneById } from "@/app_modules/donasi/fun/get/get_one_donasi_by_id"; import { Donasi_getOneById } from "@/app_modules/donasi/fun/get/get_one_donasi_by_id";
import { getToken_UserId } from "@/app_modules/fun/get_user_token";
export default async function Page({ params }: { params: { id: string } }) { export default async function Page({ params }: { params: { id: string } }) {
let donasiId = params.id; let donasiId = params.id;
const dataDonasi = await Donasi_getOneById(donasiId); const dataDonasi = await Donasi_getOneById(donasiId);
const countDonatur = await Donasi_getCountDonatur(donasiId) const countDonatur = await Donasi_getCountDonatur(donasiId)
const userLoginId = await getToken_UserId();
return ( return (
<> <>
<DetailMainDonasi dataDonasi={dataDonasi as any} countDonatur={countDonatur} /> <DetailMainDonasi dataDonasi={dataDonasi as any} countDonatur={countDonatur} userLoginId={userLoginId}/>
</> </>
); );
} }

View File

@@ -0,0 +1,22 @@
import prisma from "@/app/lib/prisma";
import { LayoutDonasi_DetailNotif } from "@/app_modules/donasi";
import { Donasi_getOneKabar } from "@/app_modules/donasi/fun/get/get_one_kabar";
import React from "react";
export default async function Layout({
children,
params,
}: {
children: React.ReactNode;
params: { id: string };
}) {
let kabarId = params.id;
const dataKabar = await Donasi_getOneKabar(kabarId);
const donasiId = dataKabar?.donasiId
return (
<>
<LayoutDonasi_DetailNotif donasiId={donasiId as any}>{children}</LayoutDonasi_DetailNotif>
</>
);
}

View File

@@ -0,0 +1,9 @@
import { Donasi_DetailNotif } from "@/app_modules/donasi";
import { Donasi_getOneKabar } from "@/app_modules/donasi/fun/get/get_one_kabar";
export default async function Page({ params }: { params: { id: string } }) {
let kabarId = params.id;
const dataKabar = await Donasi_getOneKabar(kabarId);
return <Donasi_DetailNotif dataKabar={dataKabar as any} />;
}

View File

@@ -1,14 +1,18 @@
import { DetailPublishDonasi } from "@/app_modules/donasi"; import { DetailPublishDonasi } from "@/app_modules/donasi";
import { Donasi_getCountDonatur } from "@/app_modules/donasi/fun/count/get_count_donatur"; import { Donasi_getCountDonatur } from "@/app_modules/donasi/fun/count/get_count_donatur";
import { Donasi_getOneById } from "@/app_modules/donasi/fun/get/get_one_donasi_by_id"; import { Donasi_getOneById } from "@/app_modules/donasi/fun/get/get_one_donasi_by_id";
import { getToken_UserId } from "@/app_modules/fun/get_user_token";
export default async function Page({ params }: { params: { id: string } }) { export default async function Page({ params }: { params: { id: string } }) {
const dataPublish = await Donasi_getOneById(params.id); const dataPublish = await Donasi_getOneById(params.id);
const countDonatur= await Donasi_getCountDonatur(params.id) const countDonatur= await Donasi_getCountDonatur(params.id)
const userLoginId = await getToken_UserId();
console.log(userLoginId)
return ( return (
<> <>
<DetailPublishDonasi dataPublish={dataPublish as any} countDonatur={countDonatur} /> <DetailPublishDonasi dataPublish={dataPublish as any} countDonatur={countDonatur} userLoginId={userLoginId}/>
</> </>
); );
} }

View File

@@ -0,0 +1,14 @@
import { LayoutDonasi_EditRekening } from "@/app_modules/donasi";
import React from "react";
export default async function Layout({
children,
}: {
children: React.ReactNode;
}) {
return (
<>
<LayoutDonasi_EditRekening>{children}</LayoutDonasi_EditRekening>
</>
);
}

View File

@@ -0,0 +1,17 @@
import { Donasi_EditRekening } from "@/app_modules/donasi";
import { Donasi_getOneById } from "@/app_modules/donasi/fun/get/get_one_donasi_by_id";
export default async function Page({ params }: { params: { id: string } }) {
let donasiId = params.id;
const data = await Donasi_getOneById(donasiId);
const dataDonasi = {
id: data?.id,
namaBank: data?.namaBank,
rekening: data?.rekening,
};
return (
<>
<Donasi_EditRekening dataDonasi={dataDonasi as any} />
</>
);
}

View File

@@ -1,8 +1,23 @@
import { LayoutDonasi } from "@/app_modules/donasi"; import { LayoutDonasi } from "@/app_modules/donasi";
import { Donasi_getNotifByUserId } from "@/app_modules/donasi/fun/get/get_notif_by_user_id";
import { getToken_UserId } from "@/app_modules/fun/get_user_token";
import React from "react"; import React from "react";
export default async function Layout({children}: {children: React.ReactNode}) { export default async function Layout({
return <> children,
<LayoutDonasi>{children}</LayoutDonasi> }: {
children: React.ReactNode;
}) {
const userId = await getToken_UserId();
// const dataDonasi = await DOnasi_getList
const isRead = await Donasi_getNotifByUserId(userId).then((res) => res.map((val) => val.isRead))
// console.log(isRead)
return (
<>
<LayoutDonasi userId={userId} isRead={isRead as any}>
{children}
</LayoutDonasi>
</> </>
);
} }

View File

@@ -1,9 +1,14 @@
import { Donasi_NotifPage } from "@/app_modules/donasi"; import { Donasi_NotifPage } from "@/app_modules/donasi";
import { Donasi_getNotifByUserId } from "@/app_modules/donasi/fun/get/get_notif_by_user_id";
export default async function Page({ params }: { params: { id: string } }) {
let userId = params.id;
const dataNotif = await Donasi_getNotifByUserId(userId);
// console.log(dataNotif)
export default async function Page() {
return ( return (
<> <>
<Donasi_NotifPage /> <Donasi_NotifPage dataNotif={dataNotif as any} />
</> </>
); );
} }

View File

@@ -0,0 +1,25 @@
import { PencairanDanaDonasi } from "@/app_modules/donasi";
import ComponentDonasi_LoaderOverlay from "@/app_modules/donasi/component/loader_overlay";
import { NotifPeringatan } from "@/app_modules/donasi/component/notifikasi/notif_peringatan";
import { Donasi_getListPencairanDanaById } from "@/app_modules/donasi/fun/get/get_list_pencairan_dana_by_id";
import { Donasi_getTotalPencairanDanaById } from "@/app_modules/donasi/fun/get/get_pencairan_dana_by_id";
import { getToken_UserId } from "@/app_modules/fun/get_user_token";
import { Loader } from "@mantine/core";
export default async function Page({ params }: { params: { id: string } }) {
let donasiId = params.id;
const totalAkumulasi = await Donasi_getTotalPencairanDanaById(donasiId);
const listPencairan = await Donasi_getListPencairanDanaById(donasiId);
// if (authorId != totalAkumulasi?.authorId) return <><NotifPeringatan /></>
return (
<>
<PencairanDanaDonasi
totalAkumulasi={totalAkumulasi as any}
listPencairan={listPencairan as any}
/>
</>
);
}

View File

@@ -1,9 +0,0 @@
import { PencairanDanaDonasi } from "@/app_modules/donasi";
export default async function Page() {
return (
<>
<PencairanDanaDonasi />
</>
);
}

View File

@@ -15,6 +15,10 @@ export const RouterAdminInvestasi = {
}; };
export const RouterAdminDonasi = { export const RouterAdminDonasi = {
api_gambar_bukti_transfer: "/api/donasi/gambar_bukti_transfer/",
main_donasi: "/dev/admin/donasi/main", main_donasi: "/dev/admin/donasi/main",
// table // table
table_publish: "/dev/admin/donasi/table/publish", table_publish: "/dev/admin/donasi/table/publish",
@@ -28,7 +32,10 @@ export const RouterAdminDonasi = {
detail_reject: "/dev/admin/donasi/detail/reject/", detail_reject: "/dev/admin/donasi/detail/reject/",
// proses // proses
proses_transaksi: "/dev/admin/donasi/proses_transaksi/" proses_transaksi: "/dev/admin/donasi/proses_transaksi/",
pencairan_dana :"/dev/admin/donasi/pencairan_dana/",

View File

@@ -5,7 +5,7 @@ export const RouterDonasi = {
api_image: "/api/donasi/image/", api_image: "/api/donasi/image/",
api_image_cerita: "/api/donasi/image_cerita/", api_image_cerita: "/api/donasi/image_cerita/",
api_gambar_kabar: "/api/donasi/gambar_kabar/", api_gambar_kabar: "/api/donasi/gambar_kabar/",
api_gambar_pencairan: "/api/donasi/gambar_pencairan/",
//main //main
main_beranda: "/dev/donasi/main/beranda", main_beranda: "/dev/donasi/main/beranda",
@@ -13,7 +13,7 @@ export const RouterDonasi = {
main_donasi_saya: "/dev/donasi/main/donasi_saya", main_donasi_saya: "/dev/donasi/main/donasi_saya",
// create // create
create_donasi: "/dev/donasi/create_donasi", create_donasi: "/dev/donasi/create/create_donasi",
create_cerita_penggalang: "/dev/donasi/create/cerita_penggalang/", create_cerita_penggalang: "/dev/donasi/create/cerita_penggalang/",
create_kabar: "/dev/donasi/create/create_kabar/", create_kabar: "/dev/donasi/create/create_kabar/",
@@ -21,34 +21,33 @@ export const RouterDonasi = {
update_kabar: "/dev/donasi/edit/update_kabar/", update_kabar: "/dev/donasi/edit/update_kabar/",
edit_donasi: "/dev/donasi/edit/edit_donasi/", edit_donasi: "/dev/donasi/edit/edit_donasi/",
edit_cerita_penggalang: "/dev/donasi/edit/edit_cerita/", edit_cerita_penggalang: "/dev/donasi/edit/edit_cerita/",
edit_rekening: "/dev/donasi/edit/edit_rekening/",
//pop up //pop up
page_pop_up_create: "/dev/donasi/page_pop_up/create", page_pop_up_create: "/dev/donasi/page_pop_up/create",
//detail //detail
detail_main: "/dev/donasi/detail/detail_main/", detail_main: "/dev/donasi/detail/detail_main/",
detail_kabar: "/dev/donasi/detail/detail_kabar", detail_kabar: "/dev/donasi/detail/detail_kabar/",
detail_publish: "/dev/donasi/detail/detail_publish/", detail_publish: "/dev/donasi/detail/detail_publish/",
detail_review: "/dev/donasi/detail/detail_review/", detail_review: "/dev/donasi/detail/detail_review/",
detail_draft: "/dev/donasi/detail/detail_draft/", detail_draft: "/dev/donasi/detail/detail_draft/",
detail_reject: "/dev/donasi/detail/detail_reject/", detail_reject: "/dev/donasi/detail/detail_reject/",
detail_donasi_saya: "/dev/donasi/detail/detail_donasi_saya/", detail_donasi_saya: "/dev/donasi/detail/detail_donasi_saya/",
detail_notif: "/dev/donasi/detail/detail_notif/",
//alur donasi //alur donasi
donatur: "/dev/donasi/donatur/", donatur: "/dev/donasi/donatur/",
kabar: "/dev/donasi/kabar/", kabar: "/dev/donasi/kabar/",
pencairan_dana: "/dev/donasi/pencairan_dana", pencairan_dana: "/dev/donasi/pencairan_dana/",
penggalang_dana: "/dev/donasi/penggalang_dana/", penggalang_dana: "/dev/donasi/penggalang_dana/",
cerita_penggalang: "/dev/donasi/cerita_penggalang/", cerita_penggalang: "/dev/donasi/cerita_penggalang/",
list_kabar: "/dev/donasi/list_kabar/", list_kabar: "/dev/donasi/list_kabar/",
notif_page:"/dev/donasi/notif_page/", notif_page: "/dev/donasi/notif_page/",
// proses donasi // proses donasi
masukan_donasi: "/dev/donasi/proses_donasi/masukan_donasi/", masukan_donasi: "/dev/donasi/proses_donasi/masukan_donasi/",
metode_pembayaran: "/dev/donasi/proses_donasi/metode_pembayaran/", metode_pembayaran: "/dev/donasi/proses_donasi/metode_pembayaran/",
invoice: "/dev/donasi/proses_donasi/invoice/", invoice: "/dev/donasi/proses_donasi/invoice/",
proses_transaksi: "/dev/donasi/proses_donasi/proses_transaksi/", proses_transaksi: "/dev/donasi/proses_donasi/proses_transaksi/",
}; };

View File

@@ -4,7 +4,7 @@ import { Group, Button } from "@mantine/core";
import { IconChevronLeft } from "@tabler/icons-react"; import { IconChevronLeft } from "@tabler/icons-react";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
export default function AdminDonasi_TombolKembali() { export default function ComponentAdminDonasi_TombolKembali() {
const router = useRouter(); const router = useRouter();
return ( return (
<> <>

View File

@@ -7,16 +7,23 @@ import {
Divider, Divider,
Group, Group,
Image, Image,
Modal,
Paper, Paper,
SimpleGrid, SimpleGrid,
Stack, Stack,
Text, Text,
Textarea,
Title, Title,
} from "@mantine/core"; } from "@mantine/core";
import { useState } from "react"; import { useState } from "react";
import AdminDonasi_TombolKembali from "../component/tombol_kembali"; import ComponentAdminDonasi_TombolKembali from "../component/tombol_kembali";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi"; import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah"; import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah";
import { useDisclosure } from "@mantine/hooks";
import { AdminDonasi_funUpdateCatatanReject } from "../fun/update/fun_update_catatan_reject";
import { NotifBerhasil } from "@/app_modules/donasi/component/notifikasi/notif_berhasil";
import { NotifGagal } from "@/app_modules/donasi/component/notifikasi/notif_gagal";
import { AdminDonasi_getOneById } from "../fun/get/get_one_by_id";
export default function AdminDonasi_DetailReject({ export default function AdminDonasi_DetailReject({
dataReject, dataReject,
@@ -28,7 +35,11 @@ export default function AdminDonasi_DetailReject({
return ( return (
<> <>
<Stack> <Stack>
<ButtonOnHeader /> <ButtonOnHeader
catatan={donasi.catatan}
donasiId={donasi.id}
setDonasi={setDonasi}
/>
<SimpleGrid <SimpleGrid
cols={2} cols={2}
spacing="lg" spacing="lg"
@@ -46,18 +57,61 @@ export default function AdminDonasi_DetailReject({
); );
} }
function ButtonOnHeader() { function ButtonOnHeader({
catatan,
donasiId,
setDonasi,
}: {
catatan: string;
donasiId: string;
setDonasi: any;
}) {
const [catat, setCatat] = useState(catatan);
const [opened, { open, close }] = useDisclosure(false);
async function onUpdate() {
await AdminDonasi_funUpdateCatatanReject(donasiId, catat).then(
async (res) => {
if (res.status === 200) {
NotifBerhasil(res.message);
close();
await AdminDonasi_getOneById(donasiId).then((res) => setDonasi(res));
} else {
NotifGagal(res.message);
}
}
);
}
return ( return (
<> <>
<Stack> <Stack>
<Group position="apart"> <Group position="apart">
<AdminDonasi_TombolKembali /> <ComponentAdminDonasi_TombolKembali />
<Button radius={"xl"} bg={"orange"} color="orange"> <Button radius={"xl"} bg={"orange"} color="orange" onClick={open}>
Tambah catatan Tambah catatan
</Button> </Button>
</Group> </Group>
<Divider /> <Divider />
</Stack> </Stack>
<Modal
opened={opened}
onClose={close}
centered
title="Tambah catatan penolakan"
>
<Stack>
<Textarea
value={catat}
onChange={(val) => setCatat(val.target.value)}
/>
<Group position="right">
<Button radius="xl" onClick={() => onUpdate()}>
Simpan
</Button>
</Group>
</Stack>
</Modal>
</> </>
); );
} }

View File

@@ -16,7 +16,7 @@ import {
Textarea, Textarea,
Title, Title,
} from "@mantine/core"; } from "@mantine/core";
import AdminDonasi_TombolKembali from "../component/tombol_kembali"; import ComponentAdminDonasi_TombolKembali from "../component/tombol_kembali";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi"; import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah"; import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah";
import { import {
@@ -95,7 +95,7 @@ function ButtonOnHeader({ donasi }: { donasi: MODEL_DONASI }) {
return ( return (
<> <>
<Group position="apart"> <Group position="apart">
<AdminDonasi_TombolKembali /> <ComponentAdminDonasi_TombolKembali />
<Group> <Group>
<Button <Button
radius={"xl"} radius={"xl"}

View File

@@ -10,17 +10,20 @@ import {
Grid, Grid,
Group, Group,
Image, Image,
Modal,
Pagination, Pagination,
Paper, Paper,
Progress, Progress,
ScrollArea, ScrollArea,
SimpleGrid, SimpleGrid,
Spoiler,
Stack, Stack,
Table, Table,
Text, Text,
TextInput,
Title, Title,
} from "@mantine/core"; } from "@mantine/core";
import AdminDonasi_TombolKembali from "../../component/tombol_kembali"; import ComponentAdminDonasi_TombolKembali from "../../component/tombol_kembali";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi"; import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import { import {
IconClover, IconClover,
@@ -32,44 +35,50 @@ import moment from "moment";
import { import {
MODEL_DONASI, MODEL_DONASI,
MODEL_DONASI_INVOICE, MODEL_DONASI_INVOICE,
MODEL_DONASI_PENCAIRAN_DANA,
} from "@/app_modules/donasi/model/interface"; } from "@/app_modules/donasi/model/interface";
import { useState } from "react"; import { useState } from "react";
import { RouterAdminDonasi } from "@/app/lib/router_hipmi/router_admin"; import { RouterAdminDonasi } from "@/app/lib/router_hipmi/router_admin";
import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah"; import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah";
import _ from "lodash"; import _ from "lodash";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useInterval, useShallowEffect } from "@mantine/hooks"; import { useDisclosure, useInterval, useShallowEffect } from "@mantine/hooks";
import { Donasi_getOneById } from "@/app_modules/donasi/fun/get/get_one_donasi_by_id"; import { Donasi_getOneById } from "@/app_modules/donasi/fun/get/get_one_donasi_by_id";
import { AdminDonasi_getOneById } from "../../fun/get/get_one_by_id";
export default function AdminDonasi_DetailPublish({ export default function AdminDonasi_DetailPublish({
dataPublish, dataPublish,
listDonatur, listDonatur,
countDonatur, countDonatur,
listPencairan,
}: { }: {
dataPublish: MODEL_DONASI; dataPublish: MODEL_DONASI;
listDonatur: any[]; listDonatur: any[];
countDonatur: number; countDonatur: number;
listPencairan: MODEL_DONASI_PENCAIRAN_DANA[];
}) { }) {
const [donasi, setDonasi] = useState(dataPublish); const [donasi, setDonasi] = useState(dataPublish);
const [donatur, setDoanutur] = useState(listDonatur); const [donatur, setDoanutur] = useState(listDonatur);
const interval = useInterval(() => reloadData(donasi.id), 5000); const interval = useInterval(() => reloadData(donasi.id), 5000);
const [pencairan, setPencairan] = useState(listPencairan);
useShallowEffect(() => { useShallowEffect(() => {
interval.start(); interval.start();
}, []); }, []);
async function reloadData(donasiId: string) { async function reloadData(donasiId: string) {
const data = await Donasi_getOneById(donasiId); const data = await AdminDonasi_getOneById(donasiId);
setDonasi(data as any) setDonasi(data as any);
return data; return data;
} }
return ( return (
<> <>
{/* <pre>{JSON.stringify(donatur.map((e) => e), null, 2)}</pre> */} {/* <pre>{JSON.stringify(pencairan, null, 2)}</pre> */}
<Stack> <Stack>
<AdminDonasi_TombolKembali /> <ComponentAdminDonasi_TombolKembali />
<TampilanDetailDonasi donasi={donasi} countDonatur={countDonatur} /> <TampilanDetailDonasi donasi={donasi} countDonatur={countDonatur} />
<TampilanListDonatur donatur={donatur} donasi={donasi} /> <TampilanListDonatur donatur={donatur} donasi={donasi} />
<TampilanListPencairan pencairan={pencairan} />
</Stack> </Stack>
</> </>
); );
@@ -82,14 +91,16 @@ function TampilanDetailDonasi({
donasi: MODEL_DONASI; donasi: MODEL_DONASI;
countDonatur: number; countDonatur: number;
}) { }) {
const [opened, { open, close }] = useDisclosure(false);
const router = useRouter();
return ( return (
<> <>
<Paper radius={"md"} p={"md"}> <Paper radius={"md"} p={"md"}>
<Stack> <Stack>
<Grid> <Grid>
<Grid.Col span={6}> <Grid.Col md={6} lg={4}>
<AspectRatio ratio={16 / 9}> <AspectRatio ratio={16 / 9}>
<Paper radius={"md"}> <Paper radius={"md"} h={{ lg: 200, md: 200, sm: 200 }}>
<Image <Image
alt="Foto" alt="Foto"
src={RouterDonasi.api_gambar + `${donasi.imagesId}`} src={RouterDonasi.api_gambar + `${donasi.imagesId}`}
@@ -97,52 +108,134 @@ function TampilanDetailDonasi({
</Paper> </Paper>
</AspectRatio> </AspectRatio>
</Grid.Col> </Grid.Col>
<Grid.Col span={6}> <Grid.Col md={6} lg={4}>
<Stack spacing={7}> <Paper withBorder p={"sm"} mah={250} h={250}>
<Title order={4}>{donasi.title}</Title> <Stack spacing={5}>
<Text fz={"xs"}> <Title order={4}>{donasi.title}</Title>
Durasi: {donasi.DonasiMaster_Durasi.name} hari <Group>
</Text> <Text fz={"xs"}>Penggalang Dana</Text>
<Title order={5} c="blue">
{donasi.Author.username}
</Title>
</Group>
<Group>
<Text fz={12}>Durasi</Text>
<Title order={5} c="blue">
{donasi.DonasiMaster_Durasi.name} hari
</Title>
</Group>
<Group> <Group>
<Text fz={12}>Dana dibutuhkan</Text> <Text fz={12}>Dana dibutuhkan</Text>
<Title order={5} c="blue"> <Title order={5} c="blue">
<TampilanRupiahDonasi nominal={+donasi.target} /> <TampilanRupiahDonasi nominal={+donasi.target} />
</Title> </Title>
</Group> </Group>
<Group> <Group>
<Text fz={12}>Kategori</Text> <Text fz={12}>Kategori</Text>
<Title order={5} c="blue"> <Title order={5} c="blue">
{donasi.DonasiMaster_Ketegori.name} {donasi.DonasiMaster_Ketegori.name}
</Title> </Title>
</Group> </Group>
<Group> <Group>
<Text fz={12}>Total donatur</Text> <Text fz={12}>Total donatur</Text>
<Title order={5} c="blue"> <Title order={5} c="blue">
{countDonatur} {countDonatur}
</Title> </Title>
</Group> </Group>
<Group> <Group>
<Text fz={12}>Progres</Text> <Text fz={12}>Progres</Text>
<Title order={5} c="blue"> <Title order={5} c="blue">
{donasi.progres} % {donasi.progres} %
</Title> </Title>
</Group> </Group>
<Group> <Group>
<Text fz={12}>Dana terkumpul</Text> <Text fz={12}>Dana terkumpul</Text>
<Title order={5} c="blue"> <Title order={5} c="blue">
<TampilanRupiahDonasi nominal={+donasi.terkumpul} /> <TampilanRupiahDonasi nominal={+donasi.terkumpul} />
</Title> </Title>
</Group> </Group>
</Stack> {/* <Button w={200} bg={"green.5"} color="green">Pencairan Dana</Button> */}
</Stack>
</Paper>
</Grid.Col>
<Grid.Col md={6} lg={4}>
<Paper withBorder p={"sm"} mah={250} h={250}>
<Stack spacing={"xl"}>
<Center>
<Title order={4}>Pencairan Dana</Title>
</Center>
<Grid>
<Grid.Col span={"auto"}>
<Stack spacing={0}>
<Text fz={"xs"}>Total Dana Dicairkan</Text>
<Title>
<TampilanRupiahDonasi
nominal={donasi.totalPencairan}
fontSize={14}
/>
</Title>
</Stack>
</Grid.Col>
<Grid.Col span={"auto"}>
<Stack spacing={0}>
<Text fz={"xs"}>Bank Tujuan</Text>
<Title order={6}>{donasi.namaBank}</Title>
</Stack>
</Grid.Col>
</Grid>
<Grid>
<Grid.Col span={"auto"}>
<Stack spacing={0}>
<Text fz={"xs"}>Akumulasi Pencairan</Text>
<Title order={6}>
{donasi.akumulasiPencairan} Kali
</Title>
</Stack>
</Grid.Col>
<Grid.Col span={"auto"}>
<Stack spacing={0}>
<Text fz={"xs"}>Nomor Rekening</Text>
<Title order={6}>{donasi.rekening}</Title>
</Stack>
</Grid.Col>
</Grid>
<Button
radius={"xl"}
onClick={() =>
router.push(
RouterAdminDonasi.pencairan_dana + `${donasi.id}`
)
}
>
Cairkan Dana
</Button>
</Stack>
</Paper>
</Grid.Col> </Grid.Col>
</Grid> </Grid>
</Stack> </Stack>
</Paper> </Paper>
<Modal opened={opened} onClose={close} centered>
<PencairanDana />
</Modal>
</> </>
); );
} }
function PencairanDana() {
return (
<>
<Stack>
<TextInput label="Masukan nominal" />
</Stack>
</>
);
}
//######################## LIST DONATUR #####################//
function TampilanListDonatur({ function TampilanListDonatur({
donatur, donatur,
donasi, donasi,
@@ -220,3 +313,94 @@ function TampilanListDonatur({
</> </>
); );
} }
//######################## LIST PENCAIRAN #####################//
function TampilanListPencairan({
pencairan,
}: {
pencairan: MODEL_DONASI_PENCAIRAN_DANA[];
}) {
const [opened, { open, close }] = useDisclosure(false);
const [gambarId, setGambarId] = useState("");
const rowTable = pencairan.map((e) => (
<tr key={e.id}>
<td>
<TampilanRupiahDonasi nominal={e.nominalCair} />
</td>
<td>{moment(e.createdAt).format("ll")}</td>
<td>
<Text>{e.title}</Text>
</td>
<td width={500}>
<Box w={"100%"}>
<Spoiler hideLabel="Sembunyikan" maxHeight={70} showLabel="Lihat">
{e.deskripsi}
</Spoiler>
</Box>
</td>
<td>
{
<Box>
<Center>
<Button
radius={"xl"}
compact
bg={"green"}
color="green"
onClick={() => {
open();
setGambarId(e.imagesId);
}}
>
Detail
</Button>
</Center>
</Box>
}
</td>
</tr>
));
return (
<>
<Modal opened={opened} onClose={close} centered>
<AspectRatio ratio={9 / 16}>
<Image
src={RouterDonasi.api_gambar_pencairan + `${gambarId}`}
alt="Foto"
/>
</AspectRatio>
</Modal>
<Stack p={"md"}>
<Title order={3}>Rincian Pencairan Dana</Title>
{/* <pre>{JSON.stringify(pencairan, null, 2)}</pre> */}
{_.isEmpty(pencairan) ? (
<Paper bg={"gray.1"} p={"xs"}>
<Center>BELUM ADA PENCAIRAN DANA</Center>
</Paper>
) : (
<Paper withBorder p={"xs"}>
<Table horizontalSpacing={"md"} verticalSpacing={"md"}>
<thead>
<tr>
<th>Nominal</th>
<th>Tanggal</th>
<th>Judul</th>
<th>
<Center>Deskripsi</Center>
</th>
<th>
<Center>Bukti Transfer</Center>
</th>
</tr>
</thead>
<tbody>{rowTable}</tbody>
</Table>
</Paper>
)}
</Stack>
</>
);
}

View File

@@ -0,0 +1,196 @@
"use client";
import {
AspectRatio,
Button,
Center,
FileButton,
Image,
NumberInput,
Paper,
Stack,
TextInput,
Textarea,
Title,
} from "@mantine/core";
import ComponentAdminDonasi_TombolKembali from "../../component/tombol_kembali";
import { useState } from "react";
import { IconCamera } from "@tabler/icons-react";
import ComponentDonasi_NotedBox from "@/app_modules/donasi/component/noted_box";
import { useRouter } from "next/navigation";
import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
import { MODEL_DONASI_PENCAIRAN_DANA } from "@/app_modules/donasi/model/interface";
import _ from "lodash";
import { NotifPeringatan } from "@/app_modules/donasi/component/notifikasi/notif_peringatan";
import { AdminDonasi_funCreatePencairanDana } from "../../fun/create/fun_create_pencairan_dana";
import { NotifBerhasil } from "@/app_modules/donasi/component/notifikasi/notif_berhasil";
import { NotifGagal } from "@/app_modules/donasi/component/notifikasi/notif_gagal";
import { AdminDonasi_AkumulasiPencairanById } from "../../fun/update/fun_update_akumulasi_pencairan";
export default function AdminDonasi_PencairanDana({
donasiId,
}: {
donasiId: string;
}) {
const router = useRouter();
const [file, setFile] = useState<File | null>(null);
const [images, setImages] = useState<any | null>();
const [value, setValue] = useState({
title: "",
deskripsi: "",
nilai: "",
});
return (
<>
<Stack>
<ComponentAdminDonasi_TombolKembali />
<Center>
<Paper
p={"md"}
w={{ base: 200, sm: 200, md: 300, lg: 400 }}
withBorder
>
<Center mb={"lg"}>
<Title order={5}>Form Pencairan Dana</Title>
</Center>
<Stack>
<TextInput
withAsterisk
type="number"
placeholder="Masukan jumlah nominal"
label="Nominal"
onChange={(val) => {
setValue({
...value,
nilai: val.target.value,
});
}}
/>
<TextInput
withAsterisk
placeholder="Masukan judul"
label="Judul"
onChange={(val: any) => {
setValue({
...value,
title: val.target.value,
});
}}
/>
<Textarea
withAsterisk
placeholder="Masukan deskripsi"
label="Deskripsi"
onChange={(val: any) => {
setValue({
...value,
deskripsi: val.target.value,
});
}}
/>
<ComponentDonasi_NotedBox informasi="Wajib menyertakan bukti transfer" />
<Stack>
<Center>
<FileButton
onChange={async (files: any | null) => {
try {
const buffer = URL.createObjectURL(
new Blob([new Uint8Array(await files.arrayBuffer())])
);
// console.log(buffer, "ini buffer");
// console.log(files, " ini file");
setImages(buffer);
setFile(files);
} catch (error) {
console.log(error);
}
}}
accept="image/png,image/jpeg"
>
{(props) => (
<Button
{...props}
radius={"xl"}
variant="outline"
w={150}
leftIcon={<IconCamera />}
compact
>
Upload
</Button>
)}
</FileButton>
</Center>
{images ? (
<AspectRatio ratio={9 / 16}>
<Paper radius={"md"} withBorder>
<Image
alt="Foto"
src={images}
/>
</Paper>
</AspectRatio>
) : (
""
)}
</Stack>
<Button
radius={"xl"}
mt={"lg"}
onClick={
() => onSave(router, value, donasiId, file as any)
// console.log(value)
}
>
Simpan
</Button>
</Stack>
</Paper>
</Center>
</Stack>
</>
);
}
async function onSave(
router: AppRouterInstance,
value: any,
donasiId: string,
file: FormData
) {
const body = {
donasiId: donasiId,
nominalCair: value.nilai,
title: value.title,
deskripsi: value.deskripsi,
};
// console.log(body);
if (_.values(body).includes("")) return NotifPeringatan("Lengkapi Data");
if (!file) return NotifPeringatan("Lampirkan Bukti Transfer");
const gambar = new FormData();
gambar.append("file", file as any);
await AdminDonasi_funCreatePencairanDana(body as any, gambar).then(
async (res) => {
if (res.status === 200) {
await AdminDonasi_AkumulasiPencairanById(
body.donasiId as any,
body.nominalCair as any
).then((res) => {
if (res.status === 200) {
NotifBerhasil(res.message);
router.back();
} else {
NotifGagal(res.message);
}
});
} else {
NotifGagal(res.message);
}
}
);
}

View File

@@ -2,18 +2,21 @@
import { import {
ActionIcon, ActionIcon,
AspectRatio,
Box, Box,
Button, Button,
Center, Center,
Group, Group,
HoverCard, HoverCard,
Image,
Modal,
Paper, Paper,
Stack, Stack,
Table, Table,
Text, Text,
Title, Title,
} from "@mantine/core"; } from "@mantine/core";
import AdminDonasi_TombolKembali from "../../component/tombol_kembali"; import ComponentAdminDonasi_TombolKembali from "../../component/tombol_kembali";
import { MODEL_DONASI_INVOICE } from "@/app_modules/donasi/model/interface"; import { MODEL_DONASI_INVOICE } from "@/app_modules/donasi/model/interface";
import { useState } from "react"; import { useState } from "react";
import moment from "moment"; import moment from "moment";
@@ -24,15 +27,17 @@ import { NotifBerhasil } from "@/app_modules/donasi/component/notifikasi/notif_b
import { NotifGagal } from "@/app_modules/donasi/component/notifikasi/notif_gagal"; import { NotifGagal } from "@/app_modules/donasi/component/notifikasi/notif_gagal";
import { AdminDonasi_getListStatusInvoiceProses } from "../../fun/get/get_list_status_invoice_proses"; import { AdminDonasi_getListStatusInvoiceProses } from "../../fun/get/get_list_status_invoice_proses";
import { AdminDonasi_funUpdateProgresDanTerkumpul } from "../../fun/update/fun_update_progres_dan_terkumpul"; import { AdminDonasi_funUpdateProgresDanTerkumpul } from "../../fun/update/fun_update_progres_dan_terkumpul";
import { useDisclosure } from "@mantine/hooks";
import { RouterAdminDonasi } from "@/app/lib/router_hipmi/router_admin";
export default function AdminDonasi_ProsesTransaksi({ export default function AdminDonasi_ProsesTransaksi({
listProses, listProses,
}: { }: {
listProses: MODEL_DONASI_INVOICE[]; listProses: MODEL_DONASI_INVOICE[];
}) { }) {
const [invoice, setInvoice] = useState<MODEL_DONASI_INVOICE[] | any[]>( const [invoice, setInvoice] = useState<MODEL_DONASI_INVOICE[]>(listProses);
listProses const [opened, { open, close }] = useDisclosure(false);
); const [imageId, setImageId] = useState("");
async function onClick(invoice: MODEL_DONASI_INVOICE) { async function onClick(invoice: MODEL_DONASI_INVOICE) {
let nominal: number = +invoice.nominal; let nominal: number = +invoice.nominal;
@@ -50,7 +55,7 @@ export default function AdminDonasi_ProsesTransaksi({
if (res.status === 200) { if (res.status === 200) {
await AdminDonasi_getListStatusInvoiceProses( await AdminDonasi_getListStatusInvoiceProses(
invoice.Donasi.id invoice.Donasi.id
).then((res) => { ).then((res: any) => {
setInvoice(res); setInvoice(res);
}); });
} else { } else {
@@ -79,6 +84,20 @@ export default function AdminDonasi_ProsesTransaksi({
<Button <Button
radius={"xl"} radius={"xl"}
variant="outline" variant="outline"
onClick={() => {
open();
setImageId(e.imagesId);
}}
>
Lihat
</Button>
</Center>
</td>
<td>
<Center>
<Button
radius={"xl"}
variant="filled"
color="green" color="green"
onClick={() => onClick(e)} onClick={() => onClick(e)}
> >
@@ -91,9 +110,12 @@ export default function AdminDonasi_ProsesTransaksi({
return ( return (
<> <>
<Modal opened={opened} onClose={close} centered>
<ModalBuktiTransfer imageId={imageId} />
</Modal>
{/* <pre>{JSON.stringify(invoice, null, 2)}</pre> */} {/* <pre>{JSON.stringify(invoice, null, 2)}</pre> */}
<Stack> <Stack>
<AdminDonasi_TombolKembali /> <ComponentAdminDonasi_TombolKembali />
<Stack> <Stack>
<HeaderPage /> <HeaderPage />
@@ -107,6 +129,9 @@ export default function AdminDonasi_ProsesTransaksi({
<Center>Metode Pembayaran</Center> <Center>Metode Pembayaran</Center>
</th> </th>
<th>Tanggal</th> <th>Tanggal</th>
<th>
<Center>Bukti Transfer</Center>
</th>
<th> <th>
<Center>Aksi</Center> <Center>Aksi</Center>
</th> </th>
@@ -151,3 +176,16 @@ function HeaderPage() {
</> </>
); );
} }
function ModalBuktiTransfer({ imageId }: { imageId: string }) {
return (
<>
<AspectRatio ratio={9 / 16}>
<Image
alt="Foto"
src={RouterAdminDonasi.api_gambar_bukti_transfer + `${imageId}`}
/>
</AspectRatio>
</>
);
}

View File

@@ -0,0 +1,52 @@
"use server";
import prisma from "@/app/lib/prisma";
import { MODEL_DONASI_PENCAIRAN_DANA } from "@/app_modules/donasi/model/interface";
import _ from "lodash";
import { v4 } from "uuid";
import fs from "fs";
import { revalidatePath } from "next/cache";
export async function AdminDonasi_funCreatePencairanDana(
req: MODEL_DONASI_PENCAIRAN_DANA,
gambar: FormData
) {
const dataImage: any = gambar.get("file");
const fileName = dataImage.name;
const fileExtension = _.lowerCase(dataImage.name.split(".").pop());
const fRandomName = v4(fileName) + "." + fileExtension;
const uploadBukti = await prisma.images.create({
data: {
url: fRandomName,
},
select: {
id: true,
url: true,
},
});
if (!uploadBukti) return { status: 400, message: "Gagal upload gambar" };
const uploadFolder = Buffer.from(await dataImage.arrayBuffer());
fs.writeFileSync(
`./public/donasi/pencairan/${uploadBukti.url}`,
uploadFolder
);
const createPencairan = await prisma.donasi_PencairanDana.create({
data: {
nominalCair: +req.nominalCair,
deskripsi: req.deskripsi,
title: req.title,
donasiId: req.donasiId,
imagesId: uploadBukti.id
},
});
if (!createPencairan) return { status: 400, message: "Gagal membuat data" };
revalidatePath("/dev/admin/donasi/detail/publish");
return {
status: 200,
message: "Berhasil",
};
}

View File

@@ -4,7 +4,10 @@ import prisma from "@/app/lib/prisma";
export async function AdminDonasi_getByStatus(status: string) { export async function AdminDonasi_getByStatus(status: string) {
if (status === "1") { if (status === "1") {
const getReview = await prisma.donasi.findMany({ const getPublish = await prisma.donasi.findMany({
orderBy: {
createdAt: "desc",
},
where: { where: {
donasiMaster_StatusDonasiId: "1", donasiMaster_StatusDonasiId: "1",
}, },
@@ -12,24 +15,25 @@ export async function AdminDonasi_getByStatus(status: string) {
id: true, id: true,
title: true, title: true,
target: true, target: true,
active: true, // active: true,
createdAt: true, // createdAt: true,
updatedAt: true, // updatedAt: true,
publishTime: true, // publishTime: true,
authorId: true, authorId: true,
imagesId: true, // imagesId: true,
donasiMaster_KategoriId: true, terkumpul: true,
donasiMaster_DurasiId: true, // donasiMaster_KategoriId: true,
donasiMaster_StatusDonasiId: true, // donasiMaster_DurasiId: true,
Author: true, // donasiMaster_StatusDonasiId: true,
// Author: true,
imageDonasi: true, imageDonasi: true,
CeritaDonasi: true, // CeritaDonasi: true,
DonasiMaster_Ketegori: true, DonasiMaster_Ketegori: true,
DonasiMaster_Durasi: true, DonasiMaster_Durasi: true,
DonasiMaster_Status: true, // DonasiMaster_Status: true,
}, },
}); });
return getReview; return getPublish;
} }
if (status === "2") { if (status === "2") {

View File

@@ -0,0 +1,13 @@
"use server"
import prisma from "@/app/lib/prisma"
export async function AdminDonasi_getListPencairanDana(donasiId:string) {
const data = await prisma.donasi_PencairanDana.findMany({
where: {
donasiId: donasiId
}
})
return data
}

View File

@@ -15,6 +15,7 @@ export async function AdminDonasi_getListStatusInvoiceProses(donasiId: string) {
nominal: true, nominal: true,
createdAt: true, createdAt: true,
Author: true, Author: true,
imagesId: true,
Donasi: { Donasi: {
select: { select: {
id: true, id: true,
@@ -26,8 +27,6 @@ export async function AdminDonasi_getListStatusInvoiceProses(donasiId: string) {
publishTime: true, publishTime: true,
catatan: true, catatan: true,
terkumpul: true, terkumpul: true,
authorId: true,
imagesId: true,
donasiMaster_KategoriId: true, donasiMaster_KategoriId: true,
donasiMaster_DurasiId: true, donasiMaster_DurasiId: true,
donasiMaster_StatusDonasiId: true, donasiMaster_StatusDonasiId: true,

View File

@@ -2,7 +2,7 @@
import prisma from "@/app/lib/prisma"; import prisma from "@/app/lib/prisma";
export async function AdminDonasi_getById(id: string) { export async function AdminDonasi_getOneById(id: string) {
const res = await prisma.donasi.findFirst({ const res = await prisma.donasi.findFirst({
where: { where: {
id: id, id: id,
@@ -19,6 +19,10 @@ export async function AdminDonasi_getById(id: string) {
progres: true, progres: true,
terkumpul: true, terkumpul: true,
authorId: true, authorId: true,
namaBank: true,
rekening: true,
totalPencairan: true,
akumulasiPencairan: true,
imagesId: true, imagesId: true,
donasiMaster_KategoriId: true, donasiMaster_KategoriId: true,
donasiMaster_DurasiId: true, donasiMaster_DurasiId: true,
@@ -31,5 +35,6 @@ export async function AdminDonasi_getById(id: string) {
DonasiMaster_Status: true, DonasiMaster_Status: true,
}, },
}); });
// console.log(res)
return res; return res;
} }

View File

@@ -0,0 +1,47 @@
"use server";
import prisma from "@/app/lib/prisma";
import { MODEL_DONASI } from "@/app_modules/donasi/model/interface";
export async function AdminDonasi_AkumulasiPencairanById(
donasiId: string,
nominalPencairan: number
) {
const cariDonasi = await prisma.donasi.findFirst({
where: {
id: donasiId,
},
select: {
akumulasiPencairan: true,
totalPencairan: true,
},
});
if (!cariDonasi) return { status: 400, message: "Donasi tidak ditemukan" };
let akumulasiSementara: number | any = cariDonasi.akumulasiPencairan;
let totalSementara: number | any = cariDonasi.totalPencairan;
// console.log(akumulasiSementara, "akumulasi");
// console.log(totalSementara, "total");
const hasilTotal = totalSementara + Number(nominalPencairan)
const hasilAkumulasi = akumulasiSementara + 1;
const update = await prisma.donasi.update({
where: {
id: donasiId,
},
data: {
akumulasiPencairan: hasilAkumulasi,
totalPencairan: hasilTotal,
},
});
if (!update) return { status: 400, message: "Update akumulasi gagal" };
return {
status: 200,
message: "Berhasil di simpan",
};
}

View File

@@ -0,0 +1,20 @@
"use server"
import prisma from "@/app/lib/prisma"
export async function AdminDonasi_funUpdateCatatanReject(doansiId: string, catatan: string) {
const updt = await prisma.donasi.update({
where: {
id: doansiId
},
data: {
catatan: catatan
}
})
if(!updt) return {status: 400, message: "Gagal update"}
return {
status: 200,
message: "Berhasil update"
}
}

View File

@@ -0,0 +1,3 @@
import { atomWithStorage } from "jotai/utils";
export const gs_adminDonasi_hotMenu = atomWithStorage("gs_adminDonasi_hotMenu", 0)

View File

@@ -6,6 +6,7 @@ import AdminDonasi_DetailReview from "./detail_table/detail_review";
import AdminDonasi_TableReject from "./table_status/table_reject"; import AdminDonasi_TableReject from "./table_status/table_reject";
import AdminDonasi_DetailReject from "./detail_table/detail_reject"; import AdminDonasi_DetailReject from "./detail_table/detail_reject";
import AdminDonasi_ProsesTransaksi from "./detail_table/publish/proses_transaksi"; import AdminDonasi_ProsesTransaksi from "./detail_table/publish/proses_transaksi";
import AdminDonasi_PencairanDana from "./detail_table/publish/pencairan_dana";
export { export {
AdminDonasi_Main, AdminDonasi_Main,
@@ -15,4 +16,6 @@ export {
AdminDonasi_TableReject, AdminDonasi_TableReject,
AdminDonasi_DetailReview, AdminDonasi_DetailReview,
AdminDonasi_DetailReject, AdminDonasi_DetailReject,
AdminDonasi_ProsesTransaksi,
AdminDonasi_PencairanDana,
}; };

View File

@@ -14,7 +14,7 @@ import {
} from "@mantine/core"; } from "@mantine/core";
import { IconChevronLeft, IconEyeCheck } from "@tabler/icons-react"; import { IconChevronLeft, IconEyeCheck } from "@tabler/icons-react";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import AdminDonasi_TombolKembali from "../component/tombol_kembali"; import ComponentAdminDonasi_TombolKembali from "../component/tombol_kembali";
import { MODEL_DONASI } from "@/app_modules/donasi/model/interface"; import { MODEL_DONASI } from "@/app_modules/donasi/model/interface";
import { useState } from "react"; import { useState } from "react";
import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah"; import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah";
@@ -27,7 +27,7 @@ export default function AdminDonasi_TablePublish({
return ( return (
<> <>
<Stack> <Stack>
<AdminDonasi_TombolKembali /> <ComponentAdminDonasi_TombolKembali />
<TableStatus listPublish={listPublish as any} /> <TableStatus listPublish={listPublish as any} />
</Stack> </Stack>
</> </>
@@ -45,6 +45,9 @@ function TableStatus({ listPublish }: { listPublish: MODEL_DONASI[] }) {
<td> <td>
<TampilanRupiahDonasi nominal={+e.target} /> <TampilanRupiahDonasi nominal={+e.target} />
</td> </td>
<td>
<TampilanRupiahDonasi nominal={+e.terkumpul}/>
</td>
<td>{e.DonasiMaster_Ketegori.name}</td> <td>{e.DonasiMaster_Ketegori.name}</td>
<td>{e.DonasiMaster_Durasi.name} hari</td> <td>{e.DonasiMaster_Durasi.name} hari</td>
<td> <td>
@@ -84,6 +87,7 @@ function TableStatus({ listPublish }: { listPublish: MODEL_DONASI[] }) {
<tr> <tr>
<th>Judul</th> <th>Judul</th>
<th>Target</th> <th>Target</th>
<th>Terkumpul</th>
<th>Ketegori</th> <th>Ketegori</th>
<th>Durasi</th> <th>Durasi</th>
<th><Center>Aksi</Center></th> <th><Center>Aksi</Center></th>

View File

@@ -15,7 +15,7 @@ import {
} from "@mantine/core"; } from "@mantine/core";
import { IconChevronLeft, IconEyeCheck } from "@tabler/icons-react"; import { IconChevronLeft, IconEyeCheck } from "@tabler/icons-react";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import AdminDonasi_TombolKembali from "../component/tombol_kembali"; import ComponentAdminDonasi_TombolKembali from "../component/tombol_kembali";
import { useDisclosure } from "@mantine/hooks"; import { useDisclosure } from "@mantine/hooks";
import AdminDonasi_DetailReview from "../detail_table/detail_review"; import AdminDonasi_DetailReview from "../detail_table/detail_review";
import { MODEL_DONASI } from "@/app_modules/donasi/model/interface"; import { MODEL_DONASI } from "@/app_modules/donasi/model/interface";
@@ -30,7 +30,7 @@ export default function AdminDonasi_TableReject({
return ( return (
<> <>
<Stack> <Stack>
<AdminDonasi_TombolKembali /> <ComponentAdminDonasi_TombolKembali />
<TableStatus dataReject={dataReject} /> <TableStatus dataReject={dataReject} />
</Stack> </Stack>
</> </>

View File

@@ -15,7 +15,7 @@ import {
} from "@mantine/core"; } from "@mantine/core";
import { IconChevronLeft, IconEyeCheck } from "@tabler/icons-react"; import { IconChevronLeft, IconEyeCheck } from "@tabler/icons-react";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import AdminDonasi_TombolKembali from "../component/tombol_kembali"; import ComponentAdminDonasi_TombolKembali from "../component/tombol_kembali";
import { useDisclosure } from "@mantine/hooks"; import { useDisclosure } from "@mantine/hooks";
import AdminDonasi_DetailReview from "../detail_table/detail_review"; import AdminDonasi_DetailReview from "../detail_table/detail_review";
import { MODEL_DONASI } from "@/app_modules/donasi/model/interface"; import { MODEL_DONASI } from "@/app_modules/donasi/model/interface";
@@ -30,7 +30,7 @@ export default function AdminDonasi_TableReview({
return ( return (
<> <>
<Stack> <Stack>
<AdminDonasi_TombolKembali /> <ComponentAdminDonasi_TombolKembali />
<TableStatus listReview={listReview} /> <TableStatus listReview={listReview} />
</Stack> </Stack>
</> </>

View File

@@ -6,6 +6,7 @@ import {
Avatar, Avatar,
Box, Box,
Burger, Burger,
Divider,
Drawer, Drawer,
Footer, Footer,
Group, Group,
@@ -31,6 +32,8 @@ import {
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"; import { Logout } from "@/app_modules/auth";
import { useAtom } from "jotai";
import { gs_adminDonasi_hotMenu } from "../donasi/global_state";
export default function AdminLayout({ export default function AdminLayout({
children, children,
@@ -40,7 +43,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(1); const [active, setActive] = useAtom(gs_adminDonasi_hotMenu);
const listAdminPage = [ const listAdminPage = [
{ {
@@ -75,15 +78,24 @@ export default function AdminLayout({
p="xs" p="xs"
bg={"gray.2"} bg={"gray.2"}
> >
{listAdminPage.map((e) => ( {listAdminPage.map((e, i) => (
<NavLink <Box key={i}>
key={e.id} <NavLink
label={e.name} sx={{
onClick={() => { ":hover": {
// setActive(e.id); backgroundColor: "transparent",
router.push(e.route); },
}} }}
/> fw={active === i ? "bold" : "normal"}
// key={e.id}
label={e.name}
onClick={() => {
setActive(i);
router.push(e.route);
}}
/>
{active === i ? <Divider size={"lg"} color="gray" /> : ""}
</Box>
))} ))}
</Navbar> </Navbar>
</MediaQuery> </MediaQuery>

View File

@@ -13,6 +13,8 @@ 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"; import { RouterAdminDashboard } from "@/app/lib/router_hipmi/router_admin";
import { NotifBerhasil } from "@/app_modules/donasi/component/notifikasi/notif_berhasil";
import { NotifGagal } from "@/app_modules/donasi/component/notifikasi/notif_gagal";
export default function Login() { export default function Login() {
const router = useRouter(); const router = useRouter();
@@ -44,12 +46,12 @@ export default function Login() {
router.push(RouterAdminDashboard.splash_admin); router.push(RouterAdminDashboard.splash_admin);
} else { } else {
if (val.status == 200) { if (val.status == 200) {
toast("Nomor OTP terkirim");
setCode(val.body.otp); setCode(val.body.otp);
setInputNumber(val.body.nomor); setInputNumber(val.body.nomor);
router.push("/dev/auth/validasi"); router.push("/dev/auth/validasi");
return NotifBerhasil("Nomor OTP terkirim");
} else { } else {
toast(val.message); NotifGagal(val.message);
} }
} }
}); });

View File

@@ -21,6 +21,9 @@ import { ApiHipmi } from "@/app/lib/api";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { funGetUserProfile } from "@/app_modules/fun/get_user_profile"; import { funGetUserProfile } from "@/app_modules/fun/get_user_profile";
import { useFocusTrap } from "@mantine/hooks"; import { useFocusTrap } from "@mantine/hooks";
import { NotifBerhasil } from "@/app_modules/donasi/component/notifikasi/notif_berhasil";
import { NotifGagal } from "@/app_modules/donasi/component/notifikasi/notif_gagal";
import { NotifPeringatan } from "@/app_modules/donasi/component/notifikasi/notif_peringatan";
export default function Validasi() { export default function Validasi() {
const router = useRouter(); const router = useRouter();
@@ -51,12 +54,12 @@ export default function Validasi() {
.then((val) => { .then((val) => {
myConsole(val); myConsole(val);
if (val.status == 200) { if (val.status == 200) {
toast("Berhasil Login");
setTimeout(() => router.push("/dev/home"), 2000); setTimeout(() => router.push("/dev/home"), 2000);
funGetUserProfile(val.data.id); funGetUserProfile(val.data.id);
NotifBerhasil("Berhasil Login");
} else { } else {
toast("Silahkan Registrasi"); router.push("/dev/auth/register");
return router.push("/dev/auth/register"); NotifPeringatan("Silahkan Registrasi");
} }
}); });
}; };

View File

@@ -45,10 +45,9 @@ export default function ComponentDonasi_BoxPublish({
{donasi.map((e, i) => ( {donasi.map((e, i) => (
<Box <Box
key={i} key={i}
onClick={ onClick={() => {
() => router.push(path + `${e.id}`) router.push(path + `${e.id}`);
// toast("Cooming soon") }}
}
> >
<Stack> <Stack>
<Grid> <Grid>

View File

@@ -22,13 +22,19 @@ import {
} from "@tabler/icons-react"; } from "@tabler/icons-react";
import TampilanRupiahDonasi from "../tampilan_rupiah"; import TampilanRupiahDonasi from "../tampilan_rupiah";
import ComponentDonasi_TampilanHitungMundur from "../tampilan_hitung_mundur"; import ComponentDonasi_TampilanHitungMundur from "../tampilan_hitung_mundur";
import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
import { NotifPeringatan } from "../notifikasi/notif_peringatan";
import { NotifBerhasil } from "../notifikasi/notif_berhasil";
import { Donasi_findDonaturByTokenId } from "../../fun/get/get_donatur_by_token_id";
export function ComponentDonasi_DetailDataMain({ export function ComponentDonasi_DetailDataMain({
donasi, donasi,
countDonatur, countDonatur,
userLoginId,
}: { }: {
donasi: MODEL_DONASI; donasi: MODEL_DONASI;
countDonatur: number; countDonatur: number;
userLoginId?: string | any;
}) { }) {
const router = useRouter(); const router = useRouter();
return ( return (
@@ -103,7 +109,7 @@ export function ComponentDonasi_DetailDataMain({
<Divider orientation="vertical" /> <Divider orientation="vertical" />
<Grid.Col <Grid.Col
span={"auto"} span={"auto"}
onClick={() => router.push(RouterDonasi.pencairan_dana)} onClick={() => onPencairanDana(router, donasi, userLoginId)}
> >
<Stack spacing={"sm"} align="center"> <Stack spacing={"sm"} align="center">
<IconMoneybag color="skyblue" /> <IconMoneybag color="skyblue" />
@@ -116,3 +122,23 @@ export function ComponentDonasi_DetailDataMain({
</> </>
); );
} }
async function onPencairanDana(
router: AppRouterInstance,
donasi: MODEL_DONASI,
userLoginId: string
) {
// console.log(userLoginId)
// console.log(donasi.authorId)
const cek = await Donasi_findDonaturByTokenId(donasi.id, userLoginId);
if(userLoginId == donasi.authorId)
return router.push(RouterDonasi.pencairan_dana + `${donasi.id}`);
if (!cek ) return NotifPeringatan("Halaman khusus donatur");
router.push(RouterDonasi.pencairan_dana + `${donasi.id}`);
// if (userLoginId != donasi.authorId)
// return NotifPeringatan("Halaman khusus donatur");
// router.push(RouterDonasi.pencairan_dana + `${donasi.id}`);
}

View File

@@ -3,16 +3,18 @@
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi"; import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import { Paper, Stack, Text, Title } from "@mantine/core"; import { Paper, Stack, Text, Title } from "@mantine/core";
import moment from "moment"; import moment from "moment";
import router from "next/router";
import { MODEL_DONASI_KABAR } from "../../model/interface"; import { MODEL_DONASI_KABAR } from "../../model/interface";
import { useRouter } from "next/navigation";
export default function ComponentDonasi_ListKabar({ export default function ComponentDonasi_ListKabar({
kabar, kabar,
route
}: { }: {
kabar: MODEL_DONASI_KABAR; kabar: MODEL_DONASI_KABAR;
route: string
}) { }) {
const router = useRouter();
return ( return (
<> <>
<Paper bg={"gray.1"} p={"md"}> <Paper bg={"gray.1"} p={"md"}>
@@ -26,7 +28,7 @@ export default function ComponentDonasi_ListKabar({
<Text <Text
c={"blue"} c={"blue"}
onClick={() => onClick={() =>
router.push(RouterDonasi.update_kabar + `${kabar.id}`) router.push(route + `${kabar.id}`)
} }
> >
Buka Kabar Buka Kabar

View File

@@ -5,7 +5,7 @@ import { IconArrowLeft, IconChevronLeft } from "@tabler/icons-react";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
export default function HeaderTamplateDonasi({ export default function ComponentDonasi_HeaderTamplate({
hideBack, hideBack,
changeIconBack, changeIconBack,
route, route,

View File

@@ -7,9 +7,9 @@ export default function ComponentDonasi_NotedBox({
}) { }) {
return ( return (
<> <>
<Paper bg={"blue.3"} p={"sm"}> <Paper bg={"blue.3"} p={10}>
<Group> <Group>
<Text fz={"xs"} fs={"italic"}> <Text fz={10} fs={"italic"}>
<Text span inherit c={"red"}> <Text span inherit c={"red"}>
*{" "} *{" "}
</Text> </Text>

View File

@@ -9,6 +9,8 @@ import {
Image, Image,
Paper, Paper,
Stack, Stack,
Text,
TextInput,
Textarea, Textarea,
} from "@mantine/core"; } from "@mantine/core";
import { IconCamera } from "@tabler/icons-react"; import { IconCamera } from "@tabler/icons-react";
@@ -38,6 +40,9 @@ export default function CreateCeritaPenggalangDonasi({
const [create, setCreate] = useState({ const [create, setCreate] = useState({
pembukaan: "", pembukaan: "",
cerita: "", cerita: "",
namaBank: "",
rekening: ""
}); });
const [temporary, setTemporary] = useState(dataTemporary); const [temporary, setTemporary] = useState(dataTemporary);
const [file, setFile] = useState<File | null>(null); const [file, setFile] = useState<File | null>(null);
@@ -58,6 +63,8 @@ export default function CreateCeritaPenggalangDonasi({
donasiMaster_KategoriId: temporary.donasiMaster_KategoriId, donasiMaster_KategoriId: temporary.donasiMaster_KategoriId,
donasiMaster_DurasiId: temporary.donasiMaster_DurasiId, donasiMaster_DurasiId: temporary.donasiMaster_DurasiId,
authorId: userId, authorId: userId,
namaBank: create.namaBank,
rekening: create.rekening,
CeritaDonasi: { CeritaDonasi: {
pembukaan: create.pembukaan, pembukaan: create.pembukaan,
cerita: create.cerita, cerita: create.cerita,
@@ -75,79 +82,118 @@ export default function CreateCeritaPenggalangDonasi({
} }
return ( return (
<> <>
<Stack spacing={"md"} px={"md"}> <Stack spacing={50} px={"md"}>
{/* <pre>{JSON.stringify(dataTempo, null, 2)}</pre> */} {/* <pre>{JSON.stringify(dataTempo, null, 2)}</pre> */}
<ComponentDonasi_NotedBox informasi="Ceritakan dengan jujur & benar mengapa Penggalanagn Dana ini harus diadakan!" /> <Stack spacing={"sm"}>
<Textarea <ComponentDonasi_NotedBox informasi="Ceritakan dengan jujur & benar mengapa Penggalanagn Dana ini harus diadakan!" />
autosize
minRows={2}
maxRows={4}
withAsterisk
label="Pembukaan"
placeholder="Pembuka dari isi cerita"
onChange={(val) =>
setCreate({
...create,
pembukaan: val.target.value,
})
}
/>
<Stack spacing={"xs"}>
<AspectRatio ratio={16 / 9}>
<Paper radius={"md"}>
<Image
alt="Foto"
src={imageCerita ? imageCerita : "/aset/no-img.png"}
/>
</Paper>
</AspectRatio>
<Center> <Textarea
<FileButton autosize
onChange={async (files: any | null) => { minRows={2}
try { maxRows={4}
const buffer = URL.createObjectURL( withAsterisk
new Blob([new Uint8Array(await files.arrayBuffer())]) label="Pembukaan"
); placeholder="Pembuka dari isi cerita"
// console.log(buffer, "ini buffer"); onChange={(val) =>
// console.log(files, " ini file"); setCreate({
setImageCerita(buffer); ...create,
setFile(files); pembukaan: val.target.value,
} catch (error) { })
console.log(error); }
} />
}}
accept="image/png,image/jpeg" <Textarea
> autosize
{(props) => ( minRows={2}
<Button maxRows={10}
{...props} withAsterisk
radius={"xl"} label="Cerita"
variant="outline" placeholder="Ceritakan alasan mengapa harus membuat Penggalangan Dana"
w={150} onChange={(val) =>
leftIcon={<IconCamera />} setCreate({
> ...create,
Upload cerita: val.target.value,
</Button> })
)} }
</FileButton> />
</Center>
<Stack spacing={"xs"}>
<Center>
<FileButton
onChange={async (files: any | null) => {
try {
const buffer = URL.createObjectURL(
new Blob([new Uint8Array(await files.arrayBuffer())])
);
// console.log(buffer, "ini buffer");
// console.log(files, " ini file");
setImageCerita(buffer);
setFile(files);
} catch (error) {
console.log(error);
}
}}
accept="image/png,image/jpeg"
>
{(props) => (
<Button
compact
{...props}
radius={"xl"}
variant="outline"
w={150}
leftIcon={<IconCamera />}
>
Upload
</Button>
)}
</FileButton>
</Center>
{imageCerita ? (
<AspectRatio ratio={16 / 9}>
<Paper radius={"md"}>
<Image
alt="Foto"
src={imageCerita ? imageCerita : "/aset/no-img.png"}
/>
</Paper>
</AspectRatio>
) : (
<Center>
<Text fs={"italic"} fz={10}>
Upload poster atau gambar penggalangan !
</Text>
</Center>
)}
</Stack>
</Stack> </Stack>
<Textarea
autosize
minRows={2}
maxRows={10}
withAsterisk
label="Cerita"
placeholder="Ceritakan alasan mengapa harus membuat Penggalangan Dana"
onChange={(val) =>
setCreate({
...create,
cerita: val.target.value,
})
}
/>
<Stack spacing={"sm"}>
<ComponentDonasi_NotedBox informasi="Lengkapi nama bank dan rekening di bawah untuk mempermudah admin jika penggalangan dana ini telah di publish!" />
<TextInput
withAsterisk
placeholder="Contoh: BNI, BCA, MANDIRI, DLL"
label="Nama Bank"
onChange={(val) => {
setCreate({
...create,
namaBank: _.upperCase(val.target.value)
})
}}
/>
<TextInput
withAsterisk
placeholder="Maskuan nomor rekening"
label="Nomor rekening"
onChange={(val) => {
setCreate({
...create,
rekening: val.target.value
})
}}
/>
</Stack>
<Button w={"100%"} radius={"xl"} onClick={() => onCreate()}> <Button w={"100%"} radius={"xl"} onClick={() => onCreate()}>
Simpan Simpan
</Button> </Button>

View File

@@ -91,46 +91,7 @@ export default function CreateDonasi({
}) })
} }
/> />
<Stack>
<AspectRatio ratio={16 / 9}>
<Paper radius={"md"}>
<Image
alt="Foto"
src={imageDonasi ? imageDonasi : "/aset/no-img.png"}
/>
</Paper>
</AspectRatio>
<Center>
<FileButton
onChange={async (files: any | null) => {
try {
const buffer = URL.createObjectURL(
new Blob([new Uint8Array(await files.arrayBuffer())])
);
// console.log(buffer, "ini buffer");
// console.log(files, " ini file");
setImageDonasi(buffer);
setFile(files);
} catch (error) {
console.log(error);
}
}}
accept="image/png,image/jpeg"
>
{(props) => (
<Button
{...props}
radius={"xl"}
variant="outline"
w={150}
leftIcon={<IconCamera />}
>
Upload
</Button>
)}
</FileButton>
</Center>
</Stack>
<Stack> <Stack>
<TextInput <TextInput
withAsterisk withAsterisk
@@ -160,6 +121,56 @@ export default function CreateDonasi({
onChange={(val: string) => setCreate({ ...create, durasiId: val })} onChange={(val: string) => setCreate({ ...create, durasiId: val })}
/> />
</Stack> </Stack>
<Stack>
<Center>
<FileButton
onChange={async (files: any | null) => {
try {
const buffer = URL.createObjectURL(
new Blob([new Uint8Array(await files.arrayBuffer())])
);
// console.log(buffer, "ini buffer");
// console.log(files, " ini file");
setImageDonasi(buffer);
setFile(files);
} catch (error) {
console.log(error);
}
}}
accept="image/png,image/jpeg"
>
{(props) => (
<Button
compact
{...props}
radius={"xl"}
variant="outline"
w={150}
leftIcon={<IconCamera />}
>
Upload
</Button>
)}
</FileButton>
</Center>
{imageDonasi ? (
<AspectRatio ratio={16 / 9}>
<Paper radius={"md"}>
<Image
alt="Foto"
src={imageDonasi ? imageDonasi : "/aset/no-img.png"}
/>
</Paper>
</AspectRatio>
) : (
<Center>
<Text fs={"italic"} fz={10}>
Upload poster atau gambar penggalangan !
</Text>
</Center>
)}
</Stack>
<Button my={"lg"} radius={"xl"} onClick={() => onCreate()}> <Button my={"lg"} radius={"xl"} onClick={() => onCreate()}>
Selanjutnya Selanjutnya
</Button> </Button>

View File

@@ -21,6 +21,8 @@ import { NotifBerhasil } from "../../component/notifikasi/notif_berhasil";
import { NotifGagal } from "../../component/notifikasi/notif_gagal"; import { NotifGagal } from "../../component/notifikasi/notif_gagal";
import _ from "lodash"; import _ from "lodash";
import { NotifPeringatan } from "../../component/notifikasi/notif_peringatan"; import { NotifPeringatan } from "../../component/notifikasi/notif_peringatan";
import ComponentDonasi_NotedBox from "../../component/noted_box";
import { Donasi_funCreateNotif } from "../../fun/create/fun_create_notif";
export default function Donasi_CreateKabar({ donasiId }: { donasiId: string }) { export default function Donasi_CreateKabar({ donasiId }: { donasiId: string }) {
const router = useRouter(); const router = useRouter();
@@ -33,6 +35,8 @@ export default function Donasi_CreateKabar({ donasiId }: { donasiId: string }) {
return ( return (
<> <>
<Stack> <Stack>
<ComponentDonasi_NotedBox informasi="Gambar tidak wajib di isi ! Hanya upload jika di butuhkan." />
<TextInput <TextInput
label="Judul" label="Judul"
withAsterisk withAsterisk
@@ -88,6 +92,7 @@ export default function Donasi_CreateKabar({ donasiId }: { donasiId: string }) {
variant="outline" variant="outline"
w={150} w={150}
leftIcon={<IconCamera />} leftIcon={<IconCamera />}
compact
> >
Upload Upload
</Button> </Button>
@@ -125,15 +130,19 @@ async function onSave(
}; };
if (_.values(body).includes("")) return NotifPeringatan("Lengkapi Data"); if (_.values(body).includes("")) return NotifPeringatan("Lengkapi Data");
if (!file) return NotifPeringatan("Lengkapi Gambar"); // if (!file) return NotifPeringatan("Lengkapi Gambar");
const gambar = new FormData(); const gambar = new FormData();
gambar.append("file", file as any); gambar.append("file", file as any);
await Donasi_funCreateKabar(body as any, gambar).then((res) => { await Donasi_funCreateKabar(body as any, gambar).then(async (res) => {
if (res.status === 200) { if (res.status === 200) {
NotifBerhasil(res.message); await Donasi_funCreateNotif(body.donasiId, res.kabarId as any).then((val) => {
router.back() if (val.status === 200) {
NotifBerhasil(res.message);
router.back();
}
});
} else { } else {
NotifGagal(res.message); NotifGagal(res.message);
} }

View File

@@ -2,7 +2,7 @@
import { AppShell } from "@mantine/core"; import { AppShell } from "@mantine/core";
import React from "react"; import React from "react";
import HeaderTamplateDonasi from "../../component/header_tamplate"; import ComponentDonasi_HeaderTamplate from "../../component/header_tamplate";
export default function LayoutDonasi_CreateKabar({ export default function LayoutDonasi_CreateKabar({
children, children,
@@ -11,7 +11,7 @@ export default function LayoutDonasi_CreateKabar({
}) { }) {
return ( return (
<> <>
<AppShell header={<HeaderTamplateDonasi title="Buat Kabar" />}> <AppShell header={<ComponentDonasi_HeaderTamplate title="Buat Kabar" />}>
{children} {children}
</AppShell> </AppShell>
</> </>

View File

@@ -2,11 +2,11 @@
import { AppShell } from "@mantine/core" import { AppShell } from "@mantine/core"
import React from "react" import React from "react"
import HeaderTamplateDonasi from "../component/header_tamplate" import ComponentDonasi_HeaderTamplate from "../component/header_tamplate"
export default function LayoutCreateDonasi({children}: {children: React.ReactNode}){ export default function LayoutCreateDonasi({children}: {children: React.ReactNode}){
return<> return<>
<AppShell header={<HeaderTamplateDonasi title="Buat Donasi"/>}> <AppShell header={<ComponentDonasi_HeaderTamplate title="Buat Donasi"/>}>
{children} {children}
</AppShell> </AppShell>

View File

@@ -0,0 +1,34 @@
"use client";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import { AspectRatio, Box, Image, Paper, Stack, Text, Title } from "@mantine/core";
import moment from "moment";
import kabar from "../detail_main/kabar";
import { MODEL_DONASI_KABAR } from "../../model/interface";
import { useState } from "react";
export default function Donasi_DetailNotif({dataKabar}: {dataKabar: MODEL_DONASI_KABAR}) {
const [kabar, setKabar] = useState(dataKabar)
return <>
<Stack>
<Stack>
<Text fz={"xs"}>{moment(Date.now()).format("ll")}</Text>
<Title order={5}>{kabar.title}</Title>
{kabar.imagesId === null ? (
""
) : (
<AspectRatio ratio={16 / 9}>
<Paper radius={"md"}>
<Image
alt="Foro"
src={RouterDonasi.api_gambar_kabar + `${kabar.imagesId}`}
/>
</Paper>
</AspectRatio>
)}
<Text>{kabar.deskripsi}</Text>
</Stack>
</Stack>
</>;
}

View File

@@ -0,0 +1,41 @@
"use client";
import { AppShell, Button, Center, Footer } from "@mantine/core";
import React from "react";
import ComponentDonasi_HeaderTamplate from "../../component/header_tamplate";
import { useRouter } from "next/navigation";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
export default function LayoutDonasi_DetailNotif({
children,
donasiId,
}: {
children: React.ReactNode;
donasiId: string;
}) {
const router = useRouter();
return (
<>
<AppShell
header={<ComponentDonasi_HeaderTamplate title="Detail Pemberitahuan" />}
footer={
<Footer height={70} p={"md"}>
<Center h={"100%"}>
<Button
w={"100%"}
radius={"xl"}
onClick={() =>
router.push(RouterDonasi.detail_main + `${donasiId}`)
}
>
Lihat Donasi
</Button>
</Center>
</Footer>
}
>
{children}
</AppShell>
</>
);
}

View File

@@ -2,13 +2,13 @@
import { AppShell } from "@mantine/core" import { AppShell } from "@mantine/core"
import React from "react" import React from "react"
import HeaderTamplateDonasi from "../../component/header_tamplate" import ComponentDonasi_HeaderTamplate from "../../component/header_tamplate"
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi" import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi"
export default function LayoutDetailDonasiSaya({children}: {children: React.ReactNode}){ export default function LayoutDetailDonasiSaya({children}: {children: React.ReactNode}){
return<> return<>
<AppShell <AppShell
header={<HeaderTamplateDonasi title="Detail Donasi Saya" route={RouterDonasi.main_donasi_saya} />} header={<ComponentDonasi_HeaderTamplate title="Detail Donasi Saya" route={RouterDonasi.main_donasi_saya} />}
> >
{children} {children}
</AppShell> </AppShell>

View File

@@ -12,7 +12,7 @@ import {
Title, Title,
} from "@mantine/core"; } from "@mantine/core";
import React from "react"; import React from "react";
import HeaderTamplateDonasi from "../../component/header_tamplate"; import ComponentDonasi_HeaderTamplate from "../../component/header_tamplate";
import { import {
IconChevronLeft, IconChevronLeft,
IconEdit, IconEdit,
@@ -78,6 +78,15 @@ export default function LayoutDetailDraftDonasi({
> >
Edit Cerita Edit Cerita
</Button> </Button>
<Button
variant="outline"
radius={"xl"}
w={"100%"}
color="orange"
onClick={() => router.push(RouterDonasi.edit_rekening + `${donasiId}`)}
>
Edit Rekening
</Button>
</Stack> </Stack>
</Modal> </Modal>
</> </>

View File

@@ -13,38 +13,30 @@ import {
Divider, Divider,
} from "@mantine/core"; } from "@mantine/core";
import moment from "moment"; import moment from "moment";
import { MODEL_DONASI_KABAR } from "../../model/interface";
import { useState } from "react";
export default function DetailKabarDonasi() { export default function DetailKabarDonasi({dataDonasi}: {dataDonasi: MODEL_DONASI_KABAR}) {
const [kabar, setKabar] = useState(dataDonasi)
return ( return (
<> <>
<Stack> <Stack>
<Group>
<Avatar variant="filled" radius={"xl"} />
<Stack spacing={0}>
<Text>Username</Text>
<Text fz={"xs"}>{moment(Date.now()).format("ll")}</Text>
</Stack>
</Group>
<Stack> <Stack>
<Title order={5}>Judul Berita</Title> <Text fz={"xs"}>{moment(Date.now()).format("ll")}</Text>
<Title order={5}>{kabar.title}</Title>
{kabar.imagesId === null ? (
<Text> ""
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Aliquam ) : (
nostrum vitae eum facilis similique minus exercitationem assumenda, <AspectRatio ratio={16 / 9}>
quidem dolores illum ducimus fuga rem molestias? Numquam id <Paper radius={"md"}>
praesentium dolor qui amet. <Image
</Text> alt="Foro"
src={RouterDonasi.api_gambar_kabar + `${kabar.imagesId}`}
<AspectRatio ratio={16 / 9}> />
<Image alt="Foro" src={"/aset/no-img.png"} /> </Paper>
</AspectRatio> </AspectRatio>
<Text> )}
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Aliquam <Text>{kabar.deskripsi}</Text>
nostrum vitae eum facilis similique minus exercitationem assumenda,
quidem dolores illum ducimus fuga rem molestias? Numquam id
praesentium dolor qui amet.
</Text>
</Stack> </Stack>
</Stack> </Stack>
</> </>

View File

@@ -11,7 +11,7 @@ import {
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import React from "react"; import React from "react";
import FooterDonasi from "../../component/footer_close_donasi"; import FooterDonasi from "../../component/footer_close_donasi";
import HeaderTamplateDonasi from "../../component/header_tamplate"; import ComponentDonasi_HeaderTamplate from "../../component/header_tamplate";
export default function LayoutDetailKabarDonasi({ export default function LayoutDetailKabarDonasi({
children, children,
@@ -22,7 +22,7 @@ export default function LayoutDetailKabarDonasi({
return ( return (
<> <>
<AppShell <AppShell
header={<HeaderTamplateDonasi title="Detail Kabar" hideBack={true} />} header={<ComponentDonasi_HeaderTamplate title="Detail Kabar" hideBack={true} />}
footer={<FooterDonasi />} footer={<FooterDonasi />}
> >
{children} {children}

View File

@@ -2,7 +2,7 @@
import ButtonDonasi from "@/app_modules/donasi/component/footer_button_donasi"; import ButtonDonasi from "@/app_modules/donasi/component/footer_button_donasi";
import FooterDonasi from "@/app_modules/donasi/component/footer_close_donasi"; import FooterDonasi from "@/app_modules/donasi/component/footer_close_donasi";
import HeaderTamplateDonasi from "@/app_modules/donasi/component/header_tamplate"; import ComponentDonasi_HeaderTamplate from "@/app_modules/donasi/component/header_tamplate";
import { AppShell } from "@mantine/core"; import { AppShell } from "@mantine/core";
import React from "react"; import React from "react";
@@ -19,7 +19,7 @@ export default function LayoutCeritaPenggalangDonasi({
return ( return (
<> <>
<AppShell <AppShell
header={<HeaderTamplateDonasi title="Cerita Penggalang Dana" />} header={<ComponentDonasi_HeaderTamplate title="Cerita Penggalang Dana" />}
> >
{children} {children}
</AppShell> </AppShell>
@@ -28,7 +28,7 @@ export default function LayoutCeritaPenggalangDonasi({
} }
return ( return (
<AppShell <AppShell
header={<HeaderTamplateDonasi title="Cerita Penggalang Dana" />} header={<ComponentDonasi_HeaderTamplate title="Cerita Penggalang Dana" />}
footer={<ButtonDonasi donasiId={donasiId}/>} footer={<ButtonDonasi donasiId={donasiId}/>}
> >
{children} {children}

View File

@@ -2,7 +2,7 @@
import { AppShell } from "@mantine/core"; import { AppShell } from "@mantine/core";
import React from "react"; import React from "react";
import HeaderTamplateDonasi from "../../../component/header_tamplate"; import ComponentDonasi_HeaderTamplate from "../../../component/header_tamplate";
export default function LayoutDonaturDonasi({ export default function LayoutDonaturDonasi({
children, children,
@@ -11,7 +11,7 @@ export default function LayoutDonaturDonasi({
}) { }) {
return ( return (
<> <>
<AppShell header={<HeaderTamplateDonasi title="Donatur" />}> <AppShell header={<ComponentDonasi_HeaderTamplate title="Donatur" />}>
{children} {children}
</AppShell> </AppShell>
</> </>

View File

@@ -35,15 +35,21 @@ import ComponentDonasi_InformasiPenggalangMain from "../../component/detail_main
export default function DetailMainDonasi({ export default function DetailMainDonasi({
dataDonasi, dataDonasi,
countDonatur countDonatur,
userLoginId,
}: { }: {
dataDonasi: MODEL_DONASI; dataDonasi: MODEL_DONASI;
countDonatur: number countDonatur: number;
userLoginId: string;
}) { }) {
return ( return (
<> <>
<Stack spacing={40}> <Stack spacing={40}>
<ComponentDonasi_DetailDataMain donasi={dataDonasi} countDonatur={countDonatur} /> <ComponentDonasi_DetailDataMain
donasi={dataDonasi}
countDonatur={countDonatur}
userLoginId={userLoginId}
/>
<ComponentDonasi_InformasiPenggalangMain author={dataDonasi.Author} /> <ComponentDonasi_InformasiPenggalangMain author={dataDonasi.Author} />
<ComponentDonasi_CeritaPenggalangMain donasi={dataDonasi} /> <ComponentDonasi_CeritaPenggalangMain donasi={dataDonasi} />
</Stack> </Stack>

View File

@@ -40,7 +40,7 @@ export default function KabarDonasi({
> >
{kabar.map((e, i) => ( {kabar.map((e, i) => (
<Box key={i}> <Box key={i}>
<ComponentDonasi_ListKabar kabar={e} /> <ComponentDonasi_ListKabar kabar={e} route={RouterDonasi.detail_kabar} />
</Box> </Box>
))} ))}
</SimpleGrid> </SimpleGrid>

View File

@@ -2,12 +2,12 @@
import { AppShell } from "@mantine/core" import { AppShell } from "@mantine/core"
import React from "react" import React from "react"
import HeaderTamplateDonasi from "../../../component/header_tamplate" import ComponentDonasi_HeaderTamplate from "../../../component/header_tamplate"
export default function LayoutKabarDonasi({children}: {children: React.ReactNode}){ export default function LayoutKabarDonasi({children}: {children: React.ReactNode}){
return<> return<>
<AppShell <AppShell
header={<HeaderTamplateDonasi title="Kabar Terbaru"/>} header={<ComponentDonasi_HeaderTamplate title="Kabar Terbaru"/>}
> >
{children} {children}
</AppShell> </AppShell>

View File

@@ -2,7 +2,7 @@
import { AppShell, Box, Button, Center, Footer } from "@mantine/core"; import { AppShell, Box, Button, Center, Footer } from "@mantine/core";
import React from "react"; import React from "react";
import HeaderTamplateDonasi from "../../component/header_tamplate"; import ComponentDonasi_HeaderTamplate from "../../component/header_tamplate";
import ButtonDonasi from "../../component/footer_button_donasi"; import ButtonDonasi from "../../component/footer_button_donasi";
export default function LayoutDetailMainDonasi({ export default function LayoutDetailMainDonasi({
@@ -15,7 +15,7 @@ export default function LayoutDetailMainDonasi({
return ( return (
<> <>
<AppShell <AppShell
header={<HeaderTamplateDonasi title="Detail Donasi" />} header={<ComponentDonasi_HeaderTamplate title="Detail Donasi" />}
footer={<ButtonDonasi donasiId={donasiId}/>} footer={<ButtonDonasi donasiId={donasiId}/>}
> >
{children} {children}

View File

@@ -1,7 +1,14 @@
"use client"; "use client";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import ComponentDonasi_NotedBox from "@/app_modules/donasi/component/noted_box"; import ComponentDonasi_NotedBox from "@/app_modules/donasi/component/noted_box";
import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah";
import { import {
MODEL_DONASI,
MODEL_DONASI_PENCAIRAN_DANA,
} from "@/app_modules/donasi/model/interface";
import {
AspectRatio,
Avatar, Avatar,
Button, Button,
Center, Center,
@@ -18,85 +25,103 @@ import {
import { useDisclosure } from "@mantine/hooks"; import { useDisclosure } from "@mantine/hooks";
import { IconTransferIn } from "@tabler/icons-react"; import { IconTransferIn } from "@tabler/icons-react";
import moment from "moment"; import moment from "moment";
import { useState } from "react";
export default function PencairanDanaDonasi() { export default function PencairanDanaDonasi({
totalAkumulasi,
listPencairan,
}: {
totalAkumulasi: MODEL_DONASI;
listPencairan: MODEL_DONASI_PENCAIRAN_DANA[];
}) {
const [akumulasi, setAkumulasi] = useState(totalAkumulasi);
const [listPD, setListPD] = useState(listPencairan);
return ( return (
<> <>
<Stack> <Stack>
<BoxDanaDicarikan /> <BoxDanaDicarikan akumulasi={akumulasi} />
<InformasiPencairanDana /> <InformasiPencairanDana listPD={listPD} />
</Stack> </Stack>
</> </>
); );
} }
function BoxDanaDicarikan() { function BoxDanaDicarikan({ akumulasi }: { akumulasi: MODEL_DONASI }) {
return ( return (
<> <>
<Paper bg={"gray.1"} p={"md"}> <Paper bg={"gray.1"} p={"md"}>
<Stack> <Stack>
<Grid> <Grid>
<Grid.Col span={6}> <Grid.Col span={6}>
<Title order={5}>Rp. 10.000.000</Title> <Title order={5}>
<Text fz={"xs"}>Dana sudah dicairkan</Text> <TampilanRupiahDonasi nominal={akumulasi.totalPencairan} />
</Grid.Col> </Title>
<Grid.Col span={6}> <Text fz={"xs"}>Dana sudah dicairkan</Text>
<Title order={5}>2 kali</Title> </Grid.Col>
<Text fz={"xs"}>Pencairan dana</Text> <Grid.Col span={6}>
</Grid.Col> <Title order={5}>{akumulasi.akumulasiPencairan} kali</Title>
</Grid> <Text fz={"xs"}>Pencairan dana</Text>
<ComponentDonasi_NotedBox informasi=" Pencairan dana akan dilakukan oleh Admin HIPMI tanpa campur tangan </Grid.Col>
</Grid>
<ComponentDonasi_NotedBox
informasi=" Pencairan dana akan dilakukan oleh Admin HIPMI tanpa campur tangan
pihak manapun, jika berita pencairan dana dibawah tidak sesuai pihak manapun, jika berita pencairan dana dibawah tidak sesuai
dengan kabar yang diberikan oleh PENGGALANG DANA. Maka pegguna lain dengan kabar yang diberikan oleh PENGGALANG DANA. Maka pegguna lain
dapat melaporkannya pada Admin HIPMI !"/> dapat melaporkannya pada Admin HIPMI !"
/>
</Stack> </Stack>
</Paper> </Paper>
</> </>
); );
} }
function InformasiPencairanDana() { function InformasiPencairanDana({
listPD,
}: {
listPD: MODEL_DONASI_PENCAIRAN_DANA[];
}) {
const [opened, { open, close }] = useDisclosure(false); const [opened, { open, close }] = useDisclosure(false);
const [idGambar, setIdGambar] = useState("");
return ( return (
<> <>
<Modal opened={opened} onClose={close} fullScreen> <Modal opened={opened} onClose={close} size={"xl"}>
<Paper> <AspectRatio ratio={9 / 16}>
<Stack> <Paper>
<Image
alt="Foto"
src={RouterDonasi.api_gambar_pencairan + `${idGambar}`}
/>
</Paper>
</AspectRatio>
</Modal>
{listPD.map((e, i) => (
<Paper key={i} withBorder p={"md"}>
<Text fz={"xs"}>{moment(e.createdAt).format("ll")}</Text>
<Stack spacing={"lg"}>
<Title order={5}>{e.title}</Title>
<Spoiler
maxHeight={50}
hideLabel="Sembunyikan"
showLabel="Baca Selengkapnya"
>
{e.deskripsi}
</Spoiler>
<Center> <Center>
<Title order={5}>Bukti Pencairan Dana</Title> <Button
radius={"xl"}
variant="outline"
leftIcon={<IconTransferIn />}
onClick={() => {
open();
setIdGambar(e.imagesId);
}}
>
Bukti Transfer
</Button>
</Center> </Center>
<Image alt="Foto" src={"/aset/donasi/bukti.jpg"} />
</Stack> </Stack>
</Paper> </Paper>
</Modal> ))}
{Array(2)
.fill(0)
.map((e, i) => (
<Paper key={i} withBorder p={"md"}>
<Text fz={"xs"}>{moment(Date.now()).format("ll")}</Text>
<Stack spacing={"lg"}>
<Title order={5}>Pencairan Dana Sebesar Rp. 5.000.000</Title>
<Spoiler
maxHeight={50}
hideLabel="Sembunyikan"
showLabel="Baca Selengkapnya"
>
Pencairan Dana kepada pihak Penggalang dana sebesar 5 juta yang
di transfer pada, {moment(Date.now()).format("lll")}.
</Spoiler>
<Center>
<Button
radius={"xl"}
variant="outline"
leftIcon={<IconTransferIn />}
onClick={() => open()}
>
Bukti Transfer
</Button>
</Center>
</Stack>
</Paper>
))}
</> </>
); );
} }

View File

@@ -1,6 +1,6 @@
"use client"; "use client";
import HeaderTamplateDonasi from "@/app_modules/donasi/component/header_tamplate"; import ComponentDonasi_HeaderTamplate from "@/app_modules/donasi/component/header_tamplate";
import { AppShell } from "@mantine/core"; import { AppShell } from "@mantine/core";
import React from "react"; import React from "react";
@@ -11,7 +11,7 @@ export default function LayoutPencairanDanaDonasi({
}) { }) {
return ( return (
<> <>
<AppShell header={<HeaderTamplateDonasi title="Pencairan Dana" />}> <AppShell header={<ComponentDonasi_HeaderTamplate title="Pencairan Dana" />}>
{children} {children}
</AppShell> </AppShell>
</> </>

View File

@@ -1,6 +1,6 @@
"use client"; "use client";
import HeaderTamplateDonasi from "@/app_modules/donasi/component/header_tamplate"; import ComponentDonasi_HeaderTamplate from "@/app_modules/donasi/component/header_tamplate";
import { AppShell } from "@mantine/core"; import { AppShell } from "@mantine/core";
import React from "react"; import React from "react";
@@ -12,7 +12,7 @@ export default function LayoutPenggalangDanaDonasi({
return ( return (
<> <>
<AppShell <AppShell
header={<HeaderTamplateDonasi title="Informasi Penggalangan Dana" />} header={<ComponentDonasi_HeaderTamplate title="Informasi Penggalangan Dana" />}
// footer={<FooterDonasi />} // footer={<FooterDonasi />}
> >
{children} {children}

View File

@@ -31,17 +31,19 @@ import ComponentDonasi_InformasiPenggalangMain from "../../component/detail_main
export default function DetailPublishDonasi({ export default function DetailPublishDonasi({
dataPublish, dataPublish,
countDonatur countDonatur,
userLoginId
}: { }: {
dataPublish: MODEL_DONASI; dataPublish: MODEL_DONASI;
countDonatur: number countDonatur: number,
userLoginId: string
}) { }) {
const [donasi, setDonasi] = useState(dataPublish); const [donasi, setDonasi] = useState(dataPublish);
return ( return (
<> <>
{/* <pre>{JSON.stringify(donasi,null,2)}</pre> */} {/* <pre>{JSON.stringify(donasi,null,2)}</pre> */}
<Stack spacing={40}> <Stack spacing={40}>
<ComponentDonasi_DetailDataMain donasi={donasi} countDonatur={countDonatur} /> <ComponentDonasi_DetailDataMain donasi={donasi} countDonatur={countDonatur} userLoginId={userLoginId}/>
<ComponentDonasi_InformasiPenggalangMain author={donasi.Author}/> <ComponentDonasi_InformasiPenggalangMain author={donasi.Author}/>
<ComponentDonasi_CeritaPenggalangMain donasi={donasi} /> <ComponentDonasi_CeritaPenggalangMain donasi={donasi} />
</Stack> </Stack>

View File

@@ -2,7 +2,7 @@
import { AppShell } from "@mantine/core"; import { AppShell } from "@mantine/core";
import React from "react"; import React from "react";
import HeaderTamplateDonasi from "../../component/header_tamplate"; import ComponentDonasi_HeaderTamplate from "../../component/header_tamplate";
import { IconEdit, IconMessageShare } from "@tabler/icons-react"; import { IconEdit, IconMessageShare } from "@tabler/icons-react";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi"; import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
@@ -17,7 +17,7 @@ export default function LayoutDetailPublishDonasi({
<> <>
<AppShell <AppShell
header={ header={
<HeaderTamplateDonasi <ComponentDonasi_HeaderTamplate
title="Detail Publish" title="Detail Publish"
icon={<IconMessageShare />} icon={<IconMessageShare />}
route2={RouterDonasi.list_kabar + `${donasiId}`} route2={RouterDonasi.list_kabar + `${donasiId}`}

View File

@@ -37,6 +37,7 @@ import { NotifBerhasil } from "../../component/notifikasi/notif_berhasil";
import { NotifGagal } from "../../component/notifikasi/notif_gagal"; import { NotifGagal } from "../../component/notifikasi/notif_gagal";
import ComponentDonasi_CeritaPenggalangMain from "../../component/detail_main/cerita_penggalang"; import ComponentDonasi_CeritaPenggalangMain from "../../component/detail_main/cerita_penggalang";
import ComponentDonasi_DetailDataGalangDana from "../../component/detail_galang_dana/detail_data_donasi"; import ComponentDonasi_DetailDataGalangDana from "../../component/detail_galang_dana/detail_data_donasi";
import { Donasi_funDeleteDonasiById } from "../../fun/delete/fin_delete_donasi_by_id";
export default function DetailRejectDonasi({ export default function DetailRejectDonasi({
dataReject, dataReject,
@@ -92,8 +93,15 @@ function ButtonAction({ donasiId }: { donasiId: string }) {
setTabsPostingDonasi("Draft"); setTabsPostingDonasi("Draft");
} }
async function onDelete() { async function onDelete() {
router.push(RouterDonasi.main_galang_dana); await Donasi_funDeleteDonasiById(donasiId).then((res) => {
setTabsPostingDonasi("Reject"); if (res.status === 200) {
router.push(RouterDonasi.main_galang_dana);
setTabsPostingDonasi("Reject");
NotifBerhasil(res.message);
} else {
NotifGagal(res.message);
}
});
} }
return ( return (
<> <>

View File

@@ -2,7 +2,7 @@
import { AppShell } from "@mantine/core"; import { AppShell } from "@mantine/core";
import React from "react"; import React from "react";
import HeaderTamplateDonasi from "../../component/header_tamplate"; import ComponentDonasi_HeaderTamplate from "../../component/header_tamplate";
import { IconEdit, IconMessageShare } from "@tabler/icons-react"; import { IconEdit, IconMessageShare } from "@tabler/icons-react";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi"; import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
@@ -14,7 +14,7 @@ export default function LayoutDetailRejectDonasi({
return ( return (
<> <>
<AppShell header={<HeaderTamplateDonasi title="Detail Reject" />}> <AppShell header={<ComponentDonasi_HeaderTamplate title="Detail Reject" />}>
{children} {children}
</AppShell> </AppShell>
</> </>

View File

@@ -2,7 +2,7 @@
import { AppShell } from "@mantine/core"; import { AppShell } from "@mantine/core";
import React from "react"; import React from "react";
import HeaderTamplateDonasi from "../../component/header_tamplate"; import ComponentDonasi_HeaderTamplate from "../../component/header_tamplate";
import { IconEdit, IconMessageShare } from "@tabler/icons-react"; import { IconEdit, IconMessageShare } from "@tabler/icons-react";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi"; import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
@@ -14,7 +14,7 @@ export default function LayoutDetailReviewDonasi({
return ( return (
<> <>
<AppShell header={<HeaderTamplateDonasi title="Detail Review" />}> <AppShell header={<ComponentDonasi_HeaderTamplate title="Detail Review" />}>
{children} {children}
</AppShell> </AppShell>
</> </>

View File

@@ -121,7 +121,7 @@ export default function EditCeritaPenggalangDonasi({
radius={"xl"} radius={"xl"}
onClick={() => onUpdate(router, value, file as any)} onClick={() => onUpdate(router, value, file as any)}
> >
Simpan Update
</Button> </Button>
</Stack> </Stack>
{/* <pre> {JSON.stringify(value.pembukaan, null, 2)}</pre> */} {/* <pre> {JSON.stringify(value.pembukaan, null, 2)}</pre> */}

View File

@@ -2,7 +2,7 @@
import { AppShell } from "@mantine/core"; import { AppShell } from "@mantine/core";
import React from "react"; import React from "react";
import HeaderTamplateDonasi from "../../component/header_tamplate"; import ComponentDonasi_HeaderTamplate from "../../component/header_tamplate";
export default function LayoutEditCeritaPenggalangDonasi({ export default function LayoutEditCeritaPenggalangDonasi({
children, children,
@@ -11,7 +11,7 @@ export default function LayoutEditCeritaPenggalangDonasi({
}) { }) {
return ( return (
<> <>
<AppShell header={<HeaderTamplateDonasi title="Update Cerita Penggalang" />}> <AppShell header={<ComponentDonasi_HeaderTamplate title="Update Cerita Penggalang" />}>
{children} {children}
</AppShell> </AppShell>
</> </>

View File

@@ -2,7 +2,7 @@
import { AppShell } from "@mantine/core"; import { AppShell } from "@mantine/core";
import React from "react"; import React from "react";
import HeaderTamplateDonasi from "../../component/header_tamplate"; import ComponentDonasi_HeaderTamplate from "../../component/header_tamplate";
export default function LayoutEditDonasi({ export default function LayoutEditDonasi({
children, children,
@@ -11,7 +11,7 @@ export default function LayoutEditDonasi({
}) { }) {
return ( return (
<> <>
<AppShell header={<HeaderTamplateDonasi title="Edit Donasi" />}> <AppShell header={<ComponentDonasi_HeaderTamplate title="Edit Donasi" />}>
{children} {children}
</AppShell> </AppShell>
</> </>

View File

@@ -0,0 +1,67 @@
"use client";
import { Button, Stack, TextInput } from "@mantine/core";
import { MODEL_DONASI } from "../../model/interface";
import { useState } from "react";
import _ from "lodash";
import { useRouter } from "next/navigation";
import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
import { Donasi_funUpdateRekening } from "../../fun/update/fun_update_rekening";
import { NotifBerhasil } from "../../component/notifikasi/notif_berhasil";
import { NotifGagal } from "../../component/notifikasi/notif_gagal";
export default function Donasi_EditRekening({
dataDonasi,
}: {
dataDonasi: MODEL_DONASI;
}) {
const router = useRouter();
const [donasi, setDonasi] = useState(dataDonasi);
return (
<>
<Stack spacing={"xl"}>
<Stack spacing={"sm"}>
<TextInput
withAsterisk
label="Nama Bank"
placeholder="Masukan Nama Bank"
value={donasi.namaBank}
onChange={(val) =>
setDonasi({
...donasi,
namaBank: _.upperCase(val.target.value),
})
}
/>
<TextInput
withAsterisk
label="Nomor Rekening"
placeholder="Masukkan Nomor Rekening"
value={donasi.rekening}
onChange={(val) =>
setDonasi({
...donasi,
rekening: val.target.value,
})
}
/>
</Stack>
<Button radius={"xl"} onClick={() => onUpdate(router, donasi)}>
Update
</Button>
</Stack>
</>
);
}
async function onUpdate(router: AppRouterInstance, donasi: MODEL_DONASI) {
await Donasi_funUpdateRekening(donasi).then((res) => {
if (res.status === 200) {
router.back();
NotifBerhasil(res.message);
} else {
NotifGagal(res.message);
}
});
}

View File

@@ -0,0 +1,21 @@
"use client";
import { AppShell } from "@mantine/core";
import React from "react";
import ComponentDonasi_HeaderTamplate from "../../component/header_tamplate";
export default function LayoutDonasi_EditRekening({
children,
}: {
children: React.ReactNode;
}) {
return (
<>
<AppShell
header={<ComponentDonasi_HeaderTamplate title="Edit Rekening" />}
>
{children}
</AppShell>
</>
);
}

View File

@@ -55,7 +55,7 @@ export default function ListKabarDonasi({
> >
{kabar.map((e, i) => ( {kabar.map((e, i) => (
<Box key={i}> <Box key={i}>
<ComponentDonasi_ListKabar kabar={e}/> <ComponentDonasi_ListKabar kabar={e} route={RouterDonasi.update_kabar}/>
</Box> </Box>
))} ))}
</SimpleGrid> </SimpleGrid>

View File

@@ -1,6 +1,6 @@
"use client"; "use client";
import HeaderTamplateDonasi from "@/app_modules/donasi/component/header_tamplate"; import ComponentDonasi_HeaderTamplate from "@/app_modules/donasi/component/header_tamplate";
import { AppShell } from "@mantine/core"; import { AppShell } from "@mantine/core";
import React from "react"; import React from "react";
@@ -12,7 +12,7 @@ export default function LayoutListKabarDonasi({
return ( return (
<> <>
<AppShell <AppShell
header={<HeaderTamplateDonasi title="List Kabar" />}> header={<ComponentDonasi_HeaderTamplate title="List Kabar" />}>
{children} {children}
</AppShell> </AppShell>
</> </>

Some files were not shown because too many files have changed in this diff Show More