From e2f75ff3ad1e88e6a9886e3211aff63590bfb788 Mon Sep 17 00:00:00 2001 From: nico Date: Fri, 18 Jul 2025 21:24:51 +0800 Subject: [PATCH] API & UI Menu Lingkungan, Submenu Edukas Lingkungan --- .../contoh-kegiatan-di-desa-darmasaba.json | 7 + .../materi-edukasi-yang-diberikan.json | 7 + .../tujuan-edukasi-lingkungan.json | 3 +- prisma/seed.ts | 62 +++++ .../_state/lingkungan/edukasi-lingkungan.ts | 240 ++++++++++++++++++ .../_lib/edukasiLingkunganTextEditor.tsx | 100 ++++++++ .../edukasi-lingkungan/_lib/layouTabs.tsx | 67 +++++ .../edit/page.tsx | 87 +++++++ .../contoh-kegiatan-desa-darmasaba/page.tsx | 54 ++++ .../edukasi-lingkungan/create/page.tsx | 61 ----- .../edukasi-lingkungan/detail/page.tsx | 62 ----- .../edukasi-lingkungan/edit/page.tsx | 61 ----- .../lingkungan/edukasi-lingkungan/layout.tsx | 10 + .../edit/page.tsx | 87 +++++++ .../materi-edukasi-yang-diberikan/page.tsx | 54 ++++ .../lingkungan/edukasi-lingkungan/page.tsx | 69 ----- .../tujuan-edukasi-lingkungan/edit/page.tsx | 87 +++++++ .../tujuan-edukasi-lingkungan/page.tsx | 54 ++++ src/app/admin/_com/list_PageAdmin.tsx | 2 +- .../contoh-kegiatan-desa/findUnique.ts | 33 +++ .../contoh-kegiatan-desa/index.ts | 18 ++ .../contoh-kegiatan-desa/updt.ts | 29 +++ .../lingkungan/edukasi-lingkungan/index.ts | 14 + .../materi-edukasi-lingkunga/findUnique.ts | 33 +++ .../materi-edukasi-lingkunga/index.ts | 19 ++ .../materi-edukasi-lingkunga/updt.ts | 29 +++ .../tujuan-edukasi-lingkungan/findUnqiue.ts | 33 +++ .../tujuan-edukasi-lingkungan/index.ts | 18 ++ .../tujuan-edukasi-lingkungan/updt.ts | 29 +++ .../api/[[...slugs]]/_lib/lingkungan/index.ts | 2 + 30 files changed, 1176 insertions(+), 255 deletions(-) create mode 100644 prisma/data/lingkungan/edukasi-lingkungan/contoh-kegiatan-di-desa-darmasaba.json create mode 100644 prisma/data/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan.json create mode 100644 src/app/admin/(dashboard)/_state/lingkungan/edukasi-lingkungan.ts create mode 100644 src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/_lib/edukasiLingkunganTextEditor.tsx create mode 100644 src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/_lib/layouTabs.tsx create mode 100644 src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba/edit/page.tsx create mode 100644 src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba/page.tsx delete mode 100644 src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/create/page.tsx delete mode 100644 src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/detail/page.tsx delete mode 100644 src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/edit/page.tsx create mode 100644 src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/layout.tsx create mode 100644 src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan/edit/page.tsx create mode 100644 src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan/page.tsx delete mode 100644 src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/page.tsx create mode 100644 src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/edit/page.tsx create mode 100644 src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/page.tsx create mode 100644 src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa/findUnique.ts create mode 100644 src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa/index.ts create mode 100644 src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa/updt.ts create mode 100644 src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/index.ts create mode 100644 src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/materi-edukasi-lingkunga/findUnique.ts create mode 100644 src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/materi-edukasi-lingkunga/index.ts create mode 100644 src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/materi-edukasi-lingkunga/updt.ts create mode 100644 src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/findUnqiue.ts create mode 100644 src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/index.ts create mode 100644 src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/updt.ts diff --git a/prisma/data/lingkungan/edukasi-lingkungan/contoh-kegiatan-di-desa-darmasaba.json b/prisma/data/lingkungan/edukasi-lingkungan/contoh-kegiatan-di-desa-darmasaba.json new file mode 100644 index 00000000..a596e339 --- /dev/null +++ b/prisma/data/lingkungan/edukasi-lingkungan/contoh-kegiatan-di-desa-darmasaba.json @@ -0,0 +1,7 @@ +[ + { + "id": "edit", + "judul": "Contoh Kegiatan di Desa Darmasaba", + "deskripsi": "" + } + ] \ No newline at end of file diff --git a/prisma/data/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan.json b/prisma/data/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan.json new file mode 100644 index 00000000..4311e767 --- /dev/null +++ b/prisma/data/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan.json @@ -0,0 +1,7 @@ +[ + { + "id": "edit", + "judul": "Materi Edukasi yang Diberikan", + "deskripsi": "" + } +] diff --git a/prisma/data/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan.json b/prisma/data/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan.json index 64eb08a9..94621b82 100644 --- a/prisma/data/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan.json +++ b/prisma/data/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan.json @@ -1,6 +1,7 @@ [ { + "id": "edit", "judul": "Tujuan Edukasi Lingkungan", - "deskripsi": "Meningkatkan kesadaran masyarakat tentang pentingnya lingkungan bersih dan sehat Mendorong partisipasi warga dalam kegiatan pengelolaan sampah, penghijauan, dan konservasi Mengurangi dampak negatif terhadap lingkungan dari kegiatan manusia Membentuk generasi muda yang peduli terhadap isu-isu lingkungan" + "deskripsi": "" } ] diff --git a/prisma/seed.ts b/prisma/seed.ts index 7d0dd7f9..2b58fa05 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -22,6 +22,10 @@ import hubunganOrganisasi from "./data/ekonomi/struktur-organisasi/hubungan-orga import posisiOrganisasi from "./data/ekonomi/struktur-organisasi/posisi-organisasi.json"; import pegawai from "./data/ekonomi/struktur-organisasi/pegawai.json"; import detailDataPengangguran from './data/ekonomi/jumlah-pengangguran/detail-data-pengangguran.json'; +import tujuanEdukasiLingkungan from './data/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan.json'; +import materiEdukasiLingkungan from './data/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan.json'; +import contohEdukasiLingkungan from './data/lingkungan/edukasi-lingkungan/contoh-kegiatan-di-desa-darmasaba.json'; + (async () => { for (const l of layanan) { @@ -455,6 +459,64 @@ import detailDataPengangguran from './data/ekonomi/jumlah-pengangguran/detail-da }); } console.log("📊 detailDataPengangguran success ..."); + + for (const e of tujuanEdukasiLingkungan) { + await prisma.tujuanEdukasiLingkungan.upsert({ + where: { + id: e.id, + }, + update: { + judul: e.judul, + deskripsi: e.deskripsi, + }, + create: { + id: e.id, + judul: e.judul, + deskripsi: e.deskripsi, + }, + }); + } + + console.log("tujuan edukasi lingkungan success ..."); + + for (const m of materiEdukasiLingkungan) { + await prisma.materiEdukasiLingkungan.upsert({ + where: { + id: m.id, + }, + update: { + judul: m.judul, + deskripsi: m.deskripsi, + }, + create: { + id: m.id, + judul: m.judul, + deskripsi: m.deskripsi, + }, + }); + } + + console.log("materi edukasi lingkungan success ..."); + + for (const c of contohEdukasiLingkungan) { + await prisma.contohEdukasiLingkungan.upsert({ + where: { + id: c.id, + }, + update: { + judul: c.judul, + deskripsi: c.deskripsi, + }, + create: { + id: c.id, + judul: c.judul, + deskripsi: c.deskripsi, + }, + }); + } + + console.log("contoh edukasi lingkungan success ..."); + })() .then(() => prisma.$disconnect()) .catch((e) => { diff --git a/src/app/admin/(dashboard)/_state/lingkungan/edukasi-lingkungan.ts b/src/app/admin/(dashboard)/_state/lingkungan/edukasi-lingkungan.ts new file mode 100644 index 00000000..aae10246 --- /dev/null +++ b/src/app/admin/(dashboard)/_state/lingkungan/edukasi-lingkungan.ts @@ -0,0 +1,240 @@ +import ApiFetch from "@/lib/api-fetch"; +import { Prisma } from "@prisma/client"; +import { toast } from "react-toastify"; +import { proxy } from "valtio"; +import { z } from "zod"; + +const templateTujuanEdukasiForm = z.object({ + judul: z.string().min(3, "Judul minimal 3 karakter"), + deskripsi: z.string().min(3, "Deskripsi minimal 3 karakter"), +}); + +type TujuanEdukasiForm = Prisma.TujuanEdukasiLingkunganGetPayload<{ + select: { + id: true; + judul: true; + deskripsi: true; + }; +}>; + +const stateTujuanEdukasi = proxy({ + findById: { + data: null as TujuanEdukasiForm | null, + loading: false, + initialize() { + stateTujuanEdukasi.findById.data = { + id: '', + judul: '', + deskripsi: '', + } as TujuanEdukasiForm; + }, + async load(id: string) { + try { + stateTujuanEdukasi.findById.loading = true; + const res = await ApiFetch.api.lingkungan.edukasilingkungan.tujuanedukasilingkungan["find-by-id"].get({ + query: { id }, + }); + if (res.status === 200) { + stateTujuanEdukasi.findById.data = res.data?.data ?? null; + } else { + toast.error("Gagal mengambil data tujuan edukasi"); + } + } catch (error) { + console.error((error as Error).message); + toast.error("Terjadi kesalahan saat mengambil data tujuan edukasi"); + } finally { + stateTujuanEdukasi.findById.loading = false; + } + }, + }, + + update: { + loading: false, + async save(data: TujuanEdukasiForm) { + const cek = templateTujuanEdukasiForm.safeParse(data); + if (!cek.success) { + const errors = cek.error.issues + .map((issue) => `${issue.path.join(".")}: ${issue.message}`) + .join(", "); + toast.error(`Form tidak valid: ${errors}`); + return; + } + + try { + stateTujuanEdukasi.update.loading = true; + const res = await ApiFetch.api.lingkungan.edukasilingkungan.tujuanedukasilingkungan["update"].post(data); + if (res.status === 200) { + toast.success("Data tujuan edukasi berhasil diubah"); + await stateTujuanEdukasi.findById.load(data.id); + } else { + toast.error("Gagal mengubah data tujuan edukasi"); + } + } catch (error) { + console.error((error as Error).message); + toast.error("Terjadi kesalahan saat mengubah data tujuan edukasi"); + } finally { + stateTujuanEdukasi.update.loading = false; + } + }, + }, +}); + +const templateMateriEdukasiLingkunganForm = z.object({ + judul: z.string().min(3, "Judul minimal 3 karakter"), + deskripsi: z.string().min(3, "Deskripsi minimal 3 karakter"), + }); + + type MateriEdukasiLingkunganForm = Prisma.MateriEdukasiLingkunganGetPayload<{ + select: { + id: true; + judul: true; + deskripsi: true; + }; + }>; + + const stateMateriEdukasiLingkungan = proxy({ + findById: { + data: null as MateriEdukasiLingkunganForm | null, + loading: false, + initialize() { + stateMateriEdukasiLingkungan.findById.data = { + id: '', + judul: '', + deskripsi: '', + } as MateriEdukasiLingkunganForm; + }, + async load(id: string) { + try { + stateMateriEdukasiLingkungan.findById.loading = true; + const res = await ApiFetch.api.lingkungan.edukasilingkungan.materiedukasilingkungan["find-by-id"].get({ + query: { id }, + }); + if (res.status === 200) { + stateMateriEdukasiLingkungan.findById.data = res.data?.data ?? null; + } else { + toast.error("Gagal mengambil data materi edukasi"); + } + } catch (error) { + console.error((error as Error).message); + toast.error("Terjadi kesalahan saat mengambil data materi edukasi"); + } finally { + stateMateriEdukasiLingkungan.findById.loading = false; + } + }, + }, + + update: { + loading: false, + async save(data: MateriEdukasiLingkunganForm) { + const cek = templateMateriEdukasiLingkunganForm.safeParse(data); + if (!cek.success) { + const errors = cek.error.issues + .map((issue) => `${issue.path.join(".")}: ${issue.message}`) + .join(", "); + toast.error(`Form tidak valid: ${errors}`); + return; + } + + try { + stateMateriEdukasiLingkungan.update.loading = true; + const res = await ApiFetch.api.lingkungan.edukasilingkungan.materiedukasilingkungan["update"].post(data); + if (res.status === 200) { + toast.success("Data materi edukasi berhasil diubah"); + await stateMateriEdukasiLingkungan.findById.load(data.id); + } else { + toast.error("Gagal mengubah data materi edukasi"); + } + } catch (error) { + console.error((error as Error).message); + toast.error("Terjadi kesalahan saat mengubah data materi edukasi"); + } finally { + stateMateriEdukasiLingkungan.update.loading = false; + } + }, + }, + }); + + const templateContohEdukasiLingkunganForm = z.object({ + judul: z.string().min(3, "Judul minimal 3 karakter"), + deskripsi: z.string().min(3, "Deskripsi minimal 3 karakter"), + }); + + type ContohEdukasiLingkunganForm = Prisma.ContohEdukasiLingkunganGetPayload<{ + select: { + id: true; + judul: true; + deskripsi: true; + }; + }>; + + const stateContohEdukasiLingkungan = proxy({ + findById: { + data: null as ContohEdukasiLingkunganForm | null, + loading: false, + initialize() { + stateContohEdukasiLingkungan.findById.data = { + id: '', + judul: '', + deskripsi: '', + } as ContohEdukasiLingkunganForm; + }, + async load(id: string) { + try { + stateContohEdukasiLingkungan.findById.loading = true; + const res = await ApiFetch.api.lingkungan.edukasilingkungan.contohkegiatandesa["find-by-id"].get({ + query: { id }, + }); + if (res.status === 200) { + stateContohEdukasiLingkungan.findById.data = res.data?.data ?? null; + } else { + toast.error("Gagal mengambil data contoh edukasi"); + } + } catch (error) { + console.error((error as Error).message); + toast.error("Terjadi kesalahan saat mengambil data contoh edukasi"); + } finally { + stateContohEdukasiLingkungan.findById.loading = false; + } + }, + }, + + update: { + loading: false, + async save(data: ContohEdukasiLingkunganForm) { + const cek = templateContohEdukasiLingkunganForm.safeParse(data); + if (!cek.success) { + const errors = cek.error.issues + .map((issue) => `${issue.path.join(".")}: ${issue.message}`) + .join(", "); + toast.error(`Form tidak valid: ${errors}`); + return; + } + + try { + stateContohEdukasiLingkungan.update.loading = true; + const res = await ApiFetch.api.lingkungan.edukasilingkungan.contohkegiatandesa["update"].post(data); + if (res.status === 200) { + toast.success("Data contoh edukasi berhasil diubah"); + await stateContohEdukasiLingkungan.findById.load(data.id); + } else { + toast.error("Gagal mengubah data contoh edukasi"); + } + } catch (error) { + console.error((error as Error).message); + toast.error("Terjadi kesalahan saat mengubah data contoh edukasi"); + } finally { + stateContohEdukasiLingkungan.update.loading = false; + } + }, + }, + }); + + +const stateEdukasiLingkungan = proxy({ + stateTujuanEdukasi, + stateMateriEdukasiLingkungan, + stateContohEdukasiLingkungan +}) + + +export default stateEdukasiLingkungan; diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/_lib/edukasiLingkunganTextEditor.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/_lib/edukasiLingkunganTextEditor.tsx new file mode 100644 index 00000000..602f65a6 --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/_lib/edukasiLingkunganTextEditor.tsx @@ -0,0 +1,100 @@ +'use client' +import { Button, Stack } from '@mantine/core'; +import { Link, RichTextEditor } from '@mantine/tiptap'; +import Highlight from '@tiptap/extension-highlight'; +import SubScript from '@tiptap/extension-subscript'; +import Superscript from '@tiptap/extension-superscript'; +import TextAlign from '@tiptap/extension-text-align'; +import Underline from '@tiptap/extension-underline'; +import { useEditor } from '@tiptap/react'; +import StarterKit from '@tiptap/starter-kit'; +import { useEffect } from 'react'; + + +export function EdukasiLingkunganTextEditor({ onSubmit, onChange, showSubmit = true, initialContent = '', }: { + onSubmit?: (val: string) => void, + onChange: (val: string) => void, + showSubmit?: boolean, + initialContent?: string }) { + const editor = useEditor({ + extensions: [ + StarterKit, + Underline, + Link, + Superscript, + SubScript, + Highlight, + TextAlign.configure({ types: ['heading', 'paragraph'] }), + ], + immediatelyRender: false, + content: initialContent, + onUpdate : ({editor}) => { + onChange(editor.getHTML()) + } + }); + + useEffect(() => { + if (editor && initialContent !== editor.getHTML()) { + editor.commands.setContent(initialContent || '

'); + } + }, [initialContent, editor]); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {showSubmit && ( + + )} + + ); +} \ No newline at end of file diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/_lib/layouTabs.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/_lib/layouTabs.tsx new file mode 100644 index 00000000..c02e28a4 --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/_lib/layouTabs.tsx @@ -0,0 +1,67 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +'use client' +import colors from '@/con/colors'; +import { Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; +import { usePathname, useRouter } from 'next/navigation'; +import React, { useEffect, useState } from 'react'; + +function LayoutTabs({ children }: { children: React.ReactNode }) { + const router = useRouter() + const pathname = usePathname() + const tabs = [ + { + label: "Tujuan Edukasi Lingkungan", + value: "tujuanedukasilingkungan", + href: "/admin/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan" + }, + { + label: "Materi Edukasi Yang Diberikan", + value: "materiedukasiyangdiberikan", + href: "/admin/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan" + }, + { + label: "Contoh Kegiatan Di Desa Darmasaba", + value: "contohkegiatan", + href: "/admin/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba" + }, + ]; + const curentTab = tabs.find(tab => tab.href === pathname) + const [activeTab, setActiveTab] = useState(curentTab?.value || tabs[0].value); + + const handleTabChange = (value: string | null) => { + const tab = tabs.find(t => t.value === value) + if (tab) { + router.push(tab.href) + } + setActiveTab(value) + } + + useEffect(() => { + const match = tabs.find(tab => tab.href === pathname) + if (match) { + setActiveTab(match.value) + } + }, [pathname]) + + return ( + + Jumlah Penduduk Usia Kerja yang Menganggur + + + {tabs.map((e, i) => ( + {e.label} + ))} + + {tabs.map((e, i) => ( + + {/* Konten dummy, bisa diganti tergantung routing */} + <> + + ))} + + {children} + + ); +} + +export default LayoutTabs; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba/edit/page.tsx new file mode 100644 index 00000000..b4c1a65e --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba/edit/page.tsx @@ -0,0 +1,87 @@ +'use client' +import stateEdukasiLingkungan from '@/app/admin/(dashboard)/_state/lingkungan/edukasi-lingkungan'; +import colors from '@/con/colors'; +import { Box, Button, Group, Paper, Stack, Text, Title } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { IconArrowBack } from '@tabler/icons-react'; +import dynamic from 'next/dynamic'; +import { useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; +import { useProxy } from 'valtio/utils'; + +const EdukasiLingkunganTextEditor = dynamic(() => import('../../_lib/edukasiLingkunganTextEditor').then(mod => mod.EdukasiLingkunganTextEditor), { + ssr: false, +}); + +function EditContohKegiatanDesaDarmasaba() { + const router = useRouter() + const contohEdukasiState = useProxy(stateEdukasiLingkungan.stateContohEdukasiLingkungan) + const [judul, setJudul] = useState(''); + const [content, setContent] = useState(''); + + useShallowEffect(() => { + if (!contohEdukasiState.findById.data) { + contohEdukasiState.findById.initialize(); // biar masuk ke `findFirst` route kamu + } + }, []); + + useEffect(() => { + if (contohEdukasiState.findById.data) { + setJudul(contohEdukasiState.findById.data.judul ?? '') + setContent(contohEdukasiState.findById.data.deskripsi ?? '') + } + }, [contohEdukasiState.findById.data]) + + const submit = () => { + if (contohEdukasiState.findById.data) { + contohEdukasiState.findById.data.judul = judul; + contohEdukasiState.findById.data.deskripsi = content; + contohEdukasiState.update.save(contohEdukasiState.findById.data) + } + router.push('/admin/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba') + } + return ( + + + + + + + + + Edit Contoh Kegiatan Di Desa Darmasaba + Judul + + Deskripsi + + + + + + + + + + ); +} + +export default EditContohKegiatanDesaDarmasaba; diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba/page.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba/page.tsx new file mode 100644 index 00000000..f128e63f --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba/page.tsx @@ -0,0 +1,54 @@ +'use client' +import colors from '@/con/colors'; +import { Box, Button, Grid, GridCol, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { IconEdit } from '@tabler/icons-react'; +import { useRouter } from 'next/navigation'; +import { useProxy } from 'valtio/utils'; +import stateEdukasiLingkungan from '../../../_state/lingkungan/edukasi-lingkungan'; + +function Page() { + const router = useRouter() + const listContohEdukasi = useProxy(stateEdukasiLingkungan.stateContohEdukasiLingkungan) + useShallowEffect(() => { + listContohEdukasi.findById.load('edit') + }, []) + + if (!listContohEdukasi.findById.data) { + return ( + + + + ) + } + return ( + + + + + Preview Contoh Kegiatan Di Desa Darmasaba + + + + + + + + + + + + + + + + + + + + ) +} + +export default Page; diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/create/page.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/create/page.tsx deleted file mode 100644 index e4f01858..00000000 --- a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/create/page.tsx +++ /dev/null @@ -1,61 +0,0 @@ -'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 CreateEdukasiLingkungan() { - const router = useRouter() - return ( - - - - - - - - Create Edukasi Lingkungan - Judul Edukasi Lingkungan} - placeholder="masukkan judul edukasi lingkungan" - /> - Deskripsi Edukasi Lingkungan} - placeholder="masukkan deskripsi edukasi lingkungan" - /> - {/* 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 CreateEdukasiLingkungan; diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/detail/page.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/detail/page.tsx deleted file mode 100644 index 4eb6f96d..00000000 --- a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/detail/page.tsx +++ /dev/null @@ -1,62 +0,0 @@ -'use client' -import colors from '@/con/colors'; -import { Box, Button, Paper, Stack, Flex, Text, Image } from '@mantine/core'; -import { IconArrowBack, IconX, IconEdit } from '@tabler/icons-react'; -import { useRouter } from 'next/navigation'; -import React from 'react'; -// import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; - -function DetailEdukasiLingkungan() { - const router = useRouter(); - return ( - - - - - - - Detail Edukasi Lingkungan - - - - - Judul Edukasi Lingkungan - Test Judul - - - Gambar - gambar - - - Deskripsi Edukasi Lingkungan - Test Deskripsi - - - - - - - - - - - - - {/* Modal Hapus - setModalHapus(false)} - onConfirm={handleHapus} - text="Apakah anda yakin ingin menghapus potensi ini?" - /> */} - - ); -} - -export default DetailEdukasiLingkungan; diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/edit/page.tsx deleted file mode 100644 index ca48b81a..00000000 --- a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/edit/page.tsx +++ /dev/null @@ -1,61 +0,0 @@ -'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 EditEdukasiLingkungan() { - const router = useRouter() - return ( - - - - - - - - Edit Edukasi Lingkungan - Judul Edukasi Lingkungan} - placeholder="masukkan judul edukasi lingkungan" - /> - Deskripsi Edukasi Lingkungan} - placeholder="masukkan deskripsi edukasi lingkungan" - /> - {/* 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 EditEdukasiLingkungan; diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/layout.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/layout.tsx new file mode 100644 index 00000000..9554a428 --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/layout.tsx @@ -0,0 +1,10 @@ +'use client' +import LayoutTabs from "./_lib/layouTabs"; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ) +} \ No newline at end of file diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan/edit/page.tsx new file mode 100644 index 00000000..a0ded4df --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan/edit/page.tsx @@ -0,0 +1,87 @@ +'use client' +import stateEdukasiLingkungan from '@/app/admin/(dashboard)/_state/lingkungan/edukasi-lingkungan'; +import colors from '@/con/colors'; +import { Box, Button, Group, Paper, Stack, Text, Title } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { IconArrowBack } from '@tabler/icons-react'; +import dynamic from 'next/dynamic'; +import { useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; +import { useProxy } from 'valtio/utils'; + +const EdukasiLingkunganTextEditor = dynamic(() => import('../../_lib/edukasiLingkunganTextEditor').then(mod => mod.EdukasiLingkunganTextEditor), { + ssr: false, +}); + +function EditMateriEdukasiYangDiberikan() { + const router = useRouter() + const materiEdukasiState = useProxy(stateEdukasiLingkungan.stateMateriEdukasiLingkungan) + const [judul, setJudul] = useState(''); + const [content, setContent] = useState(''); + + useShallowEffect(() => { + if (!materiEdukasiState.findById.data) { + materiEdukasiState.findById.initialize(); // biar masuk ke `findFirst` route kamu + } + }, []); + + useEffect(() => { + if (materiEdukasiState.findById.data) { + setJudul(materiEdukasiState.findById.data.judul ?? '') + setContent(materiEdukasiState.findById.data.deskripsi ?? '') + } + }, [materiEdukasiState.findById.data]) + + const submit = () => { + if (materiEdukasiState.findById.data) { + materiEdukasiState.findById.data.judul = judul; + materiEdukasiState.findById.data.deskripsi = content; + materiEdukasiState.update.save(materiEdukasiState.findById.data) + } + router.push('/admin/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan') + } + return ( + + + + + + + + + Edit Materi Edukasi Yang Diberikan + Judul + + Content + + + + + + + + + + ); +} + +export default EditMateriEdukasiYangDiberikan; diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan/page.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan/page.tsx new file mode 100644 index 00000000..4fda84db --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan/page.tsx @@ -0,0 +1,54 @@ +'use client' +import colors from '@/con/colors'; +import { Box, Button, Grid, GridCol, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { IconEdit } from '@tabler/icons-react'; +import { useRouter } from 'next/navigation'; +import { useProxy } from 'valtio/utils'; +import stateEdukasiLingkungan from '../../../_state/lingkungan/edukasi-lingkungan'; + +function Page() { + const router = useRouter() + const listMateriEdukasi = useProxy(stateEdukasiLingkungan.stateMateriEdukasiLingkungan) + useShallowEffect(() => { + listMateriEdukasi.findById.load('edit') + }, []) + + if (!listMateriEdukasi.findById.data) { + return ( + + + + ) + } + return ( + + + + + Preview Materi Edukasi Yang Diberikan + + + + + + + + + + + + + + + + + + + + ) +} + +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 deleted file mode 100644 index fae291e3..00000000 --- a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/page.tsx +++ /dev/null @@ -1,69 +0,0 @@ -'use client' -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'; -import { useRouter } from 'next/navigation'; - -function Page() { - return ( - - } - /> - - - ); -} - -function ListEdukasiLingkungan() { - const router = useRouter(); - return ( - - - - - - - - - Judul Edukasi Lingkungan - Gambar - Deskripsi Edukasi Lingkungan - Detail - - - - - - - Judul - - - - - - Deskripsi Edukasi Lingkungan - - - - - -
-
-
-
-
- ) -} - -export default Page; diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/edit/page.tsx new file mode 100644 index 00000000..3de3b509 --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/edit/page.tsx @@ -0,0 +1,87 @@ +'use client' +import stateEdukasiLingkungan from '@/app/admin/(dashboard)/_state/lingkungan/edukasi-lingkungan'; +import colors from '@/con/colors'; +import { Box, Button, Group, Paper, Stack, Text, Title } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { IconArrowBack } from '@tabler/icons-react'; +import dynamic from 'next/dynamic'; +import { useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; +import { useProxy } from 'valtio/utils'; + +const EdukasiLingkunganTextEditor = dynamic(() => import('../../_lib/edukasiLingkunganTextEditor').then(mod => mod.EdukasiLingkunganTextEditor), { + ssr: false, +}); + +function EditTujuanEdukasiLingkungan() { + const router = useRouter() + const tujuanEdukasiState = useProxy(stateEdukasiLingkungan.stateTujuanEdukasi) + const [judul, setJudul] = useState(''); + const [content, setContent] = useState(''); + + useShallowEffect(() => { + if (!tujuanEdukasiState.findById.data) { + tujuanEdukasiState.findById.initialize(); // biar masuk ke `findFirst` route kamu + } + }, []); + + useEffect(() => { + if (tujuanEdukasiState.findById.data) { + setJudul(tujuanEdukasiState.findById.data.judul ?? '') + setContent(tujuanEdukasiState.findById.data.deskripsi ?? '') + } + }, [tujuanEdukasiState.findById.data]) + + const submit = () => { + if (tujuanEdukasiState.findById.data) { + tujuanEdukasiState.findById.data.judul = judul; + tujuanEdukasiState.findById.data.deskripsi = content; + tujuanEdukasiState.update.save(tujuanEdukasiState.findById.data) + } + router.push('/admin/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan') + } + return ( + + + + + + + + + Edit Tujuan Edukasi Lingkungan + Judul + + Content + + + + + + + + + + ); +} + +export default EditTujuanEdukasiLingkungan; diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/page.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/page.tsx new file mode 100644 index 00000000..5d983705 --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/page.tsx @@ -0,0 +1,54 @@ +'use client' +import colors from '@/con/colors'; +import { Box, Button, Grid, GridCol, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { IconEdit } from '@tabler/icons-react'; +import { useRouter } from 'next/navigation'; +import { useProxy } from 'valtio/utils'; +import stateEdukasiLingkungan from '../../../_state/lingkungan/edukasi-lingkungan'; + +function Page() { + const router = useRouter() + const listTujuanEdukasi = useProxy(stateEdukasiLingkungan.stateTujuanEdukasi) + useShallowEffect(() => { + listTujuanEdukasi.findById.load('edit') + }, []) + + if (!listTujuanEdukasi.findById.data) { + return ( + + + + ) + } + return ( + + + + + Preview Tujuan Edukasi Lingkungan + + + + + + + + + + + + + + + + + + + + ) +} + +export default Page; diff --git a/src/app/admin/_com/list_PageAdmin.tsx b/src/app/admin/_com/list_PageAdmin.tsx index d37b20de..c285e8ac 100644 --- a/src/app/admin/_com/list_PageAdmin.tsx +++ b/src/app/admin/_com/list_PageAdmin.tsx @@ -328,7 +328,7 @@ export const navBar = [ { id: "Lingkungan_5", name: "Edukasi Lingkungan", - path: "/admin/lingkungan/edukasi-lingkungan" + path: "/admin/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan" }, { id: "Lingkungan_6", diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa/findUnique.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa/findUnique.ts new file mode 100644 index 00000000..060071a3 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa/findUnique.ts @@ -0,0 +1,33 @@ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +export default async function contohKegiatanDesaFindUnique(context: Context) { + try { + const id = context?.params?.slugs?.[0]; + + // If no ID provided, get the first profile + if (!id) { + const data = await prisma.contohEdukasiLingkungan.findFirst(); + return { + success: true, + data, + }; + } + + const data = await prisma.contohEdukasiLingkungan.findUniqueOrThrow({ + where: { id }, + }); + + return { + success: true, + data, + }; + } catch (error) { + console.error("Error fetching contoh edukasi lingkungan:", error); + + return { + success: false, + message: error instanceof Error ? error.message : "Unknown error", + }; + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa/index.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa/index.ts new file mode 100644 index 00000000..6eab2f29 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa/index.ts @@ -0,0 +1,18 @@ +import Elysia, { t } from "elysia"; +import contohKegiatanDesaFindUnique from "./findUnique"; +import contohKegiatanDesaUpdate from "./updt"; + +const ContohKegiatanDesa = new Elysia({ + prefix: "/contohkegiatandesa", + tags: ["Lingkungan/Edukasi Lingkungan/Contoh Kegiatan Desa"] +}) + .get("/find-by-id", contohKegiatanDesaFindUnique) + .post("/update", contohKegiatanDesaUpdate, { + body: t.Object({ + id: t.String(), + judul: t.String(), + deskripsi: t.String(), + }) + }) + +export default ContohKegiatanDesa \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa/updt.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa/updt.ts new file mode 100644 index 00000000..784c703f --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa/updt.ts @@ -0,0 +1,29 @@ +import prisma from "@/lib/prisma"; +import { Prisma } from "@prisma/client"; +import { Context } from "elysia"; + +type FormCreate = Prisma.ContohEdukasiLingkunganGetPayload<{ + select: { + id: true; + judul: true; + deskripsi: true; + } +}> +export default async function contohKegiatanDesaUpdate(context: Context) { + const body = context.body as FormCreate; + + await prisma.contohEdukasiLingkungan.update({ + where: { + id: body.id + }, + data: { + judul: body.judul, + deskripsi: body.deskripsi, + } + }) + + return { + success: true, + message: "Contoh kegiatan desa berhasil diupdate", + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/index.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/index.ts new file mode 100644 index 00000000..c7dcc5c3 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/index.ts @@ -0,0 +1,14 @@ +import Elysia from "elysia"; +import TujuanEdukasiLingkungan from "./tujuan-edukasi-lingkungan"; +import MateriEdukasiLingkungan from "./materi-edukasi-lingkunga"; +import ContohKegiatanDesa from "./contoh-kegiatan-desa"; + +const EdukasiLingkungan = new Elysia({ + prefix: "/edukasilingkungan", + tags: ["Lingkungan/Edukasi Lingkungan"] +}) +.use(TujuanEdukasiLingkungan) +.use(MateriEdukasiLingkungan) +.use(ContohKegiatanDesa) + +export default EdukasiLingkungan; \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/materi-edukasi-lingkunga/findUnique.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/materi-edukasi-lingkunga/findUnique.ts new file mode 100644 index 00000000..3d93a3f7 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/materi-edukasi-lingkunga/findUnique.ts @@ -0,0 +1,33 @@ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +export default async function materiEdukasiLingkunganFindUnique(context: Context) { + try { + const id = context?.params?.slugs?.[0]; + + // If no ID provided, get the first profile + if (!id) { + const data = await prisma.materiEdukasiLingkungan.findFirst(); + return { + success: true, + data, + }; + } + + const data = await prisma.materiEdukasiLingkungan.findUniqueOrThrow({ + where: { id }, + }); + + return { + success: true, + data, + }; + } catch (error) { + console.error("Error fetching materi edukasi lingkungan:", error); + + return { + success: false, + message: error instanceof Error ? error.message : "Unknown error", + }; + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/materi-edukasi-lingkunga/index.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/materi-edukasi-lingkunga/index.ts new file mode 100644 index 00000000..a9789365 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/materi-edukasi-lingkunga/index.ts @@ -0,0 +1,19 @@ +import Elysia, { t } from "elysia"; + +import materiEdukasiLingkunganUpdate from "./updt"; +import materiEdukasiLingkunganFindUnique from "./findUnique"; + +const MateriEdukasiLingkungan = new Elysia({ + prefix: "/materiedukasilingkungan", + tags: ["Lingkungan/Edukasi Lingkungan/Materi Edukasi Lingkungan"] +}) + .get("/find-by-id", materiEdukasiLingkunganFindUnique) + .post("/update", materiEdukasiLingkunganUpdate, { + body: t.Object({ + id: t.String(), + judul: t.String(), + deskripsi: t.String(), + }) + }) + +export default MateriEdukasiLingkungan \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/materi-edukasi-lingkunga/updt.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/materi-edukasi-lingkunga/updt.ts new file mode 100644 index 00000000..98ebb9aa --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/materi-edukasi-lingkunga/updt.ts @@ -0,0 +1,29 @@ +import prisma from "@/lib/prisma"; +import { Prisma } from "@prisma/client"; +import { Context } from "elysia"; + +type FormCreate = Prisma.MateriEdukasiLingkunganGetPayload<{ + select: { + id: true; + judul: true; + deskripsi: true; + } +}> +export default async function materiEdukasiLingkunganUpdate(context: Context) { + const body = context.body as FormCreate; + + await prisma.materiEdukasiLingkungan.update({ + where: { + id: body.id + }, + data: { + judul: body.judul, + deskripsi: body.deskripsi, + } + }) + + return { + success: true, + message: "Materi edukasi lingkungan berhasil diupdate", + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/findUnqiue.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/findUnqiue.ts new file mode 100644 index 00000000..e97ebbec --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/findUnqiue.ts @@ -0,0 +1,33 @@ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +export default async function tujuanEdukasiLingkunganFindUnique(context: Context) { + try { + const id = context?.params?.slugs?.[0]; + + // If no ID provided, get the first profile + if (!id) { + const data = await prisma.tujuanEdukasiLingkungan.findFirst(); + return { + success: true, + data, + }; + } + + const data = await prisma.tujuanEdukasiLingkungan.findUniqueOrThrow({ + where: { id }, + }); + + return { + success: true, + data, + }; + } catch (error) { + console.error("Error fetching tujuan edukasi lingkungan:", error); + + return { + success: false, + message: error instanceof Error ? error.message : "Unknown error", + }; + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/index.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/index.ts new file mode 100644 index 00000000..656565a5 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/index.ts @@ -0,0 +1,18 @@ +import Elysia, { t } from "elysia"; +import tujuanEdukasiLingkunganFindUnique from "./findUnqiue"; +import tujuanEdukasiLingkunganUpdate from "./updt"; + +const TujuanEdukasiLingkungan = new Elysia({ + prefix: "/tujuanedukasilingkungan", + tags: ["Lingkungan/Edukasi Lingkungan/Tujuan Edukasi Lingkungan"] +}) + .get("/find-by-id", tujuanEdukasiLingkunganFindUnique) + .post("/update", tujuanEdukasiLingkunganUpdate, { + body: t.Object({ + id: t.String(), + judul: t.String(), + deskripsi: t.String(), + }) + }) + +export default TujuanEdukasiLingkungan \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/updt.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/updt.ts new file mode 100644 index 00000000..50f046bf --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/updt.ts @@ -0,0 +1,29 @@ +import prisma from "@/lib/prisma"; +import { Prisma } from "@prisma/client"; +import { Context } from "elysia"; + +type FormCreate = Prisma.TujuanEdukasiLingkunganGetPayload<{ + select: { + id: true; + judul: true; + deskripsi: true; + } +}> +export default async function tujuanEdukasiLingkunganUpdate(context: Context) { + const body = context.body as FormCreate; + + await prisma.tujuanEdukasiLingkungan.update({ + where: { + id: body.id + }, + data: { + judul: body.judul, + deskripsi: body.deskripsi, + } + }) + + return { + success: true, + message: "Tujuan edukasi lingkungan berhasil diupdate", + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/index.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/index.ts index e15ac710..84ea4722 100644 --- a/src/app/api/[[...slugs]]/_lib/lingkungan/index.ts +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/index.ts @@ -2,6 +2,7 @@ import Elysia from "elysia"; import PengelolaanSampah from "./pengelolaan-sampah"; import ProgramPenghijauan from "./program-penghijauan"; import DataLingkunganDesa from "./data-lingkungan-desa"; +import EdukasiLingkungan from "./edukasi-lingkungan"; const Lingkungan = new Elysia({ prefix: "/api/lingkungan", @@ -11,5 +12,6 @@ const Lingkungan = new Elysia({ .use(PengelolaanSampah) .use(ProgramPenghijauan) .use(DataLingkunganDesa) +.use(EdukasiLingkungan) export default Lingkungan;