-
- Potensi Desa
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ }
+ />
+
);
}
+function ListPotensi() {
+ const potensiState = useProxy(potensiDesaState)
+ useShallowEffect(() => {
+ potensiState.findMany.load()
+ }, [])
+
+ const router = useRouter()
+
+
+ if (!potensiState.findMany.data) {
+ return (
+
+
+
+ )
+ }
+
+ return (
+
+
+
+
+
+
+
+
+ Judul
+ Kategori
+ Image
+ Detail
+
+
+
+ {potensiState.findMany.data?.map((item) => (
+
+
+
+ {item.name}
+
+ {item.kategori}
+
+
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+ )
+}
+
export default Potensi;
diff --git a/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/create/page.tsx b/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/create/page.tsx
new file mode 100644
index 00000000..88e6e01a
--- /dev/null
+++ b/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/create/page.tsx
@@ -0,0 +1,73 @@
+'use client'
+import colors from '@/con/colors';
+import { Box, Button, Paper, Stack, Text, TextInput, Title } from '@mantine/core';
+import { IconArrowBack, IconImageInPicture } from '@tabler/icons-react';
+import { useRouter } from 'next/navigation';
+import React from 'react';
+
+function CreateDataLingkunganDesa() {
+ const router = useRouter()
+ return (
+
+
+
+
+
+
+
+ Create Data Lingkungan Desa
+ Judul}
+ placeholder="masukkan judul"
+ />
+
+ Deskripsi}
+ placeholder="masukkan deskripsi"
+ />
+
+ Gambar
+
+
+ {/* Upload Gambar}
+ value={file}
+ onChange={async (e) => {
+ if (!e) return;
+ setFile(e);
+ const base64 = await e.arrayBuffer().then((buf) =>
+ 'data:image/png;base64,' + Buffer.from(buf).toString('base64')
+ );
+ setPreviewImage(base64);
+ }}
+ /> */}
+
+ {/* {previewImage ? (
+
+ ) : (
+
+
+
+ )} */}
+
+
+ Konten
+ {/* {
+ potensiState.create.form.content = htmlContent;
+ }}
+ /> */}
+
+
+
+
+
+ );
+}
+
+export default CreateDataLingkunganDesa;
diff --git a/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/page.tsx b/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/page.tsx
index 1732a9f4..d9ba4dfc 100644
--- a/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/page.tsx
+++ b/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/page.tsx
@@ -1,11 +1,66 @@
+import { Box, Button, Image, Paper, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
import React from 'react';
+import HeaderSearch from '../../_com/header';
+import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react';
+import colors from '@/con/colors';
+import JudulList from '../../_com/judulList';
-function Page() {
+function DataLingkunganDesa() {
return (
-
- data-lingkungan-desa
-
+
+ }
+ />
+
+
);
}
-export default Page;
+function ListDataLingkunganDesa() {
+ return (
+
+
+
+
+
+
+
+
+ Judul
+ Gambar
+ Deskripsi
+ Detail
+
+
+
+
+
+
+ Judul
+
+
+
+
+
+ Deskripsi
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default DataLingkunganDesa;
diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/create/page.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/create/page.tsx
new file mode 100644
index 00000000..df1978c0
--- /dev/null
+++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/create/page.tsx
@@ -0,0 +1,61 @@
+'use client'
+import React from 'react';
+import colors from '@/con/colors';
+import { Box, Button, Paper, Stack, Text, TextInput, Title } from '@mantine/core';
+import { IconArrowBack, IconImageInPicture } from '@tabler/icons-react';
+import { useRouter } from 'next/navigation';
+
+function Page() {
+ const router = useRouter()
+ return (
+
+
+
+
+
+
+
+ Create Edukasi Lingkungan
+ Judul}
+ placeholder="masukkan judul"
+ />
+ Deskripsi}
+ placeholder="masukkan deskripsi"
+ />
+ {/* Upload Gambar}
+ value={file}
+ onChange={async (e) => {
+ if (!e) return;
+ setFile(e);
+ const base64 = await e.arrayBuffer().then((buf) =>
+ 'data:image/png;base64,' + Buffer.from(buf).toString('base64')
+ );
+ setPreviewImage(base64);
+ }}
+ /> */}
+ {/* {previewImage ? (
+
+ ) : (
+
+
+
+ )} */}
+
+ Gambar
+
+
+
+
+
+
+ );
+}
+
+export default Page;
diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/page.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/page.tsx
index 3252f581..eaf32a93 100644
--- a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/page.tsx
+++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/page.tsx
@@ -1,11 +1,66 @@
+import { Box, Button, Image, Paper, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
import React from 'react';
+import HeaderSearch from '../../_com/header';
+import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react';
+import colors from '@/con/colors';
+import JudulList from '../../_com/judulList';
-function Page() {
+function Page() {
return (
-
- edukasi-lingkungan
-
+
+ }
+ />
+
+
);
}
+function ListEdukasiLingkungan() {
+ return (
+
+
+
+
+
+
+
+
+ Judul
+ Gambar
+ Deskripsi
+ Detail
+
+
+
+
+
+
+ Judul
+
+
+
+
+
+ Deskripsi
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
export default Page;
diff --git a/src/app/admin/(dashboard)/lingkungan/gotong-royong/create/page.tsx b/src/app/admin/(dashboard)/lingkungan/gotong-royong/create/page.tsx
new file mode 100644
index 00000000..07cfb090
--- /dev/null
+++ b/src/app/admin/(dashboard)/lingkungan/gotong-royong/create/page.tsx
@@ -0,0 +1,65 @@
+'use client'
+import colors from '@/con/colors';
+import { Box, Button, Paper, Stack, Text, TextInput, Title } from '@mantine/core';
+import { IconArrowBack, IconImageInPicture } from '@tabler/icons-react';
+import { useRouter } from 'next/navigation';
+import React from 'react';
+
+function Page() {
+ const router = useRouter()
+ return (
+
+
+
+
+
+
+
+ Create Gotong Royong
+ Judul}
+ placeholder="masukkan judul"
+ />
+ Kategori}
+ placeholder="masukkan kategori"
+ />
+ Deskripsi}
+ placeholder="masukkan deskripsi"
+ />
+ {/* Upload Gambar}
+ value={file}
+ onChange={async (e) => {
+ if (!e) return;
+ setFile(e);
+ const base64 = await e.arrayBuffer().then((buf) =>
+ 'data:image/png;base64,' + Buffer.from(buf).toString('base64')
+ );
+ setPreviewImage(base64);
+ }}
+ /> */}
+ {/* {previewImage ? (
+
+ ) : (
+
+
+
+ )} */}
+
+ Gambar
+
+
+
+
+
+
+ );
+}
+
+export default Page;
diff --git a/src/app/admin/(dashboard)/lingkungan/gotong-royong/page.tsx b/src/app/admin/(dashboard)/lingkungan/gotong-royong/page.tsx
index 95411df9..0f0e90aa 100644
--- a/src/app/admin/(dashboard)/lingkungan/gotong-royong/page.tsx
+++ b/src/app/admin/(dashboard)/lingkungan/gotong-royong/page.tsx
@@ -1,11 +1,68 @@
-import React from 'react';
+import { Box, Button, Image, Paper, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
+import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react';
+import HeaderSearch from '../../_com/header';
+import colors from '@/con/colors';
+import JudulList from '../../_com/judulList';
-function Page() {
+function GotongRoyong() {
return (
-
- gotong-royong
-
+
+ }
+ />
+
+
);
}
-export default Page;
+function ListGotongRoyong() {
+ return (
+
+
+
+
+
+
+
+
+ Judul
+ Kategori
+ Image
+ Deskripsi
+ Detail
+
+
+
+
+
+
+ Judul
+
+
+ Kategori
+
+
+
+ Deskripsi
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default GotongRoyong;
diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/create/page.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/create/page.tsx
new file mode 100644
index 00000000..68bd0e1e
--- /dev/null
+++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/create/page.tsx
@@ -0,0 +1,62 @@
+'use client'
+import React from 'react';
+import colors from '@/con/colors';
+import { Box, Button, Paper, Stack, Text, TextInput, Title } from '@mantine/core';
+import { IconArrowBack, IconImageInPicture } from '@tabler/icons-react';
+import { useRouter } from 'next/navigation';
+
+function Page() {
+ const router = useRouter()
+ return (
+
+
+
+
+
+
+
+ Create Konservasi Adat Bali
+ Judul}
+ placeholder="masukkan judul"
+ />
+ Deskripsi}
+ placeholder="masukkan deskripsi"
+ />
+ {/* Upload Gambar}
+ value={file}
+ onChange={async (e) => {
+ if (!e) return;
+ setFile(e);
+ const base64 = await e.arrayBuffer().then((buf) =>
+ 'data:image/png;base64,' + Buffer.from(buf).toString('base64')
+ );
+ setPreviewImage(base64);
+ }}
+ />
+ */}
+ {/* {previewImage ? (
+
+ ) : (
+
+
+
+ )} */}
+
+ Gambar
+
+
+
+
+
+
+ );
+}
+
+export default Page;
diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/page.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/page.tsx
index c1f5bf13..6361c664 100644
--- a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/page.tsx
+++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/page.tsx
@@ -1,11 +1,66 @@
+import { Box, Button, Image, Paper, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
import React from 'react';
+import HeaderSearch from '../../_com/header';
+import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react';
+import colors from '@/con/colors';
+import JudulList from '../../_com/judulList';
-function Page() {
+function KonservasiAdatBali() {
return (
-
- konservasi-adat-bali
-
+
+ }
+ />
+
+
);
}
-export default Page;
+function ListKonservasiAdatBali() {
+ return (
+
+
+
+
+
+
+
+
+ Judul
+ Gambar
+ Deskripsi
+ Detail
+
+
+
+
+
+
+ Judul
+
+
+
+
+
+ Deskripsi
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default KonservasiAdatBali;
diff --git a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/create/page.tsx b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/create/page.tsx
new file mode 100644
index 00000000..c8697ae0
--- /dev/null
+++ b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/create/page.tsx
@@ -0,0 +1,71 @@
+'use client'
+import colors from "@/con/colors";
+import { Box, Button, Paper, Stack, Title, TextInput, Text } from "@mantine/core";
+import { IconArrowBack } from "@tabler/icons-react";
+import { useRouter } from "next/navigation";
+
+
+export default function CreatePengelolaanSampahBankSampah() {
+ const router = useRouter()
+ return (
+
+
+
+
+
+
+
+ Create Mekanisme Bank Sampah
+
+ Judul}
+ placeholder="masukkan judul"
+ />
+
+ Deskripsi}
+ placeholder="masukkan deskripsi"
+ />
+
+ {/* Upload Gambar}
+ value={file}
+ onChange={async (e) => {
+ if (!e) return;
+ setFile(e);
+ const base64 = await e.arrayBuffer().then((buf) =>
+ 'data:image/png;base64,' + Buffer.from(buf).toString('base64')
+ );
+ setPreviewImage(base64);
+ }}
+ /> */}
+
+ {/* {previewImage ? (
+
+ ) : (
+
+
+
+ )} */}
+
+
+ Konten
+ {/* {
+ potensiState.create.form.content = htmlContent;
+ }}
+ /> */}
+
+
+
+
+
+
+ )
+}
+
diff --git a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/page.tsx b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/page.tsx
index 05e93042..85239543 100644
--- a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/page.tsx
+++ b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/page.tsx
@@ -1,11 +1,33 @@
-import React from 'react';
+import { Box, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core';
+import ListPage from './ui/list_page/listPage';
+import colors from '@/con/colors';
-function Page() {
+function PengelolaanSampahBankSampah() {
return (
-
- pengelolaan-sampah-bank-sampah
-
- );
+
+
+ Pengelolaan Sampah Bank Sampah
+
+
+
+ List Pengelolaan Sampah Bank Sampah
+
+
+ Maps
+
+
+
+
+
+
+
+
+ Maps
+
+
+
+
+ )
}
-export default Page;
+export default PengelolaanSampahBankSampah;
diff --git a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/ui/list_page/listPage.tsx b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/ui/list_page/listPage.tsx
new file mode 100644
index 00000000..c6bef31a
--- /dev/null
+++ b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/ui/list_page/listPage.tsx
@@ -0,0 +1,66 @@
+import { Box, Button, Image, Paper, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
+import React from 'react';
+import HeaderSearch from '@/app/admin/(dashboard)/_com/header';
+import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react';
+import colors from '@/con/colors';
+import JudulList from '@/app/admin/(dashboard)/_com/judulList';
+
+function ListPage() {
+ return (
+
+ }
+ />
+
+
+ );
+}
+
+function ListPengelolaanSampahBankSampah() {
+ return (
+
+
+
+
+
+
+
+
+ Judul
+ Gambar
+ Deskripsi
+ Detail
+
+
+
+
+
+
+ Judul
+
+
+
+
+
+ Deskripsi
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default ListPage;
diff --git a/src/app/admin/(dashboard)/lingkungan/program-penghijauan/create/page.tsx b/src/app/admin/(dashboard)/lingkungan/program-penghijauan/create/page.tsx
new file mode 100644
index 00000000..4c1e91c2
--- /dev/null
+++ b/src/app/admin/(dashboard)/lingkungan/program-penghijauan/create/page.tsx
@@ -0,0 +1,73 @@
+'use client'
+import colors from '@/con/colors';
+import { Box, Button, Paper, Stack, Text, TextInput, Title } from '@mantine/core';
+import { IconArrowBack, IconImageInPicture } from '@tabler/icons-react';
+import { useRouter } from 'next/navigation';
+
+function Page() {
+ const router = useRouter()
+ return (
+
+
+
+
+
+
+
+ Create Program Penghijauan
+
+ Judul}
+ placeholder="masukkan judul"
+ />
+
+ Deskripsi}
+ placeholder="masukkan deskripsi"
+ />
+
+ Gambar
+
+ {/* Upload Gambar}
+ value={file}
+ onChange={async (e) => {
+ if (!e) return;
+ setFile(e);
+ const base64 = await e.arrayBuffer().then((buf) =>
+ 'data:image/png;base64,' + Buffer.from(buf).toString('base64')
+ );
+ setPreviewImage(base64);
+ }}
+ /> */}
+
+ {/* {previewImage ? (
+
+ ) : (
+
+
+
+ )} */}
+
+
+ Konten
+ {/* {
+ potensiState.create.form.content = htmlContent;
+ }}
+ /> */}
+
+
+
+
+
+
+ );
+}
+
+export default Page;
diff --git a/src/app/admin/(dashboard)/lingkungan/program-penghijauan/page.tsx b/src/app/admin/(dashboard)/lingkungan/program-penghijauan/page.tsx
index eb7a466b..e818879d 100644
--- a/src/app/admin/(dashboard)/lingkungan/program-penghijauan/page.tsx
+++ b/src/app/admin/(dashboard)/lingkungan/program-penghijauan/page.tsx
@@ -1,11 +1,68 @@
-import React from 'react';
+import { Box, Button, Image, Paper, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
+import HeaderSearch from '../../_com/header';
+import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react';
+import colors from '@/con/colors';
+import JudulList from '../../_com/judulList';
-function Page() {
+function ProgramPenghijauan() {
return (
-
- program-penghijauan
-
+
+ }
+ />
+
+
);
}
-export default Page;
+function ListManfaatPenghijauan() {
+ return (
+
+
+
+
+
+
+
+
+ Judul
+ Gambar
+ Jumlah
+ Deskripsi
+ Detail
+
+
+
+
+
+
+ Judul
+
+
+
+ Jumlah
+
+
+
+
+ Deskripsi
+
+
+
+
+
+
+
+
+
+
+ )
+}
+
+export default ProgramPenghijauan;
diff --git a/src/app/admin/layout.tsx b/src/app/admin/layout.tsx
index 1d535de2..937d2a1d 100644
--- a/src/app/admin/layout.tsx
+++ b/src/app/admin/layout.tsx
@@ -42,7 +42,7 @@ export default function Layout({ children }: { children: React.ReactNode }) {
}}
padding={'md'}
>
-
+
{!desktopOpened && (
diff --git a/src/app/api/[[...slugs]]/_lib/desa/berita/create.ts b/src/app/api/[[...slugs]]/_lib/desa/berita/create.ts
index 632634a7..e64f67ca 100644
--- a/src/app/api/[[...slugs]]/_lib/desa/berita/create.ts
+++ b/src/app/api/[[...slugs]]/_lib/desa/berita/create.ts
@@ -13,9 +13,6 @@ type FormCreate = Prisma.BeritaGetPayload<{
}>;
async function beritaCreate(context: Context) {
const body = context.body as FormCreate;
- console.log(body)
-
-// console.log(body)
await prisma.berita.create({
data: {
diff --git a/src/app/api/[[...slugs]]/_lib/desa/berita/find-by-id.ts b/src/app/api/[[...slugs]]/_lib/desa/berita/find-by-id.ts
index 92575a9e..54e6deac 100644
--- a/src/app/api/[[...slugs]]/_lib/desa/berita/find-by-id.ts
+++ b/src/app/api/[[...slugs]]/_lib/desa/berita/find-by-id.ts
@@ -40,26 +40,20 @@ export default async function handler(
}
// Ensure we're returning a proper Response object
- return new Response(JSON.stringify({
+ return Response.json({
success: true,
message: "Success fetch berita by ID",
data,
- }), {
+ }, {
status: 200,
- headers: {
- 'Content-Type': 'application/json',
- },
});
} catch (e) {
console.error("Find by ID error:", e);
- return new Response(JSON.stringify({
+ return Response.json({
success: false,
message: "Gagal mengambil berita: " + (e instanceof Error ? e.message : 'Unknown error'),
- }), {
+ }, {
status: 500,
- headers: {
- 'Content-Type': 'application/json',
- },
});
}
}
\ No newline at end of file
diff --git a/src/app/api/[[...slugs]]/_lib/desa/berita/updt.ts b/src/app/api/[[...slugs]]/_lib/desa/berita/updt.ts
index 8c62677e..d9c03582 100644
--- a/src/app/api/[[...slugs]]/_lib/desa/berita/updt.ts
+++ b/src/app/api/[[...slugs]]/_lib/desa/berita/updt.ts
@@ -15,76 +15,6 @@ type FormUpdate = Prisma.BeritaGetPayload<{
};
}>;
-// async function beritaUpdate(context: Context) {
-// const body = (await context.body) as FormUpdate;
-
-// const {
-// id,
-// judul,
-// deskripsi,
-// content,
-// kategoriBeritaId,
-// imageId,
-// } = body;
-
-// if (!id) {
-// return {
-// status: 400,
-// body: "ID tidak boleh kosong",
-// };
-// }
-
-// const existing = await prisma.berita.findUnique({
-// where: { id },
-// include: {
-// image: true,
-// },
-// });
-
-// if (!existing) {
-// return {
-// status: 404,
-// body: "Berita tidak ditemukan",
-// };
-// }
-
-// // Cek jika imageId diubah
-// if (existing.imageId && existing.imageId !== imageId) {
-// const oldImage = existing.image;
-// if (oldImage) {
-// try {
-// const filePath = path.join(oldImage.path, oldImage.name);
-// await fs.unlink(filePath); // hapus file dari filesystem
-// await prisma.fileStorage.delete({
-// where: { id: oldImage.id }, // hapus record dari DB
-// });
-// } catch (err) {
-// console.error("Gagal hapus gambar lama:", err);
-// }
-// }
-// }
-
-// const updated = await prisma.berita.update({
-// where: { id },
-// data: {
-// judul,
-// deskripsi,
-// content,
-// kategoriBeritaId,
-// imageId,
-// },
-// });
-
-// return {
-// success: true,
-// message: "Berita berhasil diupdate (gambar lama juga dihapus jika ada)",
-// data: updated,
-// };
-// }
-
-// export default beritaUpdate;
-
-
async function beritaUpdate(context: Context) {
try {
const id = context.params?.id as string; // ambil dari URL
@@ -155,7 +85,7 @@ async function beritaUpdate(context: Context) {
{ status: 200, headers: { 'Content-Type': 'application/json' } }
);
} catch (error) {
- console.error("Error updating berita:", error);
+ console.error("Error updating berita:", error);
return new Response(
JSON.stringify({
success: false,
diff --git a/src/app/api/[[...slugs]]/_lib/desa/index.ts b/src/app/api/[[...slugs]]/_lib/desa/index.ts
index 18a05d7d..fc8b25db 100644
--- a/src/app/api/[[...slugs]]/_lib/desa/index.ts
+++ b/src/app/api/[[...slugs]]/_lib/desa/index.ts
@@ -2,11 +2,12 @@ import Elysia from "elysia";
import Berita from "./berita";
import Pengumuman from "./pengumuman";
import ProfileDesa from "./profile/profile_desa";
-
+import PotensiDesa from "./potensi";
const Desa = new Elysia({ prefix: "/api/desa", tags: ["Desa"] })
.use(Berita)
.use(Pengumuman)
.use(ProfileDesa)
+ .use(PotensiDesa)
export default Desa;
diff --git a/src/app/api/[[...slugs]]/_lib/desa/potensi/create.ts b/src/app/api/[[...slugs]]/_lib/desa/potensi/create.ts
new file mode 100644
index 00000000..54754aa4
--- /dev/null
+++ b/src/app/api/[[...slugs]]/_lib/desa/potensi/create.ts
@@ -0,0 +1,33 @@
+import prisma from "@/lib/prisma";
+import { Prisma } from "@prisma/client";
+import { Context } from "elysia";
+
+type FormCreate = Prisma.PotensiDesaGetPayload<{
+ select: {
+ name: true;
+ deskripsi: true;
+ kategori: true;
+ imageId: true;
+ content: true;
+ }
+}>
+export default async function potensiDesaCreate(context: Context) {
+ const body = context.body as FormCreate;
+
+ await prisma.potensiDesa.create({
+ data: {
+ name: body.name,
+ deskripsi: body.deskripsi,
+ kategori: body.kategori,
+ imageId: body.imageId,
+ content: body.content,
+ },
+ });
+ return {
+ success: true,
+ message: "Success create potensi desa",
+ data: {
+ ...body,
+ },
+ };
+}
\ No newline at end of file
diff --git a/src/app/api/[[...slugs]]/_lib/desa/potensi/del.ts b/src/app/api/[[...slugs]]/_lib/desa/potensi/del.ts
new file mode 100644
index 00000000..8f8eb916
--- /dev/null
+++ b/src/app/api/[[...slugs]]/_lib/desa/potensi/del.ts
@@ -0,0 +1,54 @@
+import prisma from "@/lib/prisma";
+import path from "path";
+import { Context } from "vm";
+import fs from "fs/promises";
+
+const potensiDesaDelete = async (context: Context) => {
+ const id = context.params?.id as string;
+
+ if (!id) {
+ return {
+ status: 400,
+ body: "ID tidak diberikan",
+ };
+ }
+
+ const potensiDesa = await prisma.potensiDesa.findUnique({
+ where: { id },
+ include: {
+ image: true,
+ },
+ });
+
+ if (!potensiDesa) {
+ return {
+ status: 404,
+ body: "Potensi Desa tidak ditemukan",
+ };
+ }
+
+ // Hapus file gambar dari filesystem jika ada
+ if (potensiDesa.image) {
+ try {
+ const filePath = path.join(potensiDesa.image.path, potensiDesa.image.name);
+ await fs.unlink(filePath);
+ await prisma.fileStorage.delete({
+ where: { id: potensiDesa.image.id },
+ });
+ } catch (err) {
+ console.error("Gagal hapus file image:", err);
+ }
+ }
+
+ // Hapus potensi desa dari DB
+ await prisma.potensiDesa.delete({
+ where: { id },
+ });
+
+ return {
+ success: true,
+ message: "Potensi Desa dan file terkait berhasil dihapus",
+ };
+};
+
+export default potensiDesaDelete;
\ No newline at end of file
diff --git a/src/app/api/[[...slugs]]/_lib/desa/potensi/find-many.ts b/src/app/api/[[...slugs]]/_lib/desa/potensi/find-many.ts
new file mode 100644
index 00000000..bf78eacb
--- /dev/null
+++ b/src/app/api/[[...slugs]]/_lib/desa/potensi/find-many.ts
@@ -0,0 +1,26 @@
+import prisma from "@/lib/prisma";
+
+async function potensiDesaFindMany() {
+ try {
+ const data = await prisma.potensiDesa.findMany({
+ where: { isActive: true },
+ include: {
+ image: true,
+ },
+ });
+
+ return {
+ success: true,
+ message: "Success fetch potensi desa",
+ data,
+ };
+ } catch (e) {
+ console.error("Find many error:", e);
+ return {
+ success: false,
+ message: "Failed fetch potensi desa",
+ };
+ }
+}
+
+export default potensiDesaFindMany
\ No newline at end of file
diff --git a/src/app/api/[[...slugs]]/_lib/desa/potensi/find-unique.ts b/src/app/api/[[...slugs]]/_lib/desa/potensi/find-unique.ts
new file mode 100644
index 00000000..d5944f87
--- /dev/null
+++ b/src/app/api/[[...slugs]]/_lib/desa/potensi/find-unique.ts
@@ -0,0 +1,51 @@
+import prisma from "@/lib/prisma";
+
+export default async function findUnique(
+ request: Request) {
+ const url = new URL(request.url);
+ const pathSegments = url.pathname.split('/');
+ const id = pathSegments[pathSegments.length - 1];
+
+ if(!id) {
+ return Response.json({
+ success: false,
+ message: "ID tidak boleh kosong",
+ }, { status: 400 });
+ }
+
+ try {
+ if( typeof id !== 'string') {
+ return Response.json({
+ success: false,
+ message: "ID harus berupa string",
+ }, { status: 400 });
+ }
+
+ const data = await prisma.potensiDesa.findUnique({
+ where: { id },
+ include: {
+ image: true,
+ },
+ });
+
+ if(!data) {
+ return Response.json({
+ success: false,
+ message: "Potensi Desa tidak ditemukan",
+ }, { status: 404 });
+ }
+
+ return Response.json({
+ success: true,
+ message: "Success fetch potensi desa by ID",
+ data,
+ }, { status: 200 });
+ } catch (error) {
+ console.error("Find by ID error:", error);
+ return Response.json({
+ success: false,
+ message: "Gagal mengambil potensi desa: " + (error instanceof Error ? error.message : 'Unknown error'),
+ }, { status: 500 });
+ }
+
+}
\ No newline at end of file
diff --git a/src/app/api/[[...slugs]]/_lib/desa/potensi/index.ts b/src/app/api/[[...slugs]]/_lib/desa/potensi/index.ts
new file mode 100644
index 00000000..2cf0b658
--- /dev/null
+++ b/src/app/api/[[...slugs]]/_lib/desa/potensi/index.ts
@@ -0,0 +1,45 @@
+import Elysia from "elysia";
+import createPotensiDesa from "./create";
+import { t } from "elysia";
+import potensiDesaDelete from "./del";
+import potensiDesaFindMany from "./find-many";
+import potensiDesaUpdate from "./updt";
+import findUnique from "./find-unique";
+
+
+const PotensiDesa = new Elysia({
+ prefix: "/potensi", tags: ["Desa/Potensi"]
+})
+ .post("/create", createPotensiDesa, {
+ body: t.Object({
+ name: t.String(),
+ deskripsi: t.String(),
+ kategori: t.String(),
+ imageId: t.String(),
+ content: t.String(),
+ }),
+ })
+ .delete("/del/:id", potensiDesaDelete)
+ .get("/find-many", potensiDesaFindMany)
+ .get("/:id", async (context) => {
+ const response = await findUnique(new Request(context.request));
+ return response;
+ })
+ .put(
+ "/:id",
+ async (context) => {
+ const response = await potensiDesaUpdate(context);
+ return response;
+ },
+ {
+ body: t.Object({
+ name: t.String(),
+ deskripsi: t.String(),
+ kategori: t.String(),
+ imageId: t.String(),
+ content: t.String(),
+ }),
+ }
+ )
+
+export default PotensiDesa
\ No newline at end of file
diff --git a/src/app/api/[[...slugs]]/_lib/desa/potensi/updt.ts b/src/app/api/[[...slugs]]/_lib/desa/potensi/updt.ts
new file mode 100644
index 00000000..5edc9506
--- /dev/null
+++ b/src/app/api/[[...slugs]]/_lib/desa/potensi/updt.ts
@@ -0,0 +1,98 @@
+import prisma from "@/lib/prisma";
+import { Prisma } from "@prisma/client";
+import { Context } from "elysia";
+import path from "path";
+import fs from "fs/promises";
+
+type FormUpdate = Prisma.PotensiDesaGetPayload<{
+ select: {
+ id: true;
+ name: true;
+ deskripsi: true;
+ kategori: true;
+ imageId: true;
+ content: true;
+ };
+}>;
+
+export default async function potensiDesaUpdate(context: Context) {
+ try {
+ const id = context.params?.id as string;
+ const body = (await context.body) as Omit;
+
+ const {
+ name,
+ deskripsi,
+ kategori,
+ imageId,
+ content,
+ } = body;
+
+ if (!id) {
+ return new Response(
+ JSON.stringify({ success: false, message: "ID tidak ditemukan" }),
+ { status: 400, headers: { 'Content-Type': 'application/json' } }
+ )
+ }
+
+ const existing = await prisma.potensiDesa.findUnique({
+ where: { id },
+ include: {
+ image: true,
+ }
+ });
+
+ if (!existing) {
+ return new Response(
+ JSON.stringify({ success: false, message: "Potensi Desa tidak ditemukan"}),
+ { status: 404, headers: { 'Content-Type': 'application/json' } }
+ )
+ }
+
+ if (existing.imageId && existing.imageId !== imageId) {
+ const oldImage = existing.image;
+ if (oldImage) {
+ try {
+ const filePath = path.join(oldImage.path, oldImage.name);
+ await fs.unlink(filePath);
+ await prisma.fileStorage.delete({
+ where: { id: oldImage.id },
+ });
+ } catch (error) {
+ console.error("Gagal hapus gambar lama:", error);
+ }
+ }
+ }
+
+ const updated = await prisma.potensiDesa.update({
+ where: { id },
+ data: {
+ name,
+ deskripsi,
+ kategori,
+ imageId,
+ content,
+ },
+ });
+
+ return new Response(
+ JSON.stringify({
+ success: true,
+ message: "Potensi Desa berhasil diupdate",
+ data: updated,
+ }),
+ { status: 200, headers: { 'Content-Type': 'application/json' } }
+ );
+ } catch (error) {
+ console.error("Error updating potensi desa:", error);
+ return new Response(
+ JSON.stringify({
+ success: false,
+ message: "Terjadi kesalahan saat mengupdate potensi desa",
+ }),
+ { status: 500, headers: { 'Content-Type': 'application/json' } }
+ );
+ }
+
+}
+
diff --git a/src/app/darmasaba/_com/Footer.tsx b/src/app/darmasaba/_com/Footer.tsx
index 05909d12..d3755a94 100644
--- a/src/app/darmasaba/_com/Footer.tsx
+++ b/src/app/darmasaba/_com/Footer.tsx
@@ -10,7 +10,7 @@ function Footer() {
return (
<>
-
+
diff --git a/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx b/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx
index 72303ca2..b446f2da 100644
--- a/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx
+++ b/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx
@@ -44,9 +44,9 @@ function DesaAntiKorupsi() {
- Desa Anti Korupsi
+ Desa Anti Korupsi
- Desa antikorupsi mendorong pemerintahan jujur dan transparan. Keuangan desa dikelola terbuka dengan melibatkan warga mengawasi anggaran, sehingga digunakan tepat sasaran sesuai kebutuhan.
+ Desa antikorupsi mendorong pemerintahan jujur dan transparan. Keuangan desa dikelola terbuka dengan melibatkan warga mengawasi anggaran, sehingga digunakan tepat sasaran sesuai kebutuhan.
@@ -65,13 +65,13 @@ function DesaAntiKorupsi() {
- {v.judul}
+ {v.judul}
{v.icon}
- {v.deskripsi}
+ {v.deskripsi}
diff --git a/src/app/darmasaba/_com/main-page/kepuasan/index.tsx b/src/app/darmasaba/_com/main-page/kepuasan/index.tsx
index c173a10f..865784a9 100644
--- a/src/app/darmasaba/_com/main-page/kepuasan/index.tsx
+++ b/src/app/darmasaba/_com/main-page/kepuasan/index.tsx
@@ -1,7 +1,8 @@
"use client";
-import { Stack, Container, Center, Text, Paper, Flex, Box, SimpleGrid } from "@mantine/core";
-import { BarChart, PieChart } from '@mantine/charts';
import colors from "@/con/colors";
+import { BarChart, PieChart } from '@mantine/charts';
+import { Box, Center, Container, Flex, Paper, SimpleGrid, Stack, Text } from "@mantine/core";
+import { useMediaQuery } from "@mantine/hooks";
const dataBarChart = [
{
@@ -71,13 +72,14 @@ const dataPieChart3 = [
]
function Kepuasan() {
+ const isMobile = useMediaQuery('(max-width: 768px)');
return (
- Indeks Kepuasan Masyarakat
+ Indeks Kepuasan Masyarakat
- Ukur kebahagiaan warga, tingkatkan layanan desa! Dengan partisipasi aktif masyarakat, kami berkomitmen untuk terus memperbaiki layanan agar lebih transparan, efektif, dan sesuai dengan kebutuhan warga. Kepuasan Anda adalah prioritas utama kami dalam membangun desa yang lebih baik!
+ Ukur kebahagiaan warga, tingkatkan layanan desa! Dengan partisipasi aktif masyarakat, kami berkomitmen untuk terus memperbaiki layanan agar lebih transparan, efektif, dan sesuai dengan kebutuhan warga. Kepuasan Anda adalah prioritas utama kami dalam membangun desa yang lebih baik!
@@ -118,7 +120,7 @@ function Kepuasan() {
Jenis Kelamin
Pilihan
Umur
-
-
+
+
Jadwal Kerja
@@ -168,7 +164,14 @@ function LandingPage() {
-
+
+
+
+
Rabu, 10 Maret 2025
@@ -187,7 +190,8 @@ function LandingPage() {
-
+
+
diff --git a/src/app/darmasaba/_com/main-page/penghargaan/index.tsx b/src/app/darmasaba/_com/main-page/penghargaan/index.tsx
index 5900da5a..6927c548 100644
--- a/src/app/darmasaba/_com/main-page/penghargaan/index.tsx
+++ b/src/app/darmasaba/_com/main-page/penghargaan/index.tsx
@@ -51,7 +51,7 @@ function Penghargaan() {
Juara 2 Duta Investasi
-
+
Juara Favorit Lomba Video Pendek