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": "
Pelestarian Hutan Adat seperti Alas Pala Sangeh atau Wana Kerthi
Subak: Sistem pengelolaan irigasi tradisional yang menjunjung kebersamaan dan keberlanjutan
Hari Raya Tumpek Uduh: Perayaan khusus untuk menghormati pohon dan tumbuhan
Perarem dan Awig-Awig: Aturan adat desa yang mengatur larangan menebang pohon sembarangan, membuang limbah ke sungai, dll.
Ritual penyucian alam seperti Melasti, Piodalan Segara, dan lainnya
"
+ }
+ ]
\ 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": "Parahyangan: Hubungan manusia dengan Tuhan
Pawongan: Hubungan antar manusia
Palemahan: Hubungan manusia dengan alam
"
+ }
+ ]
\ 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": "Menjaga keseimbangan ekosistem
Melestarikan spiritualitas lokal dan kesucian alam
Menumbuhkan kesadaran kolektif untuk hidup selaras dengan lingkungan
Menjaga keberlangsungan sumber daya alam untuk generasi mendatang
"
+ }
+]
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