Kabar Donasi

# feat
- Create kabar
- Delete kabar
- List kabar
## No issue
This commit is contained in:
2024-01-09 10:42:00 +08:00
parent b4fe35e7d8
commit 4af3f74a97
51 changed files with 678 additions and 147 deletions

View File

@@ -66,6 +66,7 @@ model Profile {
model Images {
id String @id @default(cuid())
url String
label String @default("null")
active Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@ -409,5 +410,3 @@ model Donasi_Kabar {
ImagesKabar Images? @relation(fields: [imagesId], references: [id])
imagesId String?
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

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/kabar/${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/kabar/${get?.url}`);
return new NextResponse(file, {
headers: {
"Content-Type": "image/png",
},
});
}

View File

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

View File

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

View File

@@ -7,6 +7,7 @@ export default async function Page({ params }: { params: { id: string } }) {
let invoiceId = params.id;
const dataDonasi = await Donasi_getOneInvoiceById(invoiceId);
const countDonatur= await Donasi_getCountDonatur(dataDonasi?.donasiId as any)
console.log(dataDonasi?.Donasi?.progres)
return (

View File

@@ -3,12 +3,16 @@ import React from "react";
export default async function Layout({
children,
params,
}: {
children: React.ReactNode;
params: { id: string };
}) {
return (
<>
<LayoutDetailPublishDonasi>{children}</LayoutDetailPublishDonasi>
<LayoutDetailPublishDonasi donasiId={params.id}>
{children}
</LayoutDetailPublishDonasi>
</>
);
}

View File

@@ -0,0 +1,12 @@
import { DonaturDonasi } from "@/app_modules/donasi";
import { Donasi_getListDonatur } from "@/app_modules/donasi/fun/get/get_list_donatur";
export default async function Page({ params }: { params: { id: string } }) {
const listDonatur = await Donasi_getListDonatur(params.id);
return (
<>
<DonaturDonasi listDonatur={listDonatur as any} />
</>
);
}

View File

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

View File

@@ -3,12 +3,14 @@ import React from "react";
export default async function Layout({
children,
params
}: {
children: React.ReactNode;
params: {id: string}
}) {
return (
<>
<LayoutUpdateKabarDonasi>{children}</LayoutUpdateKabarDonasi>
<LayoutUpdateKabarDonasi kabarId={params.id}>{children}</LayoutUpdateKabarDonasi>
</>
);
}

View File

@@ -0,0 +1,11 @@
import { UpdateKabarDonasi } 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<>
<UpdateKabarDonasi dataKabar={dataKabar as any}/>
</>
}

View File

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

View File

@@ -0,0 +1,13 @@
import { KabarDonasi } from "@/app_modules/donasi";
import { Donasi_getListKabar } from "@/app_modules/donasi/fun/get/get_list_kabar";
export default async function Page({params}: {params: {id: string}}) {
const donasiId = params.id
const listKabar = await Donasi_getListKabar(donasiId)
return (
<>
<KabarDonasi listKabar={listKabar as any} />
</>
);
}

View File

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

View File

@@ -3,8 +3,10 @@ import React from "react";
export default async function Layput({
children,
params
}: {
children: React.ReactNode;
params: {id: string}
}) {
return (
<>

View File

@@ -0,0 +1,13 @@
import { ListKabarDonasi } from "@/app_modules/donasi";
import { Donasi_getListKabar } from "@/app_modules/donasi/fun/get/get_list_kabar";
export default async function Page({params}: {params: {id: string}}) {
const donasiId = params.id
const listKabar = await Donasi_getListKabar(donasiId)
return (
<>
<ListKabarDonasi donasiId={donasiId} listKabar={listKabar as any} />
</>
);
}

View File

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

View File

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

View File

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

View File

@@ -5,6 +5,7 @@ export default async function Page({ params }: { params: { id: string } }) {
let authorId = params.id;
const dataPenggalang = await Donasi_getAuthorById(authorId);
return (
<>
<PenggalangDanaDonasi dataPenggalang={dataPenggalang as any} />

View File

@@ -4,6 +4,8 @@ export const RouterDonasi = {
api_gambar_cerita: "/api/donasi/gambar_cerita/",
api_image: "/api/donasi/image/",
api_image_cerita: "/api/donasi/image_cerita/",
api_gambar_kabar: "/api/donasi/gambar_kabar/",
//main
main_beranda: "/dev/donasi/main/beranda",
@@ -11,11 +13,12 @@ export const RouterDonasi = {
main_donasi_saya: "/dev/donasi/main/donasi_saya",
// create
create: "/dev/donasi/create",
create_donasi: "/dev/donasi/create_donasi",
create_cerita_penggalang: "/dev/donasi/create/cerita_penggalang/",
create_kabar: "/dev/donasi/create/create_kabar/",
// edit
update_kabar: "/dev/donasi/edit/update_kabar",
update_kabar: "/dev/donasi/edit/update_kabar/",
edit_donasi: "/dev/donasi/edit/edit_donasi/",
edit_cerita_penggalang: "/dev/donasi/edit/edit_cerita/",
@@ -32,12 +35,13 @@ export const RouterDonasi = {
detail_donasi_saya: "/dev/donasi/detail/detail_donasi_saya/",
//alur donasi
donatur: "/dev/donasi/donatur",
kabar: "/dev/donasi/kabar",
donatur: "/dev/donasi/donatur/",
kabar: "/dev/donasi/kabar/",
pencairan_dana: "/dev/donasi/pencairan_dana",
penggalang_dana: "/dev/donasi/penggalang_dana/",
cerita_penggalang: "/dev/donasi/cerita_penggalang/",
list_kabar: "/dev/donasi/list_kabar",
list_kabar: "/dev/donasi/list_kabar/",
notif_page:"/dev/donasi/notif_page/",
// proses donasi
masukan_donasi: "/dev/donasi/proses_donasi/masukan_donasi/",

View File

@@ -44,5 +44,6 @@ export async function AdminDonasi_getListStatusInvoiceProses(donasiId: string) {
},
});
return dataStatus;
}

View File

@@ -78,7 +78,7 @@ export function ComponentDonasi_DetailDataMain({
<Grid>
<Grid.Col
span={"auto"}
onClick={() => router.push(RouterDonasi.donatur)}
onClick={() => router.push(RouterDonasi.donatur + `${donasi.id}`)}
>
<Stack align="center" spacing={"xs"}>
<Group>
@@ -93,7 +93,7 @@ export function ComponentDonasi_DetailDataMain({
<Divider orientation="vertical" />
<Grid.Col
span={"auto"}
onClick={() => router.push(RouterDonasi.kabar)}
onClick={() => router.push(RouterDonasi.kabar + `${donasi.id}`)}
>
<Stack spacing={"sm"} align="center">
<IconMessageChatbot color="skyblue" />

View File

@@ -0,0 +1,40 @@
"use client";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import { Paper, Stack, Text, Title } from "@mantine/core";
import moment from "moment";
import router from "next/router";
import { MODEL_DONASI_KABAR } from "../../model/interface";
export default function ComponentDonasi_ListKabar({
kabar,
}: {
kabar: MODEL_DONASI_KABAR;
}) {
return (
<>
<Paper bg={"gray.1"} p={"md"}>
<Stack>
<Text fz={"xs"}>{moment(kabar.createdAt).format("ll")}</Text>
<Stack>
<Title order={5}>{kabar.title}</Title>
<Stack spacing={0}>
<Text lineClamp={2}>{kabar.deskripsi}</Text>
<Text
c={"blue"}
onClick={() =>
router.push(RouterDonasi.update_kabar + `${kabar.id}`)
}
>
Buka Kabar
</Text>
</Stack>
</Stack>
</Stack>
</Paper>
</>
);
}

View File

@@ -0,0 +1,141 @@
"use client";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import {
AspectRatio,
Button,
Center,
FileButton,
Image,
Paper,
Stack,
TextInput,
Textarea,
} from "@mantine/core";
import { IconCamera } from "@tabler/icons-react";
import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { Donasi_funCreateKabar } from "../../fun/create/fun_create_kabar";
import { NotifBerhasil } from "../../component/notifikasi/notif_berhasil";
import { NotifGagal } from "../../component/notifikasi/notif_gagal";
import _ from "lodash";
import { NotifPeringatan } from "../../component/notifikasi/notif_peringatan";
export default function Donasi_CreateKabar({ donasiId }: { donasiId: string }) {
const router = useRouter();
const [file, setFile] = useState<File | null>(null);
const [imageKabar, setImageKabar] = useState<any | null>();
const [kabar, setKabar] = useState({
judul: "",
deskripsi: "",
});
return (
<>
<Stack>
<TextInput
label="Judul"
withAsterisk
placeholder="Masukan judul kabar"
onChange={(val) => {
setKabar({
...kabar,
judul: val.target.value,
});
}}
/>
<Textarea
label="Deskripsi"
withAsterisk
placeholder="Masukan deskripsi kabar"
onChange={(val) => {
setKabar({
...kabar,
deskripsi: val.target.value,
});
}}
/>
<Stack>
<AspectRatio ratio={16 / 9}>
<Paper radius={"md"}>
<Image
alt="Foto"
src={imageKabar ? imageKabar : "/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");
setImageKabar(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>
<Button
radius={"xl"}
mt={"lg"}
onClick={() => onSave(router, donasiId, kabar, file as any)}
>
Simpan
</Button>
</Stack>
</>
);
}
interface Model_Kabar {
judul: string;
deskripsi: string;
}
async function onSave(
router: AppRouterInstance,
donasiId: string,
kabar: Model_Kabar,
file: FormData
) {
const body = {
donasiId: donasiId,
title: kabar.judul,
deskripsi: kabar.deskripsi,
};
if (_.values(body).includes("")) return NotifPeringatan("Lengkapi Data");
if (!file) return NotifPeringatan("Lengkapi Gambar");
const gambar = new FormData();
gambar.append("file", file as any);
await Donasi_funCreateKabar(body as any, gambar).then((res) => {
if (res.status === 200) {
NotifBerhasil(res.message);
router.back()
} else {
NotifGagal(res.message);
}
});
}

View File

@@ -0,0 +1,19 @@
"use client";
import { AppShell } from "@mantine/core";
import React from "react";
import HeaderTamplateDonasi from "../../component/header_tamplate";
export default function LayoutDonasi_CreateKabar({
children,
}: {
children: React.ReactNode;
}) {
return (
<>
<AppShell header={<HeaderTamplateDonasi title="Buat Kabar" />}>
{children}
</AppShell>
</>
);
}

View File

@@ -1,5 +1,7 @@
"use client";
import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah";
import { MODEL_DONASI_INVOICE } from "@/app_modules/donasi/model/interface";
import {
Avatar,
Center,
@@ -11,10 +13,13 @@ import {
Text,
Title,
} from "@mantine/core";
import { IconMoodSmile, IconMoodSmileBeam } from "@tabler/icons-react";
import { size } from "lodash";
import moment from "moment";
import { useState } from "react";
export default function DonaturDonasi() {
export default function DonaturDonasi({listDonatur}: {listDonatur: MODEL_DONASI_INVOICE[]}) {
const [donatur, setDonatur] = useState(listDonatur)
return (
<>
<SimpleGrid
@@ -26,26 +31,26 @@ export default function DonaturDonasi() {
{ maxWidth: "36rem", cols: 1, spacing: "sm" },
]}
>
{Array(10)
.fill(0)
{donatur
.map((e, i) => (
<Paper key={i} bg={"gray.1"} p={"sm"}>
<Grid>
<Grid.Col span={3}>
<Center h={"100%"}>
<Avatar variant="filled" radius={"xl"} size={"md"} />
{/* <Avatar variant="filled" radius={"xl"} size={"md"} /> */}
<IconMoodSmileBeam size={50}/>
</Center>
</Grid.Col>
<Grid.Col span={9}>
<Stack spacing={0}>
<Title order={5}>Orang Baik</Title>
<Title order={5}>{e.Author.username}</Title>
<Group spacing={"xs"}>
<Text>Berdonasi sebesar</Text>
<Text fz={"xs"}>Berdonasi sebesar</Text>
<Text truncate fw={"bold"}>
Rp. 50.000
<TampilanRupiahDonasi nominal={+e.nominal}/>
</Text>
</Group>
<Text fz={"xs"}>{moment(Date.now()).format("ll")}</Text>
<Text fz={"xs"}>{moment(e.createdAt).format("ll")}</Text>
</Stack>
</Grid.Col>
</Grid>

View File

@@ -1,9 +1,12 @@
"use client";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import ComponentDonasi_ListKabar from "@/app_modules/donasi/component/detail_main/list_kabar";
import { MODEL_DONASI_KABAR } from "@/app_modules/donasi/model/interface";
import {
ActionIcon,
Avatar,
Box,
Group,
Paper,
SimpleGrid,
@@ -15,9 +18,15 @@ import {
import { IconCircleChevronRight } from "@tabler/icons-react";
import moment from "moment";
import { useRouter } from "next/navigation";
import { useState } from "react";
export default function KabarDonasi() {
const router = useRouter()
export default function KabarDonasi({
listKabar,
}: {
listKabar: MODEL_DONASI_KABAR[];
}) {
const router = useRouter();
const [kabar, setKabar] = useState(listKabar);
return (
<>
<SimpleGrid
@@ -29,33 +38,11 @@ export default function KabarDonasi() {
{ maxWidth: "36rem", cols: 1, spacing: "sm" },
]}
>
{Array(4)
.fill(0)
.map((e, i) => (
<Paper key={i} bg={"gray.1"} p={"md"}>
<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>
<Title order={5}>Judul Kabar</Title>
<Stack spacing={0}>
<Text lineClamp={2}>
Lorem ipsum, dolor sit amet consectetur adipisicing elit.
Aliquam nostrum vitae eum facilis similique minus
exercitationem assumenda, quidem dolores illum ducimus
fuga rem molestias? Numquam id praesentium dolor qui amet.
</Text>
<Text c={"blue"} onClick={() => router.push(RouterDonasi.detail_kabar)}>Buka Kabar</Text>
</Stack>
</Stack>
</Stack>
</Paper>
))}
{kabar.map((e, i) => (
<Box key={i}>
<ComponentDonasi_ListKabar kabar={e} />
</Box>
))}
</SimpleGrid>
</>
);

View File

@@ -6,14 +6,24 @@ import HeaderTamplateDonasi from "../../component/header_tamplate";
import { IconEdit, IconMessageShare } from "@tabler/icons-react";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
export default function LayoutDetailPublishDonasi({
export default function LayoutDetailPublishDonasi({
children,
donasiId,
}: {
children: React.ReactNode;
donasiId: string;
}) {
return (
<>
<AppShell header={<HeaderTamplateDonasi title="Detail Publish" icon={<IconMessageShare/>} route2={RouterDonasi.list_kabar} />}>
<AppShell
header={
<HeaderTamplateDonasi
title="Detail Publish"
icon={<IconMessageShare />}
route2={RouterDonasi.list_kabar + `${donasiId}`}
/>
}
>
{children}
</AppShell>
</>

View File

@@ -4,6 +4,7 @@ import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
import {
ActionIcon,
Avatar,
Box,
Button,
Group,
Paper,
@@ -20,13 +21,27 @@ import {
} from "@tabler/icons-react";
import moment from "moment";
import { useRouter } from "next/navigation";
import { MODEL_DONASI_KABAR } from "../../model/interface";
import { useState } from "react";
import ComponentDonasi_ListKabar from "../../component/detail_main/list_kabar";
export default function ListKabarDonasi() {
export default function ListKabarDonasi({
donasiId,
listKabar,
}: {
donasiId: string;
listKabar: MODEL_DONASI_KABAR[];
}) {
const router = useRouter();
const [kabar, setKabar] = useState(listKabar);
return (
<>
<Stack>
<Button leftIcon={<IconCirclePlus />} radius={"xl"}>
<Button
leftIcon={<IconCirclePlus />}
radius={"xl"}
onClick={() => router.push(RouterDonasi.create_kabar + `${donasiId}`)}
>
Tambah Kabar
</Button>
<SimpleGrid
@@ -38,40 +53,11 @@ export default function ListKabarDonasi() {
{ maxWidth: "36rem", cols: 1, spacing: "sm" },
]}
>
{Array(4)
.fill(0)
.map((e, i) => (
<Paper key={i} bg={"gray.1"} p={"md"}>
<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>
<Title order={5}>Judul Kabar</Title>
<Stack spacing={0}>
<Text lineClamp={2}>
Lorem ipsum, dolor sit amet consectetur adipisicing
elit. Aliquam nostrum vitae eum facilis similique minus
exercitationem assumenda, quidem dolores illum ducimus
fuga rem molestias? Numquam id praesentium dolor qui
amet.
</Text>
<Text
c={"blue"}
onClick={() => router.push(RouterDonasi.update_kabar)}
>
Buka Kabar
</Text>
</Stack>
</Stack>
</Stack>
</Paper>
))}
{kabar.map((e, i) => (
<Box key={i}>
<ComponentDonasi_ListKabar kabar={e}/>
</Box>
))}
</SimpleGrid>
</Stack>
</>

View File

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

View File

@@ -13,13 +13,20 @@ import { useRouter } from "next/navigation";
import React from "react";
import FooterDonasi from "../../component/footer_close_donasi";
import HeaderTamplateDonasi from "../../component/header_tamplate";
import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime";
import { Donasi_funDeleteKabar } from "../../fun/delete/fun_delete.kabar";
import { NotifBerhasil } from "../../component/notifikasi/notif_berhasil";
import { NotifGagal } from "../../component/notifikasi/notif_gagal";
export default function LayoutUpdateKabarDonasi({
children,
kabarId
}: {
children: React.ReactNode;
kabarId: string
}) {
const router = useRouter();
return (
<>
<AppShell
@@ -27,10 +34,10 @@ export default function LayoutUpdateKabarDonasi({
footer={
<Footer height={70}>
<Group align="center" h={"100%"} position="center" spacing={"xl"}>
<Button radius={"xl"} variant="outline" color="green">
{/* <Button radius={"xl"} variant="outline" color="green">
Edit
</Button>
<Button radius={"xl"} variant="outline" color="red">
</Button> */}
<Button radius={"xl"} variant="outline" color="red" onClick={() => onDelete(router,kabarId )}>
Hapus
</Button>
</Group>
@@ -42,3 +49,15 @@ export default function LayoutUpdateKabarDonasi({
</>
);
}
async function onDelete(router: AppRouterInstance ,kabarId: string) {
await Donasi_funDeleteKabar(kabarId)
.then((res) => {
if(res.status === 200){
router.back()
NotifBerhasil(res.message)
} else {
NotifGagal(res.message)
}
})
}

View File

@@ -0,0 +1,50 @@
"use server";
import prisma from "@/app/lib/prisma";
import _ from "lodash";
import { v4 } from "uuid";
import fs from "fs";
import { MODEL_DONASI_KABAR } from "../../model/interface";
import { revalidatePath } from "next/cache";
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
export async function Donasi_funCreateKabar(
req: MODEL_DONASI_KABAR | any,
file: FormData
) {
const dataImage: any = file.get("file");
const fileName = dataImage.name;
const fileExtension = _.lowerCase(dataImage.name.split(".").pop());
const fRandomName = v4(fileName) + "." + fileExtension;
const upload = await prisma.images.create({
data: {
url: fRandomName,
label: "DONASI_KABAR"
},
select: {
id: true,
url: true,
},
});
if (!upload) return { status: 400, message: "Gagal upload gambar" };
const uploadFolder = Buffer.from(await dataImage.arrayBuffer());
fs.writeFileSync(`./public/donasi/kabar/${upload.url}`, uploadFolder);
const create = await prisma.donasi_Kabar.create({
data: {
title: req.title,
deskripsi: req.deskripsi,
donasiId: req.donasiId,
imagesId: upload.id
},
});
if(!create) return {status: 400, message: "Gagal membuat data"}
revalidatePath("/dev/donasi/list_kabar")
return{
status: 200,
message: "Berhasil disimpan"
}
}

View File

@@ -0,0 +1,35 @@
"use server";
import prisma from "@/app/lib/prisma";
import fs from "fs";
import { revalidatePath } from "next/cache";
export async function Donasi_funDeleteKabar(kabarId: string) {
const del = await prisma.donasi_Kabar.delete({
where: {
id: kabarId,
},
select: {
imagesId: true,
},
});
if (!del) return { status: 400, message: "Gagal hapus data" };
const delImg = await prisma.images.delete({
where: {
id: del.imagesId as any,
},
select: {
url: true,
},
});
if (!delImg) return { status: 400, message: "Gagal hapus gambar" };
if (delImg) fs.unlinkSync(`./public/donasi/kabar/${delImg.url}`);
revalidatePath("/dev/donasi/list_kabar");
return {
status: 200,
message: "Berhasl hapus",
};
}

View File

@@ -23,6 +23,7 @@ export default async function Donasi_getByStatus(
title: true,
imagesId: true,
target: true,
progres: true,
publishTime: true,
DonasiMaster_Durasi: true,
terkumpul: true,

View File

@@ -0,0 +1,39 @@
"use server";
import prisma from "@/app/lib/prisma";
export async function Donasi_getListDonatur(donasiId: string) {
const data = await prisma.donasi_Invoice.findMany({
where: {
donasiId: donasiId,
donasiMaster_StatusInvoiceId: "1",
},
select: {
id: true,
nominal: true,
DonasiMaster_StatusInvoice: true,
donasiMaster_StatusInvoiceId: true,
Author: true,
Donasi: {
select: {
id: true,
title: true,
target: true,
progres: true,
authorId: true,
imagesId: true,
publishTime: true,
donasiMaster_KategoriId: true,
donasiMaster_DurasiId: true,
donasiMaster_StatusDonasiId: true,
imageDonasi: true,
DonasiMaster_Ketegori: true,
DonasiMaster_Durasi: true,
DonasiMaster_Status: true,
},
},
},
});
return data;
}

View File

@@ -0,0 +1,19 @@
"use server";
import prisma from "@/app/lib/prisma";
export async function Donasi_getListKabar(donasiId: string) {
// console.log(donasiId)
const data = await prisma.donasi_Kabar.findMany({
where: {
donasiId: donasiId,
},
select: {
id: true,
title: true,
deskripsi: true,
createdAt: true
}
});
return data;
}

View File

@@ -0,0 +1,12 @@
"use server";
import prisma from "@/app/lib/prisma";
export async function Donasi_getOneKabar(kabarId: string) {
const data = await prisma.donasi_Kabar.findFirst({
where: {
id: kabarId,
},
});
return data;
}

View File

@@ -46,6 +46,10 @@ import Donasi_InvoiceProses from "./proses_donasi/invoice";
import LayoutDonasi_InvoiceProses from "./proses_donasi/invoice/layout";
import Donasi_ProsesTransaksi from "./proses_donasi/proses_transaksi";
import LayoutDonasi_ProsesTransaksi from "./proses_donasi/proses_transaksi/layout";
import Donasi_CreateKabar from "./create/create_kabar";
import LayoutDonasi_CreateKabar from "./create/create_kabar/layout";
import Donasi_NotifPage from "./main/notif/notif_page";
import LayoutDonasi_NotifPage from "./main/notif/layout";
export {
MainDonasi,
@@ -96,4 +100,8 @@ export {
LayoutDonasi_InvoiceProses,
Donasi_ProsesTransaksi,
LayoutDonasi_ProsesTransaksi,
Donasi_CreateKabar,
LayoutDonasi_CreateKabar,
Donasi_NotifPage,
LayoutDonasi_NotifPage,
};

View File

@@ -74,7 +74,7 @@ export default function GalangDanaDonasi({
bg={"orange"}
color="orange"
leftIcon={<IconCirclePlus />}
onClick={() => router.push(RouterDonasi.create)}
onClick={() => router.push(RouterDonasi.create_donasi)}
>
Galang Dana
</Button>

View File

@@ -7,12 +7,18 @@ import {
Flex,
Footer,
Grid,
Group,
Header,
Indicator,
Text,
Title,
} from "@mantine/core";
import React, { useState } from "react";
import HeaderTamplateDonasi from "../component/header_tamplate";
import {
IconBell,
IconChevronLeft,
IconCurrencyDollar,
IconGift,
IconGiftCardFilled,
@@ -26,6 +32,7 @@ import { useRouter } from "next/navigation";
import { useAtom } from "jotai";
import { gs_donasi_hot_menu } from "../global_state";
import { RouterCrowd } from "@/app/lib/router_hipmi/router_crowd";
import { title } from "process";
export default function LayoutDonasi({
children,
@@ -59,7 +66,19 @@ export default function LayoutDonasi({
<>
<AppShell
header={
<HeaderTamplateDonasi title="Donasi" route={RouterCrowd.main} />
<Header height={50} sx={{ borderStyle: "none" }}>
<Group h={50} position="apart" px={"md"}>
<ActionIcon onClick={() => router.push(RouterCrowd.main)}>
<IconChevronLeft />
</ActionIcon>
<Title order={5}>Donasi</Title>
<ActionIcon radius={"md"} variant="transparent" onClick={() => router.push(RouterDonasi.notif_page + `${"123"}`)}>
<Indicator processing color="orange" >
<IconBell />
</Indicator>
</ActionIcon>
</Group>
</Header>
}
footer={
<Footer height={70} bg={"dark"}>

View File

@@ -0,0 +1,17 @@
"use client"
import { AppShell } from "@mantine/core"
import React from "react"
import HeaderTamplateDonasi from "../../component/header_tamplate"
export default function LayoutDonasi_NotifPage({children}: {children: React.ReactNode}){
return<>
<AppShell
header={<HeaderTamplateDonasi title="Pemberitahuan"/>}
>
{children}
</AppShell>
</>
}

View File

@@ -0,0 +1,8 @@
"use client"
export default function Donasi_NotifPage() {
return<>
ini halaman notif
</>
}

View File

@@ -13,7 +13,7 @@ export interface MODEL_DONASI {
publishTime: Date;
catatan: string;
progres: string;
terkumpul: string
terkumpul: string;
authorId: string;
donasiMaster_KategoriId: string;
donasiMaster_DurasiId: string;
@@ -72,8 +72,8 @@ export interface MODEL_DONASI_INVOICE {
active: boolean;
createdAt: Date;
updatedAt: Date;
Author: MODEL_AUTHOR
authorId: string
Author: MODEL_AUTHOR;
authorId: string;
donasiMaster_BankId: string;
donasiMaster_StatusInvoiceId: string;
Donasi: MODEL_DONASI;
@@ -97,3 +97,16 @@ export interface MODEL_DONASI_ALL_MASTER {
createdAt: Date;
updatedAt: Date;
}
export interface MODEL_DONASI_KABAR {
id: string;
title: string;
deskripsi: string;
active: boolean;
createdAt: Date;
updatedAt: Date;
donasiId: string;
imagesId: string;
Donasi: MODEL_DONASI;
ImagesKabar: MODEL_IMAGES;
}

View File

@@ -1,6 +1,7 @@
export interface MODEL_IMAGES {
id: string;
url: string;
label: string
active: boolean;
createdAt: Date;
updatedAt: Date;