diff --git a/prisma/data/lingkungan/konservasi-adat-bali/bentuk-konservasi.json b/prisma/data/lingkungan/konservasi-adat-bali/bentuk-konservasi.json new file mode 100644 index 00000000..f4bb253f --- /dev/null +++ b/prisma/data/lingkungan/konservasi-adat-bali/bentuk-konservasi.json @@ -0,0 +1,7 @@ +[ + { + "id": "edit", + "judul": "Bentuk Konservasi Berdasarkan Adat", + "deskripsi": "" + } + ] \ No newline at end of file diff --git a/prisma/data/lingkungan/konservasi-adat-bali/filosofi-tri-hita.json b/prisma/data/lingkungan/konservasi-adat-bali/filosofi-tri-hita.json new file mode 100644 index 00000000..fbbc5366 --- /dev/null +++ b/prisma/data/lingkungan/konservasi-adat-bali/filosofi-tri-hita.json @@ -0,0 +1,7 @@ +[ + { + "id": "edit", + "judul": "Filosofi Tri Hita Karuna", + "deskripsi": "" + } + ] \ No newline at end of file diff --git a/prisma/data/lingkungan/konservasi-adat-bali/nilai-konservasi-adat.json b/prisma/data/lingkungan/konservasi-adat-bali/nilai-konservasi-adat.json new file mode 100644 index 00000000..5c75792c --- /dev/null +++ b/prisma/data/lingkungan/konservasi-adat-bali/nilai-konservasi-adat.json @@ -0,0 +1,7 @@ +[ + { + "id": "edit", + "judul": "Nilai Konservasi Adat", + "deskripsi": "" + } +] diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 753b1202..a85f13e2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1529,3 +1529,34 @@ model ContohEdukasiLingkungan { deletedAt DateTime @default(now()) isActive Boolean @default(true) } + +// ========================================= KONSERVASI ADAT BALI ========================================= // +model FilosofiTriHita { + id String @id @default(cuid()) + judul String @db.Text + deskripsi String @db.Text + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} + +model BentukKonservasiBerdasarkanAdat { + id String @id @default(cuid()) + judul String @db.Text + deskripsi String @db.Text + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} + +model NilaiKonservasiAdat { + id String @id @default(cuid()) + judul String @db.Text + deskripsi String @db.Text + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} diff --git a/prisma/seed.ts b/prisma/seed.ts index 2b58fa05..66360a50 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -25,6 +25,9 @@ import detailDataPengangguran from './data/ekonomi/jumlah-pengangguran/detail-da 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'; +import nilaiKonservasiAdat from './data/lingkungan/konservasi-adat-bali/nilai-konservasi-adat.json'; +import bentukKonservasiBerdasarkanAdat from './data/lingkungan/konservasi-adat-bali/bentuk-konservasi.json'; +import filosofiTriHita from './data/lingkungan/konservasi-adat-bali/filosofi-tri-hita.json'; (async () => { @@ -517,6 +520,64 @@ import contohEdukasiLingkungan from './data/lingkungan/edukasi-lingkungan/contoh console.log("contoh edukasi lingkungan success ..."); + for (const f of filosofiTriHita) { + await prisma.filosofiTriHita.upsert({ + where: { + id: f.id, + }, + update: { + judul: f.judul, + deskripsi: f.deskripsi, + }, + create: { + id: f.id, + judul: f.judul, + deskripsi: f.deskripsi, + }, + }); + } + + console.log("filosofi tri hita success ..."); + + for (const b of bentukKonservasiBerdasarkanAdat) { + await prisma.bentukKonservasiBerdasarkanAdat.upsert({ + where: { + id: b.id, + }, + update: { + judul: b.judul, + deskripsi: b.deskripsi, + }, + create: { + id: b.id, + judul: b.judul, + deskripsi: b.deskripsi, + }, + }); + } + + console.log("bentuk konservasi berdasarkan adat success ..."); + + + for (const n of nilaiKonservasiAdat) { + await prisma.nilaiKonservasiAdat.upsert({ + where: { + id: n.id, + }, + update: { + judul: n.judul, + deskripsi: n.deskripsi, + }, + create: { + id: n.id, + judul: n.judul, + deskripsi: n.deskripsi, + }, + }); + } + + console.log("nilai konservasi adat success ..."); + })() .then(() => prisma.$disconnect()) .catch((e) => { diff --git a/src/app/admin/(dashboard)/_state/lingkungan/konservasi-adat-bali.ts b/src/app/admin/(dashboard)/_state/lingkungan/konservasi-adat-bali.ts new file mode 100644 index 00000000..ae7598c7 --- /dev/null +++ b/src/app/admin/(dashboard)/_state/lingkungan/konservasi-adat-bali.ts @@ -0,0 +1,274 @@ +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 templateFilosofiTriHitaForm = z.object({ + judul: z.string().min(3, "Judul minimal 3 karakter"), + deskripsi: z.string().min(3, "Deskripsi minimal 3 karakter"), +}); + +type FilosofiTriHitaForm = Prisma.FilosofiTriHitaGetPayload<{ + select: { + id: true; + judul: true; + deskripsi: true; + }; +}>; + +const stateFilosofiTriHita = proxy({ + findById: { + data: null as FilosofiTriHitaForm | null, + loading: false, + initialize() { + stateFilosofiTriHita.findById.data = { + id: "", + judul: "", + deskripsi: "", + } as FilosofiTriHitaForm; + }, + async load(id: string) { + try { + stateFilosofiTriHita.findById.loading = true; + const res = + await ApiFetch.api.lingkungan.konservasiadatbali.filosofitrihitakarana[ + "find-by-id" + ].get({ + query: { id }, + }); + if (res.status === 200) { + stateFilosofiTriHita.findById.data = res.data?.data ?? null; + } else { + toast.error("Gagal mengambil data filosofi tri hita karana"); + } + } catch (error) { + console.error((error as Error).message); + toast.error( + "Terjadi kesalahan saat mengambil data filosofi tri hita karana" + ); + } finally { + stateFilosofiTriHita.findById.loading = false; + } + }, + }, + + update: { + loading: false, + async save(data: FilosofiTriHitaForm) { + const cek = templateFilosofiTriHitaForm.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 { + stateFilosofiTriHita.update.loading = true; + const res = + await ApiFetch.api.lingkungan.konservasiadatbali.filosofitrihitakarana[ + "update" + ].post(data); + if (res.status === 200) { + toast.success("Data filosofi tri hita karana berhasil diubah"); + await stateFilosofiTriHita.findById.load(data.id); + } else { + toast.error("Gagal mengubah data filosofi tri hita karana"); + } + } catch (error) { + console.error((error as Error).message); + toast.error( + "Terjadi kesalahan saat mengubah data filosofi tri hita karana" + ); + } finally { + stateFilosofiTriHita.update.loading = false; + } + }, + }, +}); + +const templateNilaiKonservasiAdatForm = z.object({ + judul: z.string().min(3, "Judul minimal 3 karakter"), + deskripsi: z.string().min(3, "Deskripsi minimal 3 karakter"), +}); + +type NilaiKonservasiAdatForm = Prisma.NilaiKonservasiAdatGetPayload<{ + select: { + id: true; + judul: true; + deskripsi: true; + }; +}>; + +const stateNilaiKonservasiAdat = proxy({ + findById: { + data: null as NilaiKonservasiAdatForm | null, + loading: false, + initialize() { + stateNilaiKonservasiAdat.findById.data = { + id: "", + judul: "", + deskripsi: "", + } as NilaiKonservasiAdatForm; + }, + async load(id: string) { + try { + stateNilaiKonservasiAdat.findById.loading = true; + const res = + await ApiFetch.api.lingkungan.konservasiadatbali.nilaikonservasiadatbali[ + "find-by-id" + ].get({ + query: { id }, + }); + if (res.status === 200) { + stateNilaiKonservasiAdat.findById.data = res.data?.data ?? null; + } else { + toast.error("Gagal mengambil data nilai konservasi adat"); + } + } catch (error) { + console.error((error as Error).message); + toast.error( + "Terjadi kesalahan saat mengambil data nilai konservasi adat" + ); + } finally { + stateNilaiKonservasiAdat.findById.loading = false; + } + }, + }, + + update: { + loading: false, + async save(data: NilaiKonservasiAdatForm) { + const cek = templateNilaiKonservasiAdatForm.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 { + stateNilaiKonservasiAdat.update.loading = true; + const res = + await ApiFetch.api.lingkungan.konservasiadatbali.nilaikonservasiadatbali[ + "update" + ].post(data); + if (res.status === 200) { + toast.success("Data nilai konservasi adat berhasil diubah"); + await stateNilaiKonservasiAdat.findById.load(data.id); + } else { + toast.error("Gagal mengubah data nilai konservasi adat"); + } + } catch (error) { + console.error((error as Error).message); + toast.error( + "Terjadi kesalahan saat mengubah data nilai konservasi adat" + ); + } finally { + stateNilaiKonservasiAdat.update.loading = false; + } + }, + }, +}); + +const templateBentukKonservasiBerdasarkanAdatForm = z.object({ + judul: z.string().min(3, "Judul minimal 3 karakter"), + deskripsi: z.string().min(3, "Deskripsi minimal 3 karakter"), +}); + +type BentukKonservasiBerdasarkanAdatForm = + Prisma.BentukKonservasiBerdasarkanAdatGetPayload<{ + select: { + id: true; + judul: true; + deskripsi: true; + }; + }>; + +const stateBentukKonservasiBerdasarkanAdat = proxy({ + findById: { + data: null as BentukKonservasiBerdasarkanAdatForm | null, + loading: false, + initialize() { + stateBentukKonservasiBerdasarkanAdat.findById.data = { + id: "", + judul: "", + deskripsi: "", + } as BentukKonservasiBerdasarkanAdatForm; + }, + async load(id: string) { + try { + stateBentukKonservasiBerdasarkanAdat.findById.loading = true; + const res = + await ApiFetch.api.lingkungan.konservasiadatbali.bentukkonservasiberdasarkanadat[ + "find-by-id" + ].get({ + query: { id }, + }); + if (res.status === 200) { + stateBentukKonservasiBerdasarkanAdat.findById.data = + res.data?.data ?? null; + } else { + toast.error( + "Gagal mengambil data bentuk konservasi berdasarkan adat" + ); + } + } catch (error) { + console.error((error as Error).message); + toast.error( + "Terjadi kesalahan saat mengambil data bentuk konservasi berdasarkan adat" + ); + } finally { + stateBentukKonservasiBerdasarkanAdat.findById.loading = false; + } + }, + }, + + update: { + loading: false, + async save(data: BentukKonservasiBerdasarkanAdatForm) { + const cek = templateBentukKonservasiBerdasarkanAdatForm.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 { + stateBentukKonservasiBerdasarkanAdat.update.loading = true; + const res = + await ApiFetch.api.lingkungan.konservasiadatbali.bentukkonservasiberdasarkanadat[ + "update" + ].post(data); + if (res.status === 200) { + toast.success( + "Data bentuk konservasi berdasarkan adat berhasil diubah" + ); + await stateBentukKonservasiBerdasarkanAdat.findById.load(data.id); + } else { + toast.error("Gagal mengubah data bentuk konservasi berdasarkan adat"); + } + } catch (error) { + console.error((error as Error).message); + toast.error( + "Terjadi kesalahan saat mengubah data bentuk konservasi berdasarkan adat" + ); + } finally { + stateBentukKonservasiBerdasarkanAdat.update.loading = false; + } + }, + }, +}); + +const stateKonservasiAdatBali = proxy({ + stateFilosofiTriHita, + stateNilaiKonservasiAdat, + stateBentukKonservasiBerdasarkanAdat, +}); + +export default stateKonservasiAdatBali; diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/_lib/konservasiAdatBaliTextEditor.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/_lib/konservasiAdatBaliTextEditor.tsx new file mode 100644 index 00000000..597a0045 --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/_lib/konservasiAdatBaliTextEditor.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 KonservasiAdatBaliTextEditor({ 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/konservasi-adat-bali/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/_lib/layoutTabs.tsx new file mode 100644 index 00000000..558de4a2 --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/_lib/layoutTabs.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: "Filosofi Tri Hita", + value: "filosofi-tri-hita", + href: "/admin/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana" + }, + { + label: "Nilai Konservasi Adat", + value: "nilai-konservasi-adat", + href: "/admin/lingkungan/konservasi-adat-bali/nilai-konservasi-adat" + }, + { + label: "Bentuk Konservasi Berdasarkan Adat", + value: "bentuk-konservasi-berdasarkan-adat", + href: "/admin/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat" + }, + ]; + 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 ( + + Konservasi Adat Bali + + + {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/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/edit/page.tsx new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/edit/page.tsx @@ -0,0 +1 @@ + diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/page.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/page.tsx new file mode 100644 index 00000000..69da2f21 --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/page.tsx @@ -0,0 +1,11 @@ +import React from 'react'; + +function Page() { + return ( +
+ Page +
+ ); +} + +export default Page; 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 deleted file mode 100644 index 9fef945c..00000000 --- a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/create/page.tsx +++ /dev/null @@ -1,59 +0,0 @@ -'use client' -import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; -import { IconArrowBack } from '@tabler/icons-react'; -import { useRouter } from 'next/navigation'; - -function CreateKonservasiAdatBali() { - const router = useRouter() - return ( - - - - - - - - Create Konservasi Adat Bali - Judul Konservasi Adat Bali} - placeholder="masukkan judul konservasi adat bali" - /> - Deskripsi Konservasi Adat Bali} - placeholder="masukkan deskripsi konservasi adat bali" - /> - {/* 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 ? ( - - ) : ( -
- -
- )} */} - - - -
-
-
- ); -} - -export default CreateKonservasiAdatBali; diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/detail/page.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/detail/page.tsx deleted file mode 100644 index 3fe2fd7b..00000000 --- a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/detail/page.tsx +++ /dev/null @@ -1,57 +0,0 @@ -'use client' -import colors from '@/con/colors'; -import { Box, Button, Flex, Paper, Stack, Text } from '@mantine/core'; -import { IconArrowBack, IconEdit, IconX } from '@tabler/icons-react'; -import { useRouter } from 'next/navigation'; -// import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; - -function DetailKonservasiAdatBali() { - const router = useRouter(); - return ( - - - - - - - Detail Konservasi Adat Bali - - - - - Judul Konservasi Adat Bali - Test Judul - - - Deskripsi Konservasi Adat Bali - Test Deskripsi - - - - - - - - - - - - - {/* Modal Hapus - setModalHapus(false)} - onConfirm={handleHapus} - text="Apakah anda yakin ingin menghapus potensi ini?" - /> */} - - ); -} - -export default DetailKonservasiAdatBali; diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/edit/page.tsx deleted file mode 100644 index 049cd020..00000000 --- a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/edit/page.tsx +++ /dev/null @@ -1,59 +0,0 @@ -'use client' -import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; -import { IconArrowBack } from '@tabler/icons-react'; -import { useRouter } from 'next/navigation'; - -function EditKonservasiAdatBali() { - const router = useRouter() - return ( - - - - - - - - Edit Konservasi Adat Bali - Judul Konservasi Adat Bali} - placeholder="masukkan judul konservasi adat bali" - /> - Deskripsi Konservasi Adat Bali} - placeholder="masukkan deskripsi konservasi adat bali" - /> - {/* 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 ? ( - - ) : ( -
- -
- )} */} - - - -
-
-
- ); -} - -export default EditKonservasiAdatBali; diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/edit/page.tsx new file mode 100644 index 00000000..a9053c11 --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/edit/page.tsx @@ -0,0 +1,88 @@ +'use client' +import stateKonservasiAdatBali from '@/app/admin/(dashboard)/_state/lingkungan/konservasi-adat-bali'; +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 KonservasiAdatBaliTextEditor = dynamic(() => import('../../_lib/konservasiAdatBaliTextEditor').then(mod => mod.KonservasiAdatBaliTextEditor), { + ssr: false, +}); + +function EditFilosofiTriHitaKarana() { + const router = useRouter() + const filosofiTriHitaState = useProxy(stateKonservasiAdatBali.stateFilosofiTriHita) + const [judul, setJudul] = useState(''); + const [content, setContent] = useState(''); + + useShallowEffect(() => { + if (!filosofiTriHitaState.findById.data) { + filosofiTriHitaState.findById.initialize(); // biar masuk ke `findFirst` route kamu + } + }, []); + + useEffect(() => { + if (filosofiTriHitaState.findById.data) { + setJudul(filosofiTriHitaState.findById.data.judul ?? '') + setContent(filosofiTriHitaState.findById.data.deskripsi ?? '') + } + }, [filosofiTriHitaState.findById.data]) + + const submit = () => { + if (filosofiTriHitaState.findById.data) { + filosofiTriHitaState.findById.data.judul = judul; + filosofiTriHitaState.findById.data.deskripsi = content; + filosofiTriHitaState.update.save(filosofiTriHitaState.findById.data) + } + router.push('/admin/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana') + } + return ( + + + + + + + + + Edit Filosofi Tri Hita Karana + Judul + + Content + + + + + + + + + + ); +} + +export default EditFilosofiTriHitaKarana; diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/page.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/page.tsx new file mode 100644 index 00000000..65a8c1c0 --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/page.tsx @@ -0,0 +1,55 @@ +'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 stateKonservasiAdatBali from '../../../_state/lingkungan/konservasi-adat-bali'; + + +function Page() { + const router = useRouter() + const listFilosofi = useProxy(stateKonservasiAdatBali.stateFilosofiTriHita) + useShallowEffect(() => { + listFilosofi.findById.load('edit') + }, []) + + if (!listFilosofi.findById.data) { + return ( + + + + ) + } + return ( + + + + + Preview Filosofi Tri Hita Karana + + + + + + + + + + + + + + + + + + + + ) +} + +export default Page; diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/layout.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/layout.tsx new file mode 100644 index 00000000..1fa8572a --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/layout.tsx @@ -0,0 +1,11 @@ +'use client' +import LayoutTabs from "./_lib/layoutTabs" + + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ) +} \ No newline at end of file diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/nilai-konservasi-adat/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/nilai-konservasi-adat/edit/page.tsx new file mode 100644 index 00000000..69da2f21 --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/nilai-konservasi-adat/edit/page.tsx @@ -0,0 +1,11 @@ +import React from 'react'; + +function Page() { + return ( +
+ Page +
+ ); +} + +export default Page; diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/nilai-konservasi-adat/page.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/nilai-konservasi-adat/page.tsx new file mode 100644 index 00000000..69da2f21 --- /dev/null +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/nilai-konservasi-adat/page.tsx @@ -0,0 +1,11 @@ +import React from 'react'; + +function Page() { + return ( +
+ Page +
+ ); +} + +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 deleted file mode 100644 index d9e13f25..00000000 --- a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/page.tsx +++ /dev/null @@ -1,64 +0,0 @@ -'use client' -import colors from '@/con/colors'; -import { Box, Button, 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 JudulList from '../../_com/judulList'; -import { useRouter } from 'next/navigation'; - -function KonservasiAdatBali() { - return ( - - } - /> - - - ); -} - -function ListKonservasiAdatBali() { - const router = useRouter(); - return ( - - - - - - - - - Judul Konservasi Adat Bali - Deskripsi Konservasi Adat Bali - Detail - - - - - - - Judul Konservasi Adat Bali - - - Deskripsi Konservasi Adat Bali - - - - - -
-
-
-
-
- ) -} - -export default KonservasiAdatBali; diff --git a/src/app/admin/_com/list_PageAdmin.tsx b/src/app/admin/_com/list_PageAdmin.tsx index c285e8ac..07e7dfdd 100644 --- a/src/app/admin/_com/list_PageAdmin.tsx +++ b/src/app/admin/_com/list_PageAdmin.tsx @@ -333,7 +333,7 @@ export const navBar = [ { id: "Lingkungan_6", name: "Konservasi Adat Bali", - path: "/admin/lingkungan/konservasi-adat-bali" + path: "/admin/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana" } ] }, { diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/index.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/index.ts index 84ea4722..c9a9bdb6 100644 --- a/src/app/api/[[...slugs]]/_lib/lingkungan/index.ts +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/index.ts @@ -3,6 +3,7 @@ import PengelolaanSampah from "./pengelolaan-sampah"; import ProgramPenghijauan from "./program-penghijauan"; import DataLingkunganDesa from "./data-lingkungan-desa"; import EdukasiLingkungan from "./edukasi-lingkungan"; +import KonservasiAdatBali from "./konservasi-adat-bali"; const Lingkungan = new Elysia({ prefix: "/api/lingkungan", @@ -13,5 +14,7 @@ const Lingkungan = new Elysia({ .use(ProgramPenghijauan) .use(DataLingkunganDesa) .use(EdukasiLingkungan) +.use(KonservasiAdatBali) + export default Lingkungan; diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/findUnique.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/findUnique.ts new file mode 100644 index 00000000..e37dbcbf --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/findUnique.ts @@ -0,0 +1,33 @@ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +export default async function bentukKonservasiBerdasarkanAdatFindUnique(context: Context) { + try { + const id = context?.params?.slugs?.[0]; + + // If no ID provided, get the first profile + if (!id) { + const data = await prisma.bentukKonservasiBerdasarkanAdat.findFirst(); + return { + success: true, + data, + }; + } + + const data = await prisma.bentukKonservasiBerdasarkanAdat.findUniqueOrThrow({ + where: { id }, + }); + + return { + success: true, + data, + }; + } catch (error) { + console.error("Error fetching bentuk konservasi berdasarkan adat:", 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/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/index.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/index.ts new file mode 100644 index 00000000..f54c8c41 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/index.ts @@ -0,0 +1,18 @@ +import Elysia, { t } from "elysia"; +import bentukKonservasiBerdasarkanAdatFindUnique from "./findUnique"; +import bentukKonservasiBerdasarkanAdatUpdate from "./updt"; + +const BentukKonservasiBerdasarkanAdat = new Elysia({ + prefix: "/bentukkonservasiberdasarkanadat", + tags: ["Lingkungan/Konservasi Adat Bali/Bentuk Konservasi Berdasarkan Adat"] +}) + .get("/find-by-id", bentukKonservasiBerdasarkanAdatFindUnique) + .post("/update", bentukKonservasiBerdasarkanAdatUpdate, { + body: t.Object({ + id: t.String(), + judul: t.String(), + deskripsi: t.String(), + }) + }) + +export default BentukKonservasiBerdasarkanAdat \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/updt.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/updt.ts new file mode 100644 index 00000000..5fa288ad --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/updt.ts @@ -0,0 +1,29 @@ +import prisma from "@/lib/prisma"; +import { Prisma } from "@prisma/client"; +import { Context } from "elysia"; + +type FormCreate = Prisma.BentukKonservasiBerdasarkanAdatGetPayload<{ + select: { + id: true; + judul: true; + deskripsi: true; + } +}> +export default async function bentukKonservasiBerdasarkanAdatUpdate(context: Context) { + const body = context.body as FormCreate; + + await prisma.bentukKonservasiBerdasarkanAdat.update({ + where: { + id: body.id + }, + data: { + judul: body.judul, + deskripsi: body.deskripsi, + } + }) + + return { + success: true, + message: "Bentuk konservasi berdasarkan adat berhasil diupdate", + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/findUnique.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/findUnique.ts new file mode 100644 index 00000000..52f42a16 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/findUnique.ts @@ -0,0 +1,33 @@ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +export default async function filosofiTriHitaKaranaFindUnique(context: Context) { + try { + const id = context?.params?.slugs?.[0]; + + // If no ID provided, get the first profile + if (!id) { + const data = await prisma.filosofiTriHita.findFirst(); + return { + success: true, + data, + }; + } + + const data = await prisma.filosofiTriHita.findUniqueOrThrow({ + where: { id }, + }); + + return { + success: true, + data, + }; + } catch (error) { + console.error("Error fetching filosofi tri hita karana:", 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/konservasi-adat-bali/filosofi-tri-hita-karana/index.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/index.ts new file mode 100644 index 00000000..d01f9dbf --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/index.ts @@ -0,0 +1,18 @@ +import Elysia, { t } from "elysia"; +import filosofiTriHitaKaranaFindUnique from "./findUnique"; +import filosofiTriHitaKaranaUpdate from "./updt"; + +const FilosofiTriHitaKarana = new Elysia({ + prefix: "/filosofitrihitakarana", + tags: ["Lingkungan/Konservasi Adat Bali/Filosofi Tri Hita Karana"] +}) + .get("/find-by-id", filosofiTriHitaKaranaFindUnique) + .post("/update", filosofiTriHitaKaranaUpdate, { + body: t.Object({ + id: t.String(), + judul: t.String(), + deskripsi: t.String(), + }) + }) + +export default FilosofiTriHitaKarana \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/updt.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/updt.ts new file mode 100644 index 00000000..8d686333 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/updt.ts @@ -0,0 +1,29 @@ +import prisma from "@/lib/prisma"; +import { Prisma } from "@prisma/client"; +import { Context } from "elysia"; + +type FormCreate = Prisma.FilosofiTriHitaGetPayload<{ + select: { + id: true; + judul: true; + deskripsi: true; + } +}> +export default async function filosofiTriHitaKaranaUpdate(context: Context) { + const body = context.body as FormCreate; + + await prisma.filosofiTriHita.update({ + where: { + id: body.id + }, + data: { + judul: body.judul, + deskripsi: body.deskripsi, + } + }) + + return { + success: true, + message: "Filosofi tri hita karana berhasil diupdate", + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/index.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/index.ts new file mode 100644 index 00000000..bb4670aa --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/index.ts @@ -0,0 +1,15 @@ +import Elysia from "elysia"; +import BentukKonservasiBerdasarkanAdat from "./bentuk-konservasi-berdasarkan-adat"; +import FilosofiTriHitaKarana from "./filosofi-tri-hita-karana"; +import NilaiKonservasiAdatBali from "./nilai-konservasi-adat-bali"; + +const KonservasiAdatBali = new Elysia({ + prefix: "/konservasiadatbali", + tags: ["Lingkungan/Konservasi Adat Bali"] +}) + +.use(BentukKonservasiBerdasarkanAdat) +.use(FilosofiTriHitaKarana) +.use(NilaiKonservasiAdatBali) + +export default KonservasiAdatBali diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/nilai-konservasi-adat-bali/findUnique.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/nilai-konservasi-adat-bali/findUnique.ts new file mode 100644 index 00000000..54b16a14 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/nilai-konservasi-adat-bali/findUnique.ts @@ -0,0 +1,33 @@ +import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +export default async function nilaiKonservasiAdatBaliFindUnique(context: Context) { + try { + const id = context?.params?.slugs?.[0]; + + // If no ID provided, get the first profile + if (!id) { + const data = await prisma.nilaiKonservasiAdat.findFirst(); + return { + success: true, + data, + }; + } + + const data = await prisma.nilaiKonservasiAdat.findUniqueOrThrow({ + where: { id }, + }); + + return { + success: true, + data, + }; + } catch (error) { + console.error("Error fetching nilai konservasi adat bali:", 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/konservasi-adat-bali/nilai-konservasi-adat-bali/index.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/nilai-konservasi-adat-bali/index.ts new file mode 100644 index 00000000..4a54a651 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/nilai-konservasi-adat-bali/index.ts @@ -0,0 +1,18 @@ +import Elysia, { t } from "elysia"; +import nilaiKonservasiAdatBaliFindUnique from "./findUnique"; +import nilaiKonservasiAdatBaliUpdate from "./updt"; + +const NilaiKonservasiAdatBali = new Elysia({ + prefix: "/nilaikonservasiadatbali", + tags: ["Lingkungan/Konservasi Adat Bali/Nilai Konservasi Adat Bali"] +}) + .get("/find-by-id", nilaiKonservasiAdatBaliFindUnique) + .post("/update", nilaiKonservasiAdatBaliUpdate, { + body: t.Object({ + id: t.String(), + judul: t.String(), + deskripsi: t.String(), + }) + }) + +export default NilaiKonservasiAdatBali \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/nilai-konservasi-adat-bali/updt.ts b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/nilai-konservasi-adat-bali/updt.ts new file mode 100644 index 00000000..3b2fd698 --- /dev/null +++ b/src/app/api/[[...slugs]]/_lib/lingkungan/konservasi-adat-bali/nilai-konservasi-adat-bali/updt.ts @@ -0,0 +1,29 @@ +import prisma from "@/lib/prisma"; +import { Prisma } from "@prisma/client"; +import { Context } from "elysia"; + +type FormCreate = Prisma.NilaiKonservasiAdatGetPayload<{ + select: { + id: true; + judul: true; + deskripsi: true; + } +}> +export default async function nilaiKonservasiAdatUpdate(context: Context) { + const body = context.body as FormCreate; + + await prisma.nilaiKonservasiAdat.update({ + where: { + id: body.id + }, + data: { + judul: body.judul, + deskripsi: body.deskripsi, + } + }) + + return { + success: true, + message: "Nilai konservasi adat berhasil diupdate", + } +} \ No newline at end of file