Kabar Donasi
# feat - Create kabar - Delete kabar - List kabar ## No issue
This commit is contained in:
@@ -66,6 +66,7 @@ model Profile {
|
|||||||
model Images {
|
model Images {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
url String
|
url String
|
||||||
|
label String @default("null")
|
||||||
active Boolean @default(true)
|
active Boolean @default(true)
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @default(now()) @updatedAt
|
updatedAt DateTime @default(now()) @updatedAt
|
||||||
@@ -409,5 +410,3 @@ model Donasi_Kabar {
|
|||||||
ImagesKabar Images? @relation(fields: [imagesId], references: [id])
|
ImagesKabar Images? @relation(fields: [imagesId], references: [id])
|
||||||
imagesId String?
|
imagesId String?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
BIN
public/donasi/kabar/510ead2a-1976-452b-abc3-dcc1db83d9f3.jpeg
Normal file
BIN
public/donasi/kabar/510ead2a-1976-452b-abc3-dcc1db83d9f3.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
BIN
public/donasi/kabar/6fdb94e0-34b8-4731-a710-acaacbbec933.jpeg
Normal file
BIN
public/donasi/kabar/6fdb94e0-34b8-4731-a710-acaacbbec933.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
BIN
public/donasi/kabar/cb3a09a2-b357-47c0-be0a-d8a54e4b077f.jpeg
Normal file
BIN
public/donasi/kabar/cb3a09a2-b357-47c0-be0a-d8a54e4b077f.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
34
src/app/api/donasi/gambar_kabar/[id]/route.ts
Normal file
34
src/app/api/donasi/gambar_kabar/[id]/route.ts
Normal 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",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
14
src/app/dev/donasi/create/create_kabar/[id]/layout.tsx
Normal file
14
src/app/dev/donasi/create/create_kabar/[id]/layout.tsx
Normal 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>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
8
src/app/dev/donasi/create/create_kabar/[id]/page.tsx
Normal file
8
src/app/dev/donasi/create/create_kabar/[id]/page.tsx
Normal 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}/>
|
||||||
|
</>
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@ export default async function Page({ params }: { params: { id: string } }) {
|
|||||||
let invoiceId = params.id;
|
let invoiceId = params.id;
|
||||||
const dataDonasi = await Donasi_getOneInvoiceById(invoiceId);
|
const dataDonasi = await Donasi_getOneInvoiceById(invoiceId);
|
||||||
const countDonatur= await Donasi_getCountDonatur(dataDonasi?.donasiId as any)
|
const countDonatur= await Donasi_getCountDonatur(dataDonasi?.donasiId as any)
|
||||||
|
console.log(dataDonasi?.Donasi?.progres)
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -3,12 +3,16 @@ import React from "react";
|
|||||||
|
|
||||||
export default async function Layout({
|
export default async function Layout({
|
||||||
children,
|
children,
|
||||||
|
params,
|
||||||
}: {
|
}: {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
|
params: { id: string };
|
||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<LayoutDetailPublishDonasi>{children}</LayoutDetailPublishDonasi>
|
<LayoutDetailPublishDonasi donasiId={params.id}>
|
||||||
|
{children}
|
||||||
|
</LayoutDetailPublishDonasi>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
12
src/app/dev/donasi/donatur/[id]/page.tsx
Normal file
12
src/app/dev/donasi/donatur/[id]/page.tsx
Normal 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} />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
import { DonaturDonasi } from "@/app_modules/donasi";
|
|
||||||
|
|
||||||
export default async function Page() {
|
|
||||||
return<>
|
|
||||||
<DonaturDonasi/>
|
|
||||||
|
|
||||||
</>
|
|
||||||
}
|
|
||||||
@@ -3,12 +3,14 @@ import React from "react";
|
|||||||
|
|
||||||
export default async function Layout({
|
export default async function Layout({
|
||||||
children,
|
children,
|
||||||
|
params
|
||||||
}: {
|
}: {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
|
params: {id: string}
|
||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<LayoutUpdateKabarDonasi>{children}</LayoutUpdateKabarDonasi>
|
<LayoutUpdateKabarDonasi kabarId={params.id}>{children}</LayoutUpdateKabarDonasi>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
11
src/app/dev/donasi/edit/update_kabar/[id]/page.tsx
Normal file
11
src/app/dev/donasi/edit/update_kabar/[id]/page.tsx
Normal 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}/>
|
||||||
|
</>
|
||||||
|
}
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
import { UpdateKabarDonasi } from "@/app_modules/donasi";
|
|
||||||
|
|
||||||
export default async function Page() {
|
|
||||||
return<>
|
|
||||||
<UpdateKabarDonasi/>
|
|
||||||
</>
|
|
||||||
}
|
|
||||||
13
src/app/dev/donasi/kabar/[id]/page.tsx
Normal file
13
src/app/dev/donasi/kabar/[id]/page.tsx
Normal 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} />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
import { KabarDonasi } from "@/app_modules/donasi";
|
|
||||||
|
|
||||||
export default async function Page() {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<KabarDonasi />
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -3,8 +3,10 @@ import React from "react";
|
|||||||
|
|
||||||
export default async function Layput({
|
export default async function Layput({
|
||||||
children,
|
children,
|
||||||
|
params
|
||||||
}: {
|
}: {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
|
params: {id: string}
|
||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
13
src/app/dev/donasi/list_kabar/[id]/page.tsx
Normal file
13
src/app/dev/donasi/list_kabar/[id]/page.tsx
Normal 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} />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
import { ListKabarDonasi } from "@/app_modules/donasi";
|
|
||||||
|
|
||||||
export default async function Page() {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<ListKabarDonasi />
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
8
src/app/dev/donasi/notif_page/[id]/layout.tsx
Normal file
8
src/app/dev/donasi/notif_page/[id]/layout.tsx
Normal 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>
|
||||||
|
</>
|
||||||
|
}
|
||||||
9
src/app/dev/donasi/notif_page/[id]/page.tsx
Normal file
9
src/app/dev/donasi/notif_page/[id]/page.tsx
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import { Donasi_NotifPage } from "@/app_modules/donasi";
|
||||||
|
|
||||||
|
export default async function Page() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<Donasi_NotifPage />
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ export default async function Page({ params }: { params: { id: string } }) {
|
|||||||
let authorId = params.id;
|
let authorId = params.id;
|
||||||
const dataPenggalang = await Donasi_getAuthorById(authorId);
|
const dataPenggalang = await Donasi_getAuthorById(authorId);
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<PenggalangDanaDonasi dataPenggalang={dataPenggalang as any} />
|
<PenggalangDanaDonasi dataPenggalang={dataPenggalang as any} />
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ export const RouterDonasi = {
|
|||||||
api_gambar_cerita: "/api/donasi/gambar_cerita/",
|
api_gambar_cerita: "/api/donasi/gambar_cerita/",
|
||||||
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/",
|
||||||
|
|
||||||
|
|
||||||
//main
|
//main
|
||||||
main_beranda: "/dev/donasi/main/beranda",
|
main_beranda: "/dev/donasi/main/beranda",
|
||||||
@@ -11,11 +13,12 @@ export const RouterDonasi = {
|
|||||||
main_donasi_saya: "/dev/donasi/main/donasi_saya",
|
main_donasi_saya: "/dev/donasi/main/donasi_saya",
|
||||||
|
|
||||||
// create
|
// create
|
||||||
create: "/dev/donasi/create",
|
create_donasi: "/dev/donasi/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/",
|
||||||
|
|
||||||
// edit
|
// edit
|
||||||
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/",
|
||||||
|
|
||||||
@@ -32,12 +35,13 @@ export const RouterDonasi = {
|
|||||||
detail_donasi_saya: "/dev/donasi/detail/detail_donasi_saya/",
|
detail_donasi_saya: "/dev/donasi/detail/detail_donasi_saya/",
|
||||||
|
|
||||||
//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/",
|
||||||
|
|
||||||
// proses donasi
|
// proses donasi
|
||||||
masukan_donasi: "/dev/donasi/proses_donasi/masukan_donasi/",
|
masukan_donasi: "/dev/donasi/proses_donasi/masukan_donasi/",
|
||||||
|
|||||||
@@ -44,5 +44,6 @@ export async function AdminDonasi_getListStatusInvoiceProses(donasiId: string) {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
return dataStatus;
|
return dataStatus;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ export function ComponentDonasi_DetailDataMain({
|
|||||||
<Grid>
|
<Grid>
|
||||||
<Grid.Col
|
<Grid.Col
|
||||||
span={"auto"}
|
span={"auto"}
|
||||||
onClick={() => router.push(RouterDonasi.donatur)}
|
onClick={() => router.push(RouterDonasi.donatur + `${donasi.id}`)}
|
||||||
>
|
>
|
||||||
<Stack align="center" spacing={"xs"}>
|
<Stack align="center" spacing={"xs"}>
|
||||||
<Group>
|
<Group>
|
||||||
@@ -93,7 +93,7 @@ export function ComponentDonasi_DetailDataMain({
|
|||||||
<Divider orientation="vertical" />
|
<Divider orientation="vertical" />
|
||||||
<Grid.Col
|
<Grid.Col
|
||||||
span={"auto"}
|
span={"auto"}
|
||||||
onClick={() => router.push(RouterDonasi.kabar)}
|
onClick={() => router.push(RouterDonasi.kabar + `${donasi.id}`)}
|
||||||
>
|
>
|
||||||
<Stack spacing={"sm"} align="center">
|
<Stack spacing={"sm"} align="center">
|
||||||
<IconMessageChatbot color="skyblue" />
|
<IconMessageChatbot color="skyblue" />
|
||||||
|
|||||||
40
src/app_modules/donasi/component/detail_main/list_kabar.tsx
Normal file
40
src/app_modules/donasi/component/detail_main/list_kabar.tsx
Normal 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>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
141
src/app_modules/donasi/create/create_kabar/index.tsx
Normal file
141
src/app_modules/donasi/create/create_kabar/index.tsx
Normal 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);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
19
src/app_modules/donasi/create/create_kabar/layout.tsx
Normal file
19
src/app_modules/donasi/create/create_kabar/layout.tsx
Normal 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>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
|
import TampilanRupiahDonasi from "@/app_modules/donasi/component/tampilan_rupiah";
|
||||||
|
import { MODEL_DONASI_INVOICE } from "@/app_modules/donasi/model/interface";
|
||||||
import {
|
import {
|
||||||
Avatar,
|
Avatar,
|
||||||
Center,
|
Center,
|
||||||
@@ -11,10 +13,13 @@ import {
|
|||||||
Text,
|
Text,
|
||||||
Title,
|
Title,
|
||||||
} from "@mantine/core";
|
} from "@mantine/core";
|
||||||
|
import { IconMoodSmile, IconMoodSmileBeam } from "@tabler/icons-react";
|
||||||
import { size } from "lodash";
|
import { size } from "lodash";
|
||||||
import moment from "moment";
|
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 (
|
return (
|
||||||
<>
|
<>
|
||||||
<SimpleGrid
|
<SimpleGrid
|
||||||
@@ -26,26 +31,26 @@ export default function DonaturDonasi() {
|
|||||||
{ maxWidth: "36rem", cols: 1, spacing: "sm" },
|
{ maxWidth: "36rem", cols: 1, spacing: "sm" },
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
{Array(10)
|
{donatur
|
||||||
.fill(0)
|
|
||||||
.map((e, i) => (
|
.map((e, i) => (
|
||||||
<Paper key={i} bg={"gray.1"} p={"sm"}>
|
<Paper key={i} bg={"gray.1"} p={"sm"}>
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.Col span={3}>
|
<Grid.Col span={3}>
|
||||||
<Center h={"100%"}>
|
<Center h={"100%"}>
|
||||||
<Avatar variant="filled" radius={"xl"} size={"md"} />
|
{/* <Avatar variant="filled" radius={"xl"} size={"md"} /> */}
|
||||||
|
<IconMoodSmileBeam size={50}/>
|
||||||
</Center>
|
</Center>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
<Grid.Col span={9}>
|
<Grid.Col span={9}>
|
||||||
<Stack spacing={0}>
|
<Stack spacing={0}>
|
||||||
<Title order={5}>Orang Baik</Title>
|
<Title order={5}>{e.Author.username}</Title>
|
||||||
<Group spacing={"xs"}>
|
<Group spacing={"xs"}>
|
||||||
<Text>Berdonasi sebesar</Text>
|
<Text fz={"xs"}>Berdonasi sebesar</Text>
|
||||||
<Text truncate fw={"bold"}>
|
<Text truncate fw={"bold"}>
|
||||||
Rp. 50.000
|
<TampilanRupiahDonasi nominal={+e.nominal}/>
|
||||||
</Text>
|
</Text>
|
||||||
</Group>
|
</Group>
|
||||||
<Text fz={"xs"}>{moment(Date.now()).format("ll")}</Text>
|
<Text fz={"xs"}>{moment(e.createdAt).format("ll")}</Text>
|
||||||
</Stack>
|
</Stack>
|
||||||
</Grid.Col>
|
</Grid.Col>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
|
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 {
|
import {
|
||||||
ActionIcon,
|
ActionIcon,
|
||||||
Avatar,
|
Avatar,
|
||||||
|
Box,
|
||||||
Group,
|
Group,
|
||||||
Paper,
|
Paper,
|
||||||
SimpleGrid,
|
SimpleGrid,
|
||||||
@@ -15,9 +18,15 @@ import {
|
|||||||
import { IconCircleChevronRight } from "@tabler/icons-react";
|
import { IconCircleChevronRight } from "@tabler/icons-react";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { useRouter } from "next/navigation";
|
import { useRouter } from "next/navigation";
|
||||||
|
import { useState } from "react";
|
||||||
|
|
||||||
export default function KabarDonasi() {
|
export default function KabarDonasi({
|
||||||
const router = useRouter()
|
listKabar,
|
||||||
|
}: {
|
||||||
|
listKabar: MODEL_DONASI_KABAR[];
|
||||||
|
}) {
|
||||||
|
const router = useRouter();
|
||||||
|
const [kabar, setKabar] = useState(listKabar);
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<SimpleGrid
|
<SimpleGrid
|
||||||
@@ -29,33 +38,11 @@ export default function KabarDonasi() {
|
|||||||
{ maxWidth: "36rem", cols: 1, spacing: "sm" },
|
{ maxWidth: "36rem", cols: 1, spacing: "sm" },
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
{Array(4)
|
{kabar.map((e, i) => (
|
||||||
.fill(0)
|
<Box key={i}>
|
||||||
.map((e, i) => (
|
<ComponentDonasi_ListKabar kabar={e} />
|
||||||
<Paper key={i} bg={"gray.1"} p={"md"}>
|
</Box>
|
||||||
<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>
|
|
||||||
))}
|
|
||||||
</SimpleGrid>
|
</SimpleGrid>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -6,14 +6,24 @@ import HeaderTamplateDonasi 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";
|
||||||
|
|
||||||
export default function LayoutDetailPublishDonasi({
|
export default function LayoutDetailPublishDonasi({
|
||||||
children,
|
children,
|
||||||
|
donasiId,
|
||||||
}: {
|
}: {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
|
donasiId: string;
|
||||||
}) {
|
}) {
|
||||||
return (
|
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}
|
{children}
|
||||||
</AppShell>
|
</AppShell>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { RouterDonasi } from "@/app/lib/router_hipmi/router_donasi";
|
|||||||
import {
|
import {
|
||||||
ActionIcon,
|
ActionIcon,
|
||||||
Avatar,
|
Avatar,
|
||||||
|
Box,
|
||||||
Button,
|
Button,
|
||||||
Group,
|
Group,
|
||||||
Paper,
|
Paper,
|
||||||
@@ -20,13 +21,27 @@ import {
|
|||||||
} from "@tabler/icons-react";
|
} from "@tabler/icons-react";
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
import { useRouter } from "next/navigation";
|
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 router = useRouter();
|
||||||
|
const [kabar, setKabar] = useState(listKabar);
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Stack>
|
<Stack>
|
||||||
<Button leftIcon={<IconCirclePlus />} radius={"xl"}>
|
<Button
|
||||||
|
leftIcon={<IconCirclePlus />}
|
||||||
|
radius={"xl"}
|
||||||
|
onClick={() => router.push(RouterDonasi.create_kabar + `${donasiId}`)}
|
||||||
|
>
|
||||||
Tambah Kabar
|
Tambah Kabar
|
||||||
</Button>
|
</Button>
|
||||||
<SimpleGrid
|
<SimpleGrid
|
||||||
@@ -38,40 +53,11 @@ export default function ListKabarDonasi() {
|
|||||||
{ maxWidth: "36rem", cols: 1, spacing: "sm" },
|
{ maxWidth: "36rem", cols: 1, spacing: "sm" },
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
{Array(4)
|
{kabar.map((e, i) => (
|
||||||
.fill(0)
|
<Box key={i}>
|
||||||
.map((e, i) => (
|
<ComponentDonasi_ListKabar kabar={e}/>
|
||||||
<Paper key={i} bg={"gray.1"} p={"md"}>
|
</Box>
|
||||||
<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>
|
|
||||||
))}
|
|
||||||
</SimpleGrid>
|
</SimpleGrid>
|
||||||
</Stack>
|
</Stack>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -13,37 +13,36 @@ 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 UpdateKabarDonasi() {
|
export default function UpdateKabarDonasi({
|
||||||
|
dataKabar,
|
||||||
|
}: {
|
||||||
|
dataKabar: MODEL_DONASI_KABAR;
|
||||||
|
}) {
|
||||||
|
const [kabar, setKabar] = useState(dataKabar);
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Stack>
|
<Stack>
|
||||||
<Group>
|
{/* <Group>
|
||||||
<Avatar variant="filled" radius={"xl"} />
|
<Avatar variant="filled" radius={"xl"} />
|
||||||
<Stack spacing={0}>
|
<Stack spacing={0}>
|
||||||
<Text>Username</Text>
|
<Text>Username</Text>
|
||||||
<Text fz={"xs"}>{moment(Date.now()).format("ll")}</Text>
|
|
||||||
</Stack>
|
</Stack>
|
||||||
</Group>
|
</Group> */}
|
||||||
<Stack>
|
<Stack>
|
||||||
<Title order={5}>Judul Berita</Title>
|
<Text fz={"xs"}>{moment(Date.now()).format("ll")}</Text>
|
||||||
|
<Title order={5}>{kabar.title}</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>
|
|
||||||
|
|
||||||
<AspectRatio ratio={16 / 9}>
|
<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>
|
</AspectRatio>
|
||||||
<Text>
|
<Text>{kabar.deskripsi}</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>
|
|
||||||
</Stack>
|
</Stack>
|
||||||
</Stack>
|
</Stack>
|
||||||
</>
|
</>
|
||||||
|
|||||||
@@ -13,13 +13,20 @@ 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 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({
|
export default function LayoutUpdateKabarDonasi({
|
||||||
children,
|
children,
|
||||||
|
kabarId
|
||||||
}: {
|
}: {
|
||||||
children: React.ReactNode;
|
children: React.ReactNode;
|
||||||
|
kabarId: string
|
||||||
}) {
|
}) {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<AppShell
|
<AppShell
|
||||||
@@ -27,10 +34,10 @@ export default function LayoutUpdateKabarDonasi({
|
|||||||
footer={
|
footer={
|
||||||
<Footer height={70}>
|
<Footer height={70}>
|
||||||
<Group align="center" h={"100%"} position="center" spacing={"xl"}>
|
<Group align="center" h={"100%"} position="center" spacing={"xl"}>
|
||||||
<Button radius={"xl"} variant="outline" color="green">
|
{/* <Button radius={"xl"} variant="outline" color="green">
|
||||||
Edit
|
Edit
|
||||||
</Button>
|
</Button> */}
|
||||||
<Button radius={"xl"} variant="outline" color="red">
|
<Button radius={"xl"} variant="outline" color="red" onClick={() => onDelete(router,kabarId )}>
|
||||||
Hapus
|
Hapus
|
||||||
</Button>
|
</Button>
|
||||||
</Group>
|
</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)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
50
src/app_modules/donasi/fun/create/fun_create_kabar.ts
Normal file
50
src/app_modules/donasi/fun/create/fun_create_kabar.ts
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
35
src/app_modules/donasi/fun/delete/fun_delete.kabar.ts
Normal file
35
src/app_modules/donasi/fun/delete/fun_delete.kabar.ts
Normal 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",
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -23,6 +23,7 @@ export default async function Donasi_getByStatus(
|
|||||||
title: true,
|
title: true,
|
||||||
imagesId: true,
|
imagesId: true,
|
||||||
target: true,
|
target: true,
|
||||||
|
progres: true,
|
||||||
publishTime: true,
|
publishTime: true,
|
||||||
DonasiMaster_Durasi: true,
|
DonasiMaster_Durasi: true,
|
||||||
terkumpul: true,
|
terkumpul: true,
|
||||||
|
|||||||
39
src/app_modules/donasi/fun/get/get_list_donatur.ts
Normal file
39
src/app_modules/donasi/fun/get/get_list_donatur.ts
Normal 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;
|
||||||
|
}
|
||||||
19
src/app_modules/donasi/fun/get/get_list_kabar.ts
Normal file
19
src/app_modules/donasi/fun/get/get_list_kabar.ts
Normal 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;
|
||||||
|
}
|
||||||
12
src/app_modules/donasi/fun/get/get_one_kabar.ts
Normal file
12
src/app_modules/donasi/fun/get/get_one_kabar.ts
Normal 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;
|
||||||
|
}
|
||||||
@@ -46,6 +46,10 @@ import Donasi_InvoiceProses from "./proses_donasi/invoice";
|
|||||||
import LayoutDonasi_InvoiceProses from "./proses_donasi/invoice/layout";
|
import LayoutDonasi_InvoiceProses from "./proses_donasi/invoice/layout";
|
||||||
import Donasi_ProsesTransaksi from "./proses_donasi/proses_transaksi";
|
import Donasi_ProsesTransaksi from "./proses_donasi/proses_transaksi";
|
||||||
import LayoutDonasi_ProsesTransaksi from "./proses_donasi/proses_transaksi/layout";
|
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 {
|
export {
|
||||||
MainDonasi,
|
MainDonasi,
|
||||||
@@ -96,4 +100,8 @@ export {
|
|||||||
LayoutDonasi_InvoiceProses,
|
LayoutDonasi_InvoiceProses,
|
||||||
Donasi_ProsesTransaksi,
|
Donasi_ProsesTransaksi,
|
||||||
LayoutDonasi_ProsesTransaksi,
|
LayoutDonasi_ProsesTransaksi,
|
||||||
|
Donasi_CreateKabar,
|
||||||
|
LayoutDonasi_CreateKabar,
|
||||||
|
Donasi_NotifPage,
|
||||||
|
LayoutDonasi_NotifPage,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ export default function GalangDanaDonasi({
|
|||||||
bg={"orange"}
|
bg={"orange"}
|
||||||
color="orange"
|
color="orange"
|
||||||
leftIcon={<IconCirclePlus />}
|
leftIcon={<IconCirclePlus />}
|
||||||
onClick={() => router.push(RouterDonasi.create)}
|
onClick={() => router.push(RouterDonasi.create_donasi)}
|
||||||
>
|
>
|
||||||
Galang Dana
|
Galang Dana
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -7,12 +7,18 @@ import {
|
|||||||
Flex,
|
Flex,
|
||||||
Footer,
|
Footer,
|
||||||
Grid,
|
Grid,
|
||||||
|
Group,
|
||||||
|
Header,
|
||||||
|
Indicator,
|
||||||
Text,
|
Text,
|
||||||
|
Title,
|
||||||
} from "@mantine/core";
|
} from "@mantine/core";
|
||||||
import React, { useState } from "react";
|
import React, { useState } from "react";
|
||||||
import HeaderTamplateDonasi from "../component/header_tamplate";
|
import HeaderTamplateDonasi from "../component/header_tamplate";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
IconBell,
|
||||||
|
IconChevronLeft,
|
||||||
IconCurrencyDollar,
|
IconCurrencyDollar,
|
||||||
IconGift,
|
IconGift,
|
||||||
IconGiftCardFilled,
|
IconGiftCardFilled,
|
||||||
@@ -26,6 +32,7 @@ import { useRouter } from "next/navigation";
|
|||||||
import { useAtom } from "jotai";
|
import { useAtom } from "jotai";
|
||||||
import { gs_donasi_hot_menu } from "../global_state";
|
import { gs_donasi_hot_menu } from "../global_state";
|
||||||
import { RouterCrowd } from "@/app/lib/router_hipmi/router_crowd";
|
import { RouterCrowd } from "@/app/lib/router_hipmi/router_crowd";
|
||||||
|
import { title } from "process";
|
||||||
|
|
||||||
export default function LayoutDonasi({
|
export default function LayoutDonasi({
|
||||||
children,
|
children,
|
||||||
@@ -59,7 +66,19 @@ export default function LayoutDonasi({
|
|||||||
<>
|
<>
|
||||||
<AppShell
|
<AppShell
|
||||||
header={
|
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={
|
||||||
<Footer height={70} bg={"dark"}>
|
<Footer height={70} bg={"dark"}>
|
||||||
|
|||||||
17
src/app_modules/donasi/main/notif/layout.tsx
Normal file
17
src/app_modules/donasi/main/notif/layout.tsx
Normal 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>
|
||||||
|
|
||||||
|
</>
|
||||||
|
}
|
||||||
8
src/app_modules/donasi/main/notif/notif_page.tsx
Normal file
8
src/app_modules/donasi/main/notif/notif_page.tsx
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
"use client"
|
||||||
|
|
||||||
|
export default function Donasi_NotifPage() {
|
||||||
|
return<>
|
||||||
|
ini halaman notif
|
||||||
|
|
||||||
|
</>
|
||||||
|
}
|
||||||
@@ -13,7 +13,7 @@ export interface MODEL_DONASI {
|
|||||||
publishTime: Date;
|
publishTime: Date;
|
||||||
catatan: string;
|
catatan: string;
|
||||||
progres: string;
|
progres: string;
|
||||||
terkumpul: string
|
terkumpul: string;
|
||||||
authorId: string;
|
authorId: string;
|
||||||
donasiMaster_KategoriId: string;
|
donasiMaster_KategoriId: string;
|
||||||
donasiMaster_DurasiId: string;
|
donasiMaster_DurasiId: string;
|
||||||
@@ -72,8 +72,8 @@ export interface MODEL_DONASI_INVOICE {
|
|||||||
active: boolean;
|
active: boolean;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
updatedAt: Date;
|
updatedAt: Date;
|
||||||
Author: MODEL_AUTHOR
|
Author: MODEL_AUTHOR;
|
||||||
authorId: string
|
authorId: string;
|
||||||
donasiMaster_BankId: string;
|
donasiMaster_BankId: string;
|
||||||
donasiMaster_StatusInvoiceId: string;
|
donasiMaster_StatusInvoiceId: string;
|
||||||
Donasi: MODEL_DONASI;
|
Donasi: MODEL_DONASI;
|
||||||
@@ -97,3 +97,16 @@ export interface MODEL_DONASI_ALL_MASTER {
|
|||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
updatedAt: 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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
export interface MODEL_IMAGES {
|
export interface MODEL_IMAGES {
|
||||||
id: string;
|
id: string;
|
||||||
url: string;
|
url: string;
|
||||||
|
label: string
|
||||||
active: boolean;
|
active: boolean;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
updatedAt: Date;
|
updatedAt: Date;
|
||||||
|
|||||||
Reference in New Issue
Block a user