diff --git a/bun.lockb b/bun.lockb
index 06c02320..519e1a0b 100755
Binary files a/bun.lockb and b/bun.lockb differ
diff --git a/package.json b/package.json
index 8ea1da92..e5e3d04e 100644
--- a/package.json
+++ b/package.json
@@ -48,14 +48,16 @@
"elysia": "^1.2.12",
"embla-carousel-autoplay": "^8.5.2",
"embla-carousel-react": "^7.1.0",
+ "form-data": "^4.0.2",
"framer-motion": "^12.4.1",
"get-port": "^7.1.0",
"jotai": "^2.12.3",
"lodash": "^4.17.21",
"motion": "^12.4.1",
- "nanoid": "^5.1.0",
+ "nanoid": "^5.1.5",
"next": "15.1.6",
"next-view-transitions": "^0.3.4",
+ "node-fetch": "^3.3.2",
"p-limit": "^6.2.0",
"prisma": "^6.3.1",
"react": "^19.0.0",
diff --git a/prisma/data/desa/profile/profil_perbekel.json b/prisma/data/desa/profile/profil_perbekel.json
new file mode 100644
index 00000000..3f846693
--- /dev/null
+++ b/prisma/data/desa/profile/profil_perbekel.json
@@ -0,0 +1,9 @@
+[
+ {
+ "id": "1",
+ "biodata": "
I.B Surya Prabhawa Manuaba, S.H., M.H., adalah Perbekel Darmasaba periode 2021-2027, seorang advokat, pendiri Mantra Legal Consultants & Advocates, serta aktif di bidang musik dan akademis. Dia menempuh pendidikan hukum di Universitas Udayana dan Universitas Mahasaraswati Denpasar serta memiliki pengalaman luas di berbagai organisasi dan kepemimpinan.
",
+ "pengalaman": "2021 - 2027: Perbekel Desa Darmasaba 2015 - Sekarang: Founder & Managing Director Mantra Legal Consultants & Advocates 2020 - Sekarang: Founder Ugawa Record Music Studio 2010 - 2016: Dosen Fakultas Hukum Universitas Mahasaraswati Denpasar ",
+ "pengalamanOrganisasi": " 1996 – 1997: Ketua OSIS SMP Negeri 1 Abiansemal 1999 – 2000: Ketua OSIS SMA Negeri 1 Mengwi 2008 – 2009: Ketua BEM Universitas Mahasaraswati Denpasar 2008 – 2010: Ketua Sekaa Taruna Sila Dharma, Banjar Tengah, Desa Adat Tegal, Darmasaba 2020 – Sekarang: Pengurus Young Lawyer Committee Peradi Denpasar 2021 – Sekarang: Dewan Kehormatan Himpunan Pengusaha Muda Indonesia (HIPMI) Badung 2023 – 2028: Komite Tetap Advokasi – Bidang Hukum dan Regulasi Kamar Dagang dan Industri Badung ",
+ "programUnggulan": "Pemberdayaan Ekonomi dan UMKM Pelatihan dan pendampingan UMKM lokal Program bantuan modal usaha bagi pelaku usaha kecil Digitalisasi UMKM untuk meningkatkan pemasaran produk lokal "
+ }
+]
\ No newline at end of file
diff --git a/prisma/data/desa/profile/profile_desa.json b/prisma/data/desa/profile/profile_desa.json
new file mode 100644
index 00000000..29ed4d8a
--- /dev/null
+++ b/prisma/data/desa/profile/profile_desa.json
@@ -0,0 +1,11 @@
+[
+ {
+ "id": "1",
+ "sejarah" : "Asal – usul nama Darmasaba tertuang dalam lontar Usada Bali. Seperti di tulis dalam monografi Desa Darmasaba tahun 1980 silam, nama Darmasaba berkaitan dengan keturunan Danghyang Nirarta diceritakan, Sang kawi-wiku asal Daha (Jawa Timur) itu memiliki cucu bernama Ida Pedanda Sakti Manuaba yang tigggal di Desa Kendran Tegalalang Gianyar. Merasa tidak disenangi sang ayah, Ida Pedanda Sakti Manuaba pergi mengembara bersama dua orang pengiringnya. Pengembaraan sang pendeta sampai di pura Sarin Buana di Jimbaran. Saat mengadakan semedi di tempat ini sang pendeta melihat sinar api. Yang sangat jauh di utara. Timbul keinginan Ida Pedanda Manuaba untuk mengunjungi tempat itu. Sampailah sang Pedanda di pura Batan Bila Peguyangan. Disini Ida Pedanda Manuaba singgah menghadap Ida Pedanda Budha yang tinggal disana. Selanjutnya, kedua pendeta bersama-sama menuju arah utara dan singgah di Taman Cang Ana, sebuah taman milik Arya Lanang Blusung. Di tempat ini kedua pendeta bersama-sama melaksanakan semedi dan menetap untuk sementara waktu.
",
+ "visi" : "Mewujudkan Desa Darmasaba yang sejahtera, unggul, religius, berbudaya, dan aman dengan berlandaskan Tri Hita Karana
",
+ "misi" : "Memperkokoh kerukunan hidup masyarakat dalam jalinan adat, budaya, olahraga, dan agama. Meningkatkan kualitas pelayanan publik dengan menerapkan teknologi informasi dan komunikasi terintegrasi. Meningkatkan tata kelola pemerintah desa dengan menerapkan prinsip good governance dan good clean government. Meningkatkan kualitas pendidikan, kesehatan, Keluarga Berencana serta pengelolaan kependudukan. Memperkuat usaha mikro kecil dan menengah (UMKM) dan BUMDesa sebagai pilar ekonomi masyarakat. Mewujudkan tatanan kehidupan bermasyarakat yang menjunjung tinggi penegakan hukum dan HAM. Meningkatkan perlindungan dan pengelolaan terhadap sumber daya alam dan lingkungan hidup. Memperkuat daya saing desa melalui peningkatan mutu sumber daya manusia dan infrastruktur desa berbasis potensi desa. Meningkatkan sinergisitas potensi budaya, pertanian dalam arti luas dan pariwisata. ",
+ "lambang" : "Memperkokoh kerukunan hidup masyarakat dalam jalinan adat, budaya, olahraga, dan agama. Meningkatkan kualitas pelayanan publik dengan menerapkan teknologi informasi dan komunikasi terintegrasi. Meningkatkan tata kelola pemerintah desa dengan menerapkan prinsip good governance dan good clean government. Meningkatkan kualitas pendidikan, kesehatan, Keluarga Berencana serta pengelolaan kependudukan. Memperkuat usaha mikro kecil dan menengah (UMKM) dan BUMDesa sebagai pilar ekonomi masyarakat. Mewujudkan tatanan kehidupan bermasyarakat yang menjunjung tinggi penegakan hukum dan HAM. Meningkatkan perlindungan dan pengelolaan terhadap sumber daya alam dan lingkungan hidup. Memperkuat daya saing desa melalui peningkatan mutu sumber daya manusia dan infrastruktur desa berbasis potensi desa. Meningkatkan sinergisitas potensi budaya, pertanian dalam arti luas dan pariwisata. Memperkuat daya saing desa melalui peningkatan mutu sumber daya manusia dan infrastruktur desa berbasis potensi desa. Meningkatkan sinergisitas potensi budaya, pertanian dalam arti luas dan pariwisata. ",
+ "maskot" : "Pudak adalah bunga dari tanaman sejenis pandan (Pandanaceae). Bentuk bunga ini tersusun dalam beberapa lapisan, terbungkus oleh kelopak warna putih (semacam daun lonjong) yang ujungnya meruncing.
Bunga Pudak berwarna kuning dan akan terlihat jika kelopak atau pelepahnya telah mekar. Kekhasan dari bunga pudak, yaitu mempunyai aroma wangi yang semerbak nan lembut (tidak menyengat), dan dapat menebar keharuman sepanjang pagi atau pun sore hari. Tanaman ini dapat tumbuh di sepanjang pantai, aliran sungai, di atas batu-batu karang, dan juga di tanah ladang.
Dalam Kamus Jawa Kuna- Indonesia kata “Pudak” berarti bunga pandan atau Pandanus Moschatus (Mardiwarsito: 1981: 442). Selain itu bunga pudak juga dapat disebut ketaka atau ketaki (Mardiwarsito, 1981: 276). Sedangkan kata “Sategal” berasal dari kata dasar “Tegal” yang berarti ladang (Mardiwarsito, 1981: 593). Jadi Pudak Sategal dapat diartikan sebagai satu ladang luas yang dipenuhi bunga pudak dan menabar keharuman.
Pada sebuah kesempatan, Ida Pedanda Putu Pemaron menjelaskan mengenai makna dari istilah Pudak Sategal dengan sebuah analogi bahwa, sekuntum bunga pudak memiliki aroma wangi atau keharuman yang sangat kuat, apalagi jika satu ladang penuh bunga pudak, maka dapat dipastikan aroma keharumannya akan membumbung menyebar ke segala penjuru (Wawancara, 18 Mei 2019 di Geria Putra Mandara Kenderan, Tegallalang). “Pudak” ialah sebuah bunga yang memiliki aroma wangi atau keharuman yang semerbak, lembut, dan khas.
Garapan Tari Maskot Desa Darmasaba Sekar Pudak diwujudkan ke dalam bentuk tari kreasi yang ditarikan secara berkelompok dengan jumlah lima orang penari perempuan (putri).
Pemilihan penari perempuan dimaksudkan untuk mempresentasikan keindahan, keluwesan, dan keharuman dari bunga pudak. Sedangkan penetapan jumlah penari lima orang didasarkan atas pertimbangan kebutuhan koreografi agar dapat membentuk desain-desain komposisi lantai yang menarik dan dinamis, baik ketika ditarikan di area panggung yang luas atau pun area panggung yang kecil. Penyajian tari maskot ini dirancang dengan durasi waktu 9 menit.
",
+ "profilPerbekelId" : "1"
+ }
+]
\ No newline at end of file
diff --git a/prisma/data/ppid/daftar-informasi-publik-desa-darmasaba/daftarInformasi.json b/prisma/data/ppid/daftar-informasi-publik-desa-darmasaba/daftarInformasi.json
new file mode 100644
index 00000000..a3209314
--- /dev/null
+++ b/prisma/data/ppid/daftar-informasi-publik-desa-darmasaba/daftarInformasi.json
@@ -0,0 +1,8 @@
+[
+ {
+ "id": "1",
+ "jenisInformasi": "Peraturan Desa",
+ "deskripsi": "Dokumen yang berisi kebijakan dan regulasi desa",
+ "tanggal": "15 Januari 2024"
+ }
+]
\ No newline at end of file
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index bf9ed2f0..64e716c2 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -208,6 +208,34 @@ model GrafikBerdasarkanUmur {
}
// ========================================= MENU DESA ========================================= //
+// ========================================= PROFILE DESA ========================================= //
+model ProfileDesa {
+id String @id @default(cuid())
+sejarah String @db.Text
+visi String @db.Text
+misi String @db.Text
+lambang String @db.Text
+maskot String @db.Text
+ProfilPerbekel ProfilPerbekel? @relation(fields: [profilPerbekelId], references: [id])
+profilPerbekelId String?
+createdAt DateTime @default(now())
+updatedAt DateTime @updatedAt
+deletedAt DateTime @default(now())
+isActive Boolean @default(true)
+}
+
+model ProfilPerbekel {
+id String @id @default(cuid())
+biodata String @db.Text
+pengalaman String @db.Text
+pengalamanOrganisasi String @db.Text
+programUnggulan String @db.Text
+ProfileDesa ProfileDesa[]
+createdAt DateTime @default(now())
+updatedAt DateTime @updatedAt
+deletedAt DateTime @default(now())
+isActive Boolean @default(true)
+}
// ========================================= BERITA ========================================= //
model Berita {
id String @id @default(cuid())
diff --git a/prisma/seed.ts b/prisma/seed.ts
index 664de7b8..5efc1532 100644
--- a/prisma/seed.ts
+++ b/prisma/seed.ts
@@ -9,6 +9,8 @@ import potensi from './data/list-potensi.json'
import profilePPID from './data/ppid/profile-ppid/profilePPid.json'
import visiMisiPPID from './data/ppid/visi-misi-ppid/visimisiPPID.json'
import dasarHukumPPID from './data/ppid/dasar-hukum-ppid/dasarhukumPPID.json'
+import profileDesa from './data/desa/profile/profile_desa.json'
+import profilePerbekel from './data/desa/profile/profil_perbekel.json'
(async () => {
for (const l of layanan) {
await prisma.layanan.upsert({
@@ -181,6 +183,54 @@ import dasarHukumPPID from './data/ppid/dasar-hukum-ppid/dasarhukumPPID.json'
}
console.log("dasar hukum PPID success ...")
+ for (const v of profileDesa) {
+ await prisma.profileDesa.upsert({
+ where: {
+ id: v.id,
+ },
+ update: {
+ sejarah: v.sejarah,
+ visi: v.visi,
+ misi: v.misi,
+ lambang: v.lambang,
+ maskot: v.maskot,
+ profilPerbekelId: v.profilPerbekelId
+ },
+ create: {
+ id: v.id,
+ sejarah: v.sejarah,
+ visi: v.visi,
+ misi: v.misi,
+ lambang: v.lambang,
+ maskot: v.maskot,
+ profilPerbekelId: v.profilPerbekelId
+ }
+ })
+ }
+ console.log("profile desa success ...")
+
+ for (const v of profilePerbekel) {
+ await prisma.profilPerbekel.upsert({
+ where: {
+ id: v.id,
+ },
+ update: {
+ biodata: v.biodata,
+ pengalaman: v.pengalaman,
+ pengalamanOrganisasi: v.pengalamanOrganisasi,
+ programUnggulan: v.programUnggulan
+ },
+ create: {
+ id: v.id,
+ biodata: v.biodata,
+ pengalaman: v.pengalaman,
+ pengalamanOrganisasi: v.pengalamanOrganisasi,
+ programUnggulan: v.programUnggulan
+ }
+ })
+ }
+ console.log("profile perbekel success ...")
+
})().then(() => prisma.$disconnect()).catch((e) => {
console.error(e)
prisma.$disconnect()
diff --git a/public/assets/images/ppid/profile-ppid/1_1747129691675_perbekel.png b/public/assets/images/ppid/profile-ppid/1_1747289606214_perbekel.png
similarity index 100%
rename from public/assets/images/ppid/profile-ppid/1_1747129691675_perbekel.png
rename to public/assets/images/ppid/profile-ppid/1_1747289606214_perbekel.png
diff --git a/public/assets/images/ppid/profile-ppid/1_1747297419354_perbekel.png b/public/assets/images/ppid/profile-ppid/1_1747297419354_perbekel.png
new file mode 100644
index 00000000..ed1cbd10
Binary files /dev/null and b/public/assets/images/ppid/profile-ppid/1_1747297419354_perbekel.png differ
diff --git a/src/app/admin/(dashboard)/_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik.ts b/src/app/admin/(dashboard)/_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik.ts
index 4487056f..363998cf 100644
--- a/src/app/admin/(dashboard)/_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik.ts
+++ b/src/app/admin/(dashboard)/_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik.ts
@@ -56,6 +56,7 @@ const caraMemperolehSalinanInformasi = proxy({
}
}
})
+console.log(caraMemperolehSalinanInformasi)
type PermohonanInformasiPublikForm = Prisma.PermohonanInformasiPublikGetPayload<{
select: {
@@ -70,12 +71,12 @@ type PermohonanInformasiPublikForm = Prisma.PermohonanInformasiPublikGetPayload<
};
}>;
-const permohonanInformasiPublikForm = proxy({
+const statepermohonanInformasiPublik = proxy({
create: {
form: {} as PermohonanInformasiPublikForm,
loading: false,
async create(){
- const cek = templateForm.safeParse(permohonanInformasiPublikForm.create.form);
+ const cek = templateForm.safeParse(statepermohonanInformasiPublik.create.form);
if(!cek.success) {
const err = `[${cek.error.issues
.map((v) => `${v.path.join(".")}`)
@@ -83,38 +84,42 @@ const permohonanInformasiPublikForm = proxy({
return toast.error(err);
}
try {
- permohonanInformasiPublikForm.create.loading = true;
- const res = await ApiFetch.api.ppid.permohonaninformasipublik["create"].post(permohonanInformasiPublikForm.create.form);
+ statepermohonanInformasiPublik.create.loading = true;
+ const res = await ApiFetch.api.ppid.permohonaninformasipublik["create"].post(statepermohonanInformasiPublik.create.form);
if (res.status === 200) {
- permohonanInformasiPublikForm.findMany.load();
+ statepermohonanInformasiPublik.findMany.load();
return toast.success("success create");
}
return toast.error("failed create");
} catch (error) {
console.log((error as Error).message);
} finally {
- permohonanInformasiPublikForm.create.loading = false;
+ statepermohonanInformasiPublik.create.loading = false;
}
}
},
findMany: {
data: null as
- | Prisma.PermohonanInformasiPublikGetPayload<{ omit: { isActive: true } }>[]
+ | Prisma.PermohonanInformasiPublikGetPayload<{ include: {
+ caraMemperolehSalinanInformasi: true,
+ jenisInformasiDiminta: true,
+ caraMemperolehInformasi: true,
+ } }>[]
| null,
async load() {
const res = await ApiFetch.api.ppid.permohonaninformasipublik["find-many"].get();
if (res.status === 200) {
- permohonanInformasiPublikForm.findMany.data = res.data?.data ?? [];
+ statepermohonanInformasiPublik.findMany.data = res.data?.data ?? [];
}
}
}
})
-const statePermohonanInformasi = proxy({
- permohonanInformasiPublikForm,
+const statepermohonanInformasiPublikForm = proxy({
+ statepermohonanInformasiPublik,
jenisInformasiDiminta,
caraMemperolehInformasi,
- caraMemperolehSalinanInformasi
+ caraMemperolehSalinanInformasi,
})
-export default statePermohonanInformasi;
+export default statepermohonanInformasiPublikForm;
diff --git a/src/app/admin/(dashboard)/_state/ppid/permohonan_keberatan_informasi_publik/permohonanKeberatanInformasi.ts b/src/app/admin/(dashboard)/_state/ppid/permohonan_keberatan_informasi_publik/permohonanKeberatanInformasi.ts
index 3e8f4f41..0decf48a 100644
--- a/src/app/admin/(dashboard)/_state/ppid/permohonan_keberatan_informasi_publik/permohonanKeberatanInformasi.ts
+++ b/src/app/admin/(dashboard)/_state/ppid/permohonan_keberatan_informasi_publik/permohonanKeberatanInformasi.ts
@@ -20,12 +20,12 @@ type PermohonanKeberatanInformasiForm = Prisma.FormulirPermohonanKeberatanGetPay
};
}>;
-const permohonanKeberatanInformasiForm = proxy({
+const permohonanKeberatanInformasi = proxy({
create: {
form: {} as PermohonanKeberatanInformasiForm,
loading: false,
async create(){
- const cek = templateForm.safeParse(permohonanKeberatanInformasiForm.create.form);
+ const cek = templateForm.safeParse(permohonanKeberatanInformasi.create.form);
if(!cek.success) {
const err = `[${cek.error.issues
.map((v) => `${v.path.join(".")}`)
@@ -33,17 +33,17 @@ const permohonanKeberatanInformasiForm = proxy({
return toast.error(err);
}
try {
- permohonanKeberatanInformasiForm.create.loading = true;
- const res = await ApiFetch.api.ppid.permohonankeberataninformasipublik["create"].post(permohonanKeberatanInformasiForm.create.form);
+ permohonanKeberatanInformasi.create.loading = true;
+ const res = await ApiFetch.api.ppid.permohonankeberataninformasipublik["create"].post(permohonanKeberatanInformasi.create.form);
if (res.status === 200) {
- permohonanKeberatanInformasiForm.findMany.load();
+ permohonanKeberatanInformasi.findMany.load();
return toast.success("success create");
}
return toast.error("failed create");
} catch (error) {
console.log((error as Error).message);
} finally {
- permohonanKeberatanInformasiForm.create.loading = false;
+ permohonanKeberatanInformasi.create.loading = false;
}
},
},
@@ -54,15 +54,11 @@ const permohonanKeberatanInformasiForm = proxy({
async load() {
const res = await ApiFetch.api.ppid.permohonankeberataninformasipublik["find-many"].get();
if (res.status === 200) {
- permohonanKeberatanInformasiForm.findMany.data = res.data?.data ?? [];
+ permohonanKeberatanInformasi.findMany.data = res.data?.data ?? [];
}
}
}
});
-const statePermohonanKeberatan = proxy({
- permohonanKeberatanInformasiForm,
-})
-
-export default statePermohonanKeberatan;
+export default permohonanKeberatanInformasi;
diff --git a/src/app/admin/(dashboard)/desa/_com/desaEditor.tsx b/src/app/admin/(dashboard)/desa/_com/desaEditor.tsx
new file mode 100644
index 00000000..de60355a
--- /dev/null
+++ b/src/app/admin/(dashboard)/desa/_com/desaEditor.tsx
@@ -0,0 +1,93 @@
+'use client'
+import colors from '@/con/colors';
+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';
+
+const content =
+ 'Welcome to Mantine rich text editor RichTextEditor component focuses on usability and is designed to be as simple as possible to bring a familiar editing experience to regular users. RichTextEditor is based on Tiptap.dev and supports all of its features:
General text formatting: bold , italic , underline , strike-through Headings (h1-h6) Sub and super scripts (<sup /> and <sub /> tags) Ordered and bullet lists Text align And all other extensions ';
+
+export function DesaEditor({showSubmit = true} : {
+ showSubmit: boolean
+}) {
+ const editor = useEditor({
+ extensions: [
+ StarterKit,
+ Underline,
+ Link,
+ Superscript,
+ SubScript,
+ Highlight,
+ TextAlign.configure({ types: ['heading', 'paragraph'] }),
+ ],
+ immediatelyRender: false,
+ content,
+ });
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {showSubmit && (
+
+ Submit
+
+ )}
+
+ );
+}
\ No newline at end of file
diff --git a/src/app/admin/(dashboard)/desa/_com/desaEditorText.tsx b/src/app/admin/(dashboard)/desa/_com/desaEditorText.tsx
new file mode 100644
index 00000000..3452d0a2
--- /dev/null
+++ b/src/app/admin/(dashboard)/desa/_com/desaEditorText.tsx
@@ -0,0 +1,95 @@
+'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';
+
+
+function DesaEditorText({ 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())
+ }
+ });
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {showSubmit && (
+ {
+ if (!editor) return
+ onSubmit?.(editor?.getHTML())
+ }}>Submit
+ )}
+
+ );
+}
+
+export default DesaEditorText;
diff --git a/src/app/admin/(dashboard)/desa/profile/page.tsx b/src/app/admin/(dashboard)/desa/profile/page.tsx
index 216d6d1d..8f85b2fa 100644
--- a/src/app/admin/(dashboard)/desa/profile/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profile/page.tsx
@@ -1,10 +1,52 @@
+import colors from '@/con/colors';
+import { Stack, Title, Tabs, TabsList, TabsTab, TabsPanel } from '@mantine/core';
import React from 'react';
+import SejarahDesa from './ui/sejarah_desa/page';
+import VisiMisiDesa from './ui/visi_misi_desa/page';
+import LambangDesa from './ui/lambang_desa/page';
+import MaskotDesa from './ui/maskot_desa/page';
+import ProfilePerbekel from './ui/profile_perbekel/page';
function Page() {
return (
-
- Profile
-
+
+ Profile Desa
+
+
+
+ Sejarah Desa
+
+
+ Visi Misi Desa
+
+
+ Lambang Desa
+
+
+ Maskot Desa
+
+
+ Profile Perbekel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
);
}
diff --git a/src/app/admin/(dashboard)/desa/profile/ui/lambang_desa/page.tsx b/src/app/admin/(dashboard)/desa/profile/ui/lambang_desa/page.tsx
new file mode 100644
index 00000000..ca48c832
--- /dev/null
+++ b/src/app/admin/(dashboard)/desa/profile/ui/lambang_desa/page.tsx
@@ -0,0 +1,39 @@
+import colors from '@/con/colors';
+import { Box, SimpleGrid, Paper, Stack, Title, Group, Button, Text } from '@mantine/core';
+import React from 'react';
+import { DesaEditor } from '../../../_com/desaEditor';
+
+function LambangDesa() {
+ return (
+
+
+
+
+
+ Lambang Desa
+ Deskripsi Lambang Desa
+
+
+
+ Submit
+
+
+
+
+
+
+
+
+ List Lambang Desa
+
+
+
+
+
+ );
+}
+
+export default LambangDesa;
diff --git a/src/app/admin/(dashboard)/desa/profile/ui/maskot_desa/page.tsx b/src/app/admin/(dashboard)/desa/profile/ui/maskot_desa/page.tsx
new file mode 100644
index 00000000..9fc4973b
--- /dev/null
+++ b/src/app/admin/(dashboard)/desa/profile/ui/maskot_desa/page.tsx
@@ -0,0 +1,39 @@
+import colors from '@/con/colors';
+import { Box, SimpleGrid, Paper, Stack, Title, Group, Button, Text } from '@mantine/core';
+import React from 'react';
+import { DesaEditor } from '../../../_com/desaEditor';
+
+function MaskotDesa() {
+ return (
+
+
+
+
+
+ Maskot Desa
+ Deskripsi Maskot Desa
+
+
+
+ Submit
+
+
+
+
+
+
+
+
+ List Maskot Desa
+
+
+
+
+
+ );
+}
+
+export default MaskotDesa;
diff --git a/src/app/admin/(dashboard)/desa/profile/ui/profile_perbekel/page.tsx b/src/app/admin/(dashboard)/desa/profile/ui/profile_perbekel/page.tsx
new file mode 100644
index 00000000..702189dd
--- /dev/null
+++ b/src/app/admin/(dashboard)/desa/profile/ui/profile_perbekel/page.tsx
@@ -0,0 +1,49 @@
+import colors from '@/con/colors';
+import { Box, SimpleGrid, Paper, Stack, Title, Group, Button, TextInput, Text } from '@mantine/core';
+import React from 'react';
+import { DesaEditor } from '../../../_com/desaEditor';
+
+function ProfilePerbekel() {
+ return (
+
+
+
+
+
+ Profil Perbekel
+
+ Biodata
+
+ Pengalaman
+
+ Pengalaman Organisasi
+
+ Program Unggulan
+
+
+
+ Submit
+
+
+
+
+
+
+
+
+ List Profil Perbekel
+
+
+
+
+
+ );
+}
+
+export default ProfilePerbekel;
diff --git a/src/app/admin/(dashboard)/desa/profile/ui/sejarah_desa/page.tsx b/src/app/admin/(dashboard)/desa/profile/ui/sejarah_desa/page.tsx
new file mode 100644
index 00000000..12fe1673
--- /dev/null
+++ b/src/app/admin/(dashboard)/desa/profile/ui/sejarah_desa/page.tsx
@@ -0,0 +1,38 @@
+import colors from '@/con/colors';
+import { Box, Button, Group, Paper, SimpleGrid, Stack, Text, Title } from '@mantine/core';
+import { DesaEditor } from '../../../_com/desaEditor';
+
+function SejarahDesa() {
+ return (
+
+
+
+
+
+ Sejarah Desa
+ Deskripsi Sejarah Desa
+
+
+
+ Submit
+
+
+
+
+
+
+
+
+ List Sejarah Desa
+
+
+
+
+
+ );
+}
+
+export default SejarahDesa;
diff --git a/src/app/admin/(dashboard)/desa/profile/ui/visi_misi_desa/page.tsx b/src/app/admin/(dashboard)/desa/profile/ui/visi_misi_desa/page.tsx
new file mode 100644
index 00000000..f0ccf437
--- /dev/null
+++ b/src/app/admin/(dashboard)/desa/profile/ui/visi_misi_desa/page.tsx
@@ -0,0 +1,64 @@
+import colors from '@/con/colors';
+import { Box, Button, Group, Paper, SimpleGrid, Stack, Text, Title } from '@mantine/core';
+import { DesaEditor } from '../../../_com/desaEditor';
+
+function VisiMisiDesa() {
+ return (
+
+
+
+
+
+ Visi Desa
+ Deskripsi Visi Desa
+
+
+
+ Submit
+
+
+
+
+
+
+
+
+ List Visi Desa
+
+
+
+
+
+
+
+
+ Misi Desa
+ Deskripsi Misi Desa
+
+
+
+ Submit
+
+
+
+
+
+
+
+
+ List Misi Desa
+
+
+
+
+
+ );
+}
+
+export default VisiMisiDesa;
diff --git a/src/app/admin/(dashboard)/ppid/_com/ppid_Editor.tsx b/src/app/admin/(dashboard)/ppid/_com/ppid_Editor.tsx
index 29954bc9..b261c75a 100644
--- a/src/app/admin/(dashboard)/ppid/_com/ppid_Editor.tsx
+++ b/src/app/admin/(dashboard)/ppid/_com/ppid_Editor.tsx
@@ -10,7 +10,7 @@ import { useEditor } from '@tiptap/react';
import StarterKit from '@tiptap/starter-kit';
const content =
- 'Welcome to Mantine rich text editor RichTextEditor component focuses on usability and is designed to be as simple as possible to bring a familiar editing experience to regular users. RichTextEditor is based on Tiptap.dev and supports all of its features:
General text formatting: bold , italic , underline , strike-through Headings (h1-h6) Sub and super scripts (<sup /> and <sub /> tags) Ordered and bullet lists Text align And all other extensions ';
+ 'Dokumen yang berisi kebijakan dan regulasi desa
';
export function PPIDEditor({ onSubmit, onChange, showSubmit = true }: {
onSubmit?: (val: string) => void,
diff --git a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx
index 9ee3ca61..756426ac 100644
--- a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx
+++ b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx
@@ -1,11 +1,10 @@
'use client'
+import colors from '@/con/colors';
import { Box, Button, Group, Paper, SimpleGrid, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, TextInput, Title } from '@mantine/core';
-import React from 'react';
+import { useShallowEffect } from '@mantine/hooks';
import { useProxy } from 'valtio/utils';
import stateDaftarInformasiPublik from '../../_state/ppid/daftar_informasi_publik/daftarInformasiPublik';
-import { PPIDEditor } from '../_com/ppid_Editor';
-import colors from '@/con/colors';
-import { useShallowEffect } from '@mantine/hooks';
+import { PPIDTextEditor } from '../_com/PPIDTextEditor';
function Page() {
const daftarInformasi = useProxy(stateDaftarInformasiPublik.daftarInformasi)
@@ -30,7 +29,7 @@ function Page() {
daftarInformasi.create.form.jenisInformasi = val.target.value
}}
/>
- {
daftarInformasi.create.form.deskripsi = val
@@ -68,46 +67,50 @@ function ListDaftarInformasi() {
if (!listData.findMany.data) return
{Array.from({ length: 10 }).map((v, k) => )}
- return
-
- List Daftar Informasi Publik Desa Darmasaba
-
-
-
-
- No
-
-
- Jenis Informasi
-
-
- Deskripsi
-
-
- Tanggal Publikasi
-
-
-
-
- {listData.findMany.data?.map((item) => (
-
- {item.nomor}
- {item.jenisInformasi}
-
- {item.tanggal}
-
- ))}
-
-
-
-
+ return (
+
+
+
+ List Daftar Informasi Publik Desa Darmasaba
+
+
+
+
+ No
+
+
+ Jenis Informasi
+
+
+ Deskripsi
+
+
+ Tanggal Publikasi
+
+
+
+
+ {listData.findMany.data?.map((item) => (
+
+ {item.nomor}
+ {item.jenisInformasi}
+
+ {item.tanggal}
+
+ ))}
+
+
+
+
+
+ )
}
export default Page;
diff --git a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/page.tsx b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/page.tsx
index f3c7cbbd..dbc9bdb3 100644
--- a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/page.tsx
+++ b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/page.tsx
@@ -1,4 +1,4 @@
-import { Stack, Tabs, TabsList, TabsPanel, TabsTab } from '@mantine/core';
+import { Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core';
import React from 'react';
import colors from '@/con/colors';
import GrafikHasilKepuasan from './_ui/grafik_hasil_kepuasan_masyarakat/page';
@@ -8,9 +8,10 @@ import GrafikBerdasarakanUmur from './_ui/grafik_berdasarkan_umur/page';
function Page() {
return (
-
-
-
+
+ Indeks Kepuasan Masyarakat (IKM) Desa Darmasaba
+
+
Grafik Hasil Kepuasan Masyarakat Terhadap Pelayanan Publik
diff --git a/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/jenisInformasi.tsx b/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/jenisInformasi.tsx
deleted file mode 100644
index 90a1c6f7..00000000
--- a/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/jenisInformasi.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import { Prisma } from '@prisma/client';
-import React from 'react';
-import { useProxy } from 'valtio/utils';
-import statePermohonanInformasi from '../../_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik';
-import { useShallowEffect } from '@mantine/hooks';
-import { Group, Select, Skeleton } from '@mantine/core';
-
-function JenisInformasi({ onChange }: {
- onChange: (value: Prisma.JenisInformasiDimintaGetPayload<{
- select: {
- id: true,
- name: true
- }
- }>) => void
-}) {
- const jenisInformasiState = useProxy(statePermohonanInformasi.jenisInformasiDiminta)
- useShallowEffect(() => {
- jenisInformasiState.findMany.load()
- }, [])
-
- if (!jenisInformasiState.findMany.data) return
- return (
-
- ({
- value: item.id,
- label: item.name
- }))}
- onChange={(v) => {
- const data = jenisInformasiState.findMany.data?.find((item) => item.id === v)
- if (!data) return
- onChange(data)
- }}
- />
-
- );
-}
-
-export default JenisInformasi;
diff --git a/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/memperolehInformasi.tsx b/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/memperolehInformasi.tsx
deleted file mode 100644
index 1bc91900..00000000
--- a/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/memperolehInformasi.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { Group, Select } from '@mantine/core';
-import { useShallowEffect } from '@mantine/hooks';
-import { Prisma } from '@prisma/client';
-import React from 'react';
-import { useProxy } from 'valtio/utils';
-import statePermohonanInformasi from '../../_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik';
-
-function MemperolehInformasi({ onChange }: {
- onChange: (value: Prisma.CaraMemperolehInformasiGetPayload<{
- select: {
- id: true,
- name: true
- }
- }>) => void
-}) {
- const memperolehInformasiState = useProxy(statePermohonanInformasi.caraMemperolehInformasi)
-
- useShallowEffect(() => {
- memperolehInformasiState.findMany.load()
- }, [])
- return (
-
- ({
- value: item.id,
- label: item.name
- }))} onChange={(v) => {
- const data = memperolehInformasiState.findMany.data?.find((item) => item.id === v)
- if (!data) return
- onChange(data)
- }} />
-
- );
-}
-
-export default MemperolehInformasi;
diff --git a/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/memperolehSalinan.tsx b/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/memperolehSalinan.tsx
deleted file mode 100644
index b5dfc2b8..00000000
--- a/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/memperolehSalinan.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { Group, Select, Skeleton } from '@mantine/core';
-import { useShallowEffect } from '@mantine/hooks';
-import { Prisma } from '@prisma/client';
-import React from 'react';
-import { useProxy } from 'valtio/utils';
-import statePermohonanInformasi from '../../_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik';
-
-function MemperolehSalinan({ onChange }: {
- onChange: (value: Prisma.CaraMemperolehSalinanInformasiGetPayload<{
- select: {
- id: true,
- name: true
- }
- }>) => void
-}) {
- const memperolehSalinanInformasiState = useProxy(statePermohonanInformasi.caraMemperolehSalinanInformasi)
- useShallowEffect(() => {
- memperolehSalinanInformasiState.findMany.load()
- }, [])
-
- if (!memperolehSalinanInformasiState.findMany.data) return
- return (
-
- ({
- value: item.id,
- label: item.name
- }))}
- onChange={(v) => {
- if (!v) return
- const selectedItem = memperolehSalinanInformasiState.findMany.data?.find(item => item.id === v)
- if (selectedItem) {
- onChange({
- id: selectedItem.id,
- name: selectedItem.name
- })
- }
- }}
- />
-
- );
-}
-export default MemperolehSalinan;
diff --git a/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/page.tsx b/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/page.tsx
index bab23af5..468e8d17 100644
--- a/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/page.tsx
+++ b/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/page.tsx
@@ -1,115 +1,57 @@
'use client'
-import { Box, Button, Group, Paper, SimpleGrid, Stack, TextInput, Title } from '@mantine/core';
-import { useProxy } from 'valtio/utils';
-import statePermohonanInformasi from '../../_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik';
-import JenisInformasi from './jenisInformasi';
-import MemperolehInformasi from './memperolehInformasi';
-import MemperolehSalinan from './memperolehSalinan';
import colors from '@/con/colors';
+import { Box, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Title } from '@mantine/core';
+import { useProxy } from 'valtio/utils';
+import { useShallowEffect } from '@mantine/hooks';
+import statepermohonanInformasiPublikForm from '../../_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik';
function Page() {
+ const permohonanInformasiPublikState = useProxy(statepermohonanInformasiPublikForm)
+ useShallowEffect(() => {
+ permohonanInformasiPublikState.statepermohonanInformasiPublik.findMany.load()
+ }, [])
+ if (!permohonanInformasiPublikState.statepermohonanInformasiPublik.findMany.data) return
+ {Array.from({ length: 10 }).map((v, k) => )}
+
+
return (
-
-
-
-
-
-
+
+
+
+ Permohonan Informasi Publik
+
+
+
+
+ No
+ Nama
+ NIK
+ Telepon
+ Email
+ Jenis Informasi
+ Cara Memperoleh Informasi
+ Cara Memperoleh Salinan Informasi
+
+
+
+ {permohonanInformasiPublikState.statepermohonanInformasiPublik.findMany.data?.map((item, index) => (
+
+ {index + 1}
+ {item.name}
+ {item.nik}
+ {item.notelp}
+ {item.email}
+ {item.jenisInformasiDiminta?.name}
+ {item.caraMemperolehInformasi?.name}
+ {item.caraMemperolehSalinanInformasi?.name}
+
+ ))}
+
+
+
+
);
}
-function PermohonanInformasiPublikCreate() {
- const permohonanInformasiPublikState = useProxy(statePermohonanInformasi)
- const submitForms = () => {
- // Tambahkan log untuk debugging
- console.log("Form data sebelum submit:", {
- name: permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.name,
- nik: permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.nik,
- notelp: permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.notelp,
- alamat: permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.alamat,
- email: permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.email,
- jenisInformasiDimintaId: permohonanInformasiPublikState.jenisInformasiDiminta,
- caraMemperolehInformasiId: permohonanInformasiPublikState.caraMemperolehInformasi,
- caraMemperolehSalinanInformasiId: permohonanInformasiPublikState.caraMemperolehSalinanInformasi
- });
-
- if (permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.name &&
- permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.nik &&
- permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.notelp &&
- permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.alamat &&
- permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.email &&
- permohonanInformasiPublikState.jenisInformasiDiminta &&
- permohonanInformasiPublikState.caraMemperolehInformasi &&
- permohonanInformasiPublikState.caraMemperolehSalinanInformasi) {
- permohonanInformasiPublikState.permohonanInformasiPublikForm.create.create()
- } else {
- console.log("Validasi gagal, form tidak lengkap");
- // Tampilkan pesan error ke pengguna di sini
- }
- }
- return (
-
-
-
- Permohonan Informasi Publik
- {
- permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.name = val.target.value
- }}
- />
- {
- permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.nik = val.target.value
- }}
- />
- {
- permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.notelp = val.target.value
- }}
- />
- {
- permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.alamat = val.target.value
- }}
- />
- {
- permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.email = val.target.value
- }}
- />
- {
- permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.jenisInformasiDimintaId = val.id
- }}
- />
- {
- permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.caraMemperolehInformasiId = val.id
- }}
- />
- {
- permohonanInformasiPublikState.permohonanInformasiPublikForm.create.form.caraMemperolehSalinanInformasiId = val.id
- }}
- />
-
- Submit
-
-
-
-
- )
-}
-
export default Page;
\ No newline at end of file
diff --git a/src/app/admin/(dashboard)/ppid/permohonan-keberatan-informasi-publik/page.tsx b/src/app/admin/(dashboard)/ppid/permohonan-keberatan-informasi-publik/page.tsx
index e416f772..a367b20d 100644
--- a/src/app/admin/(dashboard)/ppid/permohonan-keberatan-informasi-publik/page.tsx
+++ b/src/app/admin/(dashboard)/ppid/permohonan-keberatan-informasi-publik/page.tsx
@@ -1,73 +1,12 @@
'use client'
import colors from '@/con/colors';
-import { Box, Button, Group, Paper, SimpleGrid, Skeleton, Stack, Text, TextInput, Title } from '@mantine/core';
-import React from 'react';
+import { Box, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Title } from '@mantine/core';
+import { useShallowEffect } from '@mantine/hooks';
import { useProxy } from 'valtio/utils';
import statePermohonanKeberatan from '../../_state/ppid/permohonan_keberatan_informasi_publik/permohonanKeberatanInformasi';
-import { useShallowEffect } from '@mantine/hooks';
function Page() {
- return (
-
-
-
-
-
-
- );
-}
-
-function PermohonanKeberatanInformasiCreate() {
- const state = useProxy(statePermohonanKeberatan.permohonanKeberatanInformasiForm)
- const submit = () => {
- if (state.create.form.name && state.create.form.email && state.create.form.notelp && state.create.form.alasan) {
- state.create.create()
- }
- }
- return (
-
-
-
- Permohonan Keberatan Informasi Publik
- {
- state.create.form.name = val.target.value
- }}
- />
- {
- state.create.form.email = val.target.value
- }}
- />
- {
- state.create.form.notelp = val.target.value
- }}
- />
- {
- state.create.form.alasan = val.target.value
- }}
- />
-
- Kirim Permohonan
-
-
-
-
- )
-}
-
-function PermohonanKeberatanInformasiList() {
- const listState = useProxy(statePermohonanKeberatan.permohonanKeberatanInformasiForm)
+ const listState = useProxy(statePermohonanKeberatan)
useShallowEffect(() => {
listState.findMany.load()
}, [])
@@ -75,24 +14,36 @@ function PermohonanKeberatanInformasiList() {
if (!listState.findMany.data) return
{Array.from({ length: 10 }).map((v, k) => )}
-
return (
Permohonan Keberatan Informasi Publik
- {listState.findMany.data?.map((item) => (
-
- Nama: {item.name}
- Email: {item.email}
- Telepon: {item.notelp}
- Alasan: {item.alasan}
-
- ))}
+
+
+
+ No
+ Nama
+ Email
+ Telepon
+ Alasan
+
+
+
+ {listState.findMany.data?.map((item, index) => (
+
+ {index + 1}
+ {item.name}
+ {item.email}
+ {item.notelp}
+
+
+ ))}
+
+
- )
+ );
}
-
export default Page;
diff --git a/src/app/admin/(dashboard)/ppid/profile-ppid/biodata/page.tsx b/src/app/admin/(dashboard)/ppid/profile-ppid/biodata/page.tsx
index 681e01e2..bde2d57d 100644
--- a/src/app/admin/(dashboard)/ppid/profile-ppid/biodata/page.tsx
+++ b/src/app/admin/(dashboard)/ppid/profile-ppid/biodata/page.tsx
@@ -1,18 +1,18 @@
'use client'
import { Box, Group, Text } from '@mantine/core';
-import React, { useState } from 'react';
+import { useState } from 'react';
+import ApiFetch from '@/lib/api-fetch';
+import { Dropzone, MIME_TYPES } from '@mantine/dropzone';
+import { IconPhoto, IconUpload, IconX } from '@tabler/icons-react';
import { useProxy } from 'valtio/utils';
import stateProfilePPID from '../../../_state/ppid/profile_ppid/profile_PPID';
import { PPIDTextEditor } from '../../_com/PPIDTextEditor';
-import { Dropzone, MIME_TYPES } from '@mantine/dropzone';
-import { IconUpload, IconX, IconPhoto } from '@tabler/icons-react';
-import ApiFetch from '@/lib/api-fetch';
-
function Biodata() {
const biodataState = useProxy(stateProfilePPID)
const [loading, setLoading] = useState(false);
+
return (
Biodata
+
+
+
-
);
}
-export default Biodata;
+export default Biodata;
\ No newline at end of file
diff --git a/src/app/admin/(dashboard)/ppid/profile-ppid/listPage.tsx b/src/app/admin/(dashboard)/ppid/profile-ppid/listPage.tsx
index c3f70613..84d7c3ec 100644
--- a/src/app/admin/(dashboard)/ppid/profile-ppid/listPage.tsx
+++ b/src/app/admin/(dashboard)/ppid/profile-ppid/listPage.tsx
@@ -25,19 +25,16 @@ function ProfileList() {
List Profile PPID
{dataArray.map((item) => (
-
- Gambar
- {item.imageUrl ? (
+ {item.imageUrl && (
+
+ Preview Gambar:
- ) : (
- Belum ada foto
- )}
-
+
+ )}
Nama
diff --git a/src/app/api/[[...slugs]]/_lib/desa/index.ts b/src/app/api/[[...slugs]]/_lib/desa/index.ts
index 6a57017e..2e36383f 100644
--- a/src/app/api/[[...slugs]]/_lib/desa/index.ts
+++ b/src/app/api/[[...slugs]]/_lib/desa/index.ts
@@ -1,9 +1,11 @@
import Elysia from "elysia";
import Berita from "./berita";
import Pengumuman from "./pengumuman";
+import ProfileDesa from "./profile/profile_desa";
const Desa = new Elysia({ prefix: "/api/desa", tags: ["Desa"] })
.use(Berita)
.use(Pengumuman)
+ .use(ProfileDesa)
export default Desa;
diff --git a/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/find-many.ts b/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/find-many.ts
new file mode 100644
index 00000000..4fb0d3b0
--- /dev/null
+++ b/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/find-many.ts
@@ -0,0 +1,12 @@
+import prisma from "@/lib/prisma";
+
+export default async function profileDesaFindMany() {
+ const res = await prisma.profileDesa.findMany({
+ include: {
+ ProfilPerbekel: true,
+ },
+ });
+ return {
+ data: res,
+ };
+}
diff --git a/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/index.ts b/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/index.ts
new file mode 100644
index 00000000..9c9bbef8
--- /dev/null
+++ b/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/index.ts
@@ -0,0 +1,51 @@
+import Elysia, { t } from "elysia";
+import profileDesaFindMany from "./find-many";
+import lambangDesaUpdate from "./lambangDesa";
+import maskotDesaUpdate from "./maskotDesa";
+import profilePerbekelUpdate from "./profilePerbekel";
+import sejarahDesaUpdate from "./sejarahDesa";
+import visimisiDesaUpdate from "./visimisiDesa";
+
+const ProfileDesa = new Elysia({
+ prefix: "/profile",
+ tags: ["Desa/Profile"]
+})
+.get("/find-many", profileDesaFindMany)
+.post("/profilePerbekel/update", profilePerbekelUpdate, {
+ body: t.Object({
+ id: t.String(),
+ biodata: t.String(),
+ pengalaman: t.String(),
+ pengalamanOrganisasi: t.String(),
+ programUnggulan: t.String(),
+ })
+})
+.post("/visimisiDesa/update", visimisiDesaUpdate, {
+ body: t.Object({
+ id: t.String(),
+ visi: t.String(),
+ misi: t.String(),
+ })
+})
+.post("/sejarahDesa/update", sejarahDesaUpdate, {
+ body: t.Object({
+ id: t.String(),
+ sejarah: t.String(),
+ })
+})
+.post("/lambangDesa/update", lambangDesaUpdate, {
+ body: t.Object({
+ id: t.String(),
+ lambang: t.String(),
+ })
+})
+.post("/maskotDesa/update", maskotDesaUpdate, {
+ body: t.Object({
+ id: t.String(),
+ maskot: t.String(),
+ })
+})
+
+
+
+export default ProfileDesa
diff --git a/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/lambangDesa.ts b/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/lambangDesa.ts
new file mode 100644
index 00000000..34f1c992
--- /dev/null
+++ b/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/lambangDesa.ts
@@ -0,0 +1,28 @@
+import prisma from "@/lib/prisma";
+import { Prisma } from "@prisma/client";
+import { Context } from "elysia";
+
+type FormCreate = Prisma.ProfileDesaGetPayload<{
+ select: {
+ id: true;
+ lambang: true;
+ }
+}>
+
+export default async function lambangDesaUpdate(context: Context) {
+ const body = context.body as FormCreate;
+
+ await prisma.profileDesa.update({
+ where: {
+ id: body.id
+ },
+ data: {
+ lambang: body.lambang,
+ }
+ })
+
+ return {
+ success: true,
+ message: "Profile Desa Berhasil Diupdate",
+ }
+}
\ No newline at end of file
diff --git a/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/maskotDesa.ts b/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/maskotDesa.ts
new file mode 100644
index 00000000..a94ff33c
--- /dev/null
+++ b/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/maskotDesa.ts
@@ -0,0 +1,29 @@
+import prisma from "@/lib/prisma";
+import { Prisma } from "@prisma/client";
+import { Context } from "elysia";
+
+type FormCreate = Prisma.ProfileDesaGetPayload<{
+ select: {
+ id: true;
+ maskot: true;
+ }
+}>
+
+export default async function maskotDesaUpdate(context: Context) {
+ const body = context.body as FormCreate;
+
+ await prisma.profileDesa.update({
+ where: {
+ id: body.id
+ },
+ data: {
+ maskot: body.maskot,
+ }
+ })
+
+ return {
+ success: true,
+ message: "Profile Desa Berhasil Diupdate",
+ }
+}
+
\ No newline at end of file
diff --git a/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/profilePerbekel.ts b/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/profilePerbekel.ts
new file mode 100644
index 00000000..7b81bfda
--- /dev/null
+++ b/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/profilePerbekel.ts
@@ -0,0 +1,33 @@
+import prisma from "@/lib/prisma";
+import { Prisma } from "@prisma/client";
+import { Context } from "elysia";
+
+type FormCreate = Prisma.ProfilPerbekelGetPayload<{
+ select: {
+ id: true;
+ biodata: true;
+ pengalaman: true;
+ pengalamanOrganisasi: true;
+ programUnggulan: true;
+ }
+}>
+export default async function profilePerbekelUpdate(context: Context) {
+ const body = context.body as FormCreate;
+
+ await prisma.profilPerbekel.update({
+ where: {
+ id: body.id
+ },
+ data: {
+ biodata: body.biodata,
+ pengalaman: body.pengalaman,
+ pengalamanOrganisasi: body.pengalamanOrganisasi,
+ programUnggulan: body.programUnggulan,
+ }
+ })
+
+ return {
+ success: true,
+ message: "Profile Perbekel Berhasil Diupdate",
+ }
+}
\ No newline at end of file
diff --git a/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/sejarahDesa.ts b/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/sejarahDesa.ts
new file mode 100644
index 00000000..316ebc6f
--- /dev/null
+++ b/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/sejarahDesa.ts
@@ -0,0 +1,29 @@
+import prisma from "@/lib/prisma";
+import { Prisma } from "@prisma/client";
+import { Context } from "elysia";
+
+type FormCreate = Prisma.ProfileDesaGetPayload<{
+ select: {
+ id: true;
+ sejarah: true;
+ }
+}>
+
+export default async function sejarahDesaUpdate(context: Context) {
+ const body = context.body as FormCreate;
+
+ await prisma.profileDesa.update({
+ where: {
+ id: body.id
+ },
+ data: {
+ sejarah: body.sejarah,
+ }
+ })
+
+ return {
+ success: true,
+ message: "Profile Desa Berhasil Diupdate",
+ }
+}
+
\ No newline at end of file
diff --git a/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/visimisiDesa.ts b/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/visimisiDesa.ts
new file mode 100644
index 00000000..a7dedf4d
--- /dev/null
+++ b/src/app/api/[[...slugs]]/_lib/desa/profile/profile_desa/visimisiDesa.ts
@@ -0,0 +1,29 @@
+import prisma from "@/lib/prisma";
+import { Prisma } from "@prisma/client";
+import { Context } from "elysia";
+
+type FormCreate = Prisma.ProfileDesaGetPayload<{
+ select: {
+ id: true;
+ visi: true;
+ misi: true;
+ }
+}>
+export default async function visimisiDesaUpdate(context: Context) {
+ const body = context.body as FormCreate;
+
+ await prisma.profileDesa.update({
+ where: {
+ id: body.id
+ },
+ data: {
+ visi: body.visi,
+ misi: body.misi,
+ }
+ })
+
+ return {
+ success: true,
+ message: "Profile Desa Berhasil Diupdate",
+ }
+}
diff --git a/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/create.ts b/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/create.ts
index 79a95c98..252c10f0 100644
--- a/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/create.ts
+++ b/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/create.ts
@@ -11,9 +11,12 @@ type FormCreate = Prisma.DaftarInformasiPublikGetPayload<{
}>
export default async function daftarInformasiPublikCreate(context: Context) {
const body = context.body as FormCreate;
-
+ const jumlahData = await prisma.daftarInformasiPublik.count({
+ where: { isActive: true }, // hitung data aktif aja
+ })
await prisma.daftarInformasiPublik.create({
data: {
+ nomor: jumlahData + 1,
jenisInformasi: body.jenisInformasi,
deskripsi: body.deskripsi,
tanggal: body.tanggal,
diff --git a/src/app/api/[[...slugs]]/_lib/ppid/permohonan_informasi_publik/create.ts b/src/app/api/[[...slugs]]/_lib/ppid/permohonan_informasi_publik/create.ts
index 21932013..4cc99f88 100644
--- a/src/app/api/[[...slugs]]/_lib/ppid/permohonan_informasi_publik/create.ts
+++ b/src/app/api/[[...slugs]]/_lib/ppid/permohonan_informasi_publik/create.ts
@@ -26,6 +26,7 @@ export default async function permohonanInformasiPublikCreate(context: Context)
alamat: body.alamat,
jenisInformasiDimintaId: body.jenisInformasiDimintaId,
caraMemperolehInformasiId: body.caraMemperolehInformasiId,
+ caraMemperolehSalinanInformasiId: body.caraMemperolehSalinanInformasiId,
}
})
diff --git a/src/app/api/[[...slugs]]/_lib/ppid/permohonan_informasi_publik/find-many.ts b/src/app/api/[[...slugs]]/_lib/ppid/permohonan_informasi_publik/find-many.ts
index dd3d6770..f8f32d41 100644
--- a/src/app/api/[[...slugs]]/_lib/ppid/permohonan_informasi_publik/find-many.ts
+++ b/src/app/api/[[...slugs]]/_lib/ppid/permohonan_informasi_publik/find-many.ts
@@ -1,7 +1,13 @@
import prisma from "@/lib/prisma";
export default async function permohonanInformasiPublikFindMany() {
- const res = await prisma.permohonanInformasiPublik.findMany();
+ const res = await prisma.permohonanInformasiPublik.findMany({
+ include: {
+ jenisInformasiDiminta: true,
+ caraMemperolehInformasi: true,
+ caraMemperolehSalinanInformasi: true,
+ }
+ });
return {
data: res,
};
diff --git a/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx b/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx
index 82768a10..ba894c94 100644
--- a/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx
+++ b/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx
@@ -1,50 +1,27 @@
+'use client'
+import stateDaftarInformasiPublik from '@/app/admin/(dashboard)/_state/ppid/daftar_informasi_publik/daftarInformasiPublik';
import colors from '@/con/colors';
-import { Stack, Box, Text, Center, Image, TextInput, TableTd, TableTr, TableTbody, TableTh, TableThead, Table, ActionIcon } from '@mantine/core';
-import React from 'react';
+import { Box, Center, Image, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, TextInput } from '@mantine/core';
+import { useShallowEffect } from '@mantine/hooks';
+import { IconSearch } from '@tabler/icons-react';
+import { useProxy } from 'valtio/utils';
import BackButton from '../../desa/layanan/_com/BackButto';
-import { IconDownload, IconSearch } from '@tabler/icons-react';
-const dataTable = [
- {
- id: 1,
- nomer: '1',
- jenis: "Peraturan Desa",
- deskripsi: "Dokumen yang berisi kebijakan dan regulasi desa",
- tanggal: "15 Januari 2024",
- unduh:
- },
- {
- id: 2,
- nomer: '2',
- jenis: "Laporan Keuangan",
- deskripsi: "Laporan Kegunaan anggaran desa secara transparan",
- tanggal: "20 Januari 2024",
- unduh:
- },
- {
- id: 3,
- nomer: '3',
- jenis: "Program & Kegiatan",
- deskripsi: "Informasi mengenai program pembangunan & kegiatan desa",
- tanggal: "30 Januari 2024",
- unduh:
- },
-
-]
function Page() {
- const rows = dataTable.map((element) => (
-
- {element.nomer}
- {element.jenis}
- {element.deskripsi}
- {element.tanggal}
-
-
- {element.unduh}
-
-
-
- ))
+ const listData = useProxy(stateDaftarInformasiPublik.daftarInformasi)
+ useShallowEffect(() => {
+ listData.findMany.load()
+ }, [])
+ if (!listData.findMany.data) return
+
+
+
+
+
+
+
+
+
return (
@@ -71,10 +48,18 @@ function Page() {
Jenis Informasi
Deskripsi
Tanggal Publikasi
- Unduh
- {rows}
+
+ {listData.findMany.data?.map((item) => (
+
+ {item.nomor}
+ {item.jenisInformasi}
+
+ {item.tanggal}
+
+ ))}
+
Kontak PPID
diff --git a/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin/page.tsx b/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin/page.tsx
new file mode 100644
index 00000000..977ec842
--- /dev/null
+++ b/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin/page.tsx
@@ -0,0 +1,87 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+'use client'
+import React, { useEffect, useState } from 'react';
+import { Box, Center, Flex, Skeleton, Stack, Text, Title } from '@mantine/core';
+import { Cell, Pie, PieChart } from 'recharts';
+import colors from '@/con/colors';
+import { useShallowEffect } from '@mantine/hooks';
+import { useProxy } from 'valtio/utils';
+import stateGrafikBerdasarkanJenisKelamin from '@/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanJenisKelamin';
+
+function GrafikBerdasarkanJenisKelamin() {
+ const grafikBerdasarkanJenisKelamin = useProxy(stateGrafikBerdasarkanJenisKelamin.grafikBerdasarkanJenisKelamin)
+ const [mounted, setMounted] = useState(false);
+ const [donutData, setDonutData] = useState([]);
+
+ useEffect(() => {
+ setMounted(true);
+ }, [])
+
+ const updateChartData = (data: any) => {
+ if (data && data.length > 0) {
+ const totalLaki = data.reduce((acc: number, cur: any) => acc + Number(cur.laki || 0), 0);
+ const totalPerempuan = data.reduce((acc: number, cur: any) => acc + Number(cur.perempuan || 0), 0);
+
+ setDonutData([
+ { name: 'Laki-laki', value: totalLaki, color: colors['blue-button'], key: 'laki-laki' },
+ { name: 'Perempuan', value: totalPerempuan, color: '#FF6384', key: 'perempuan' }
+ ]);
+ }
+ };
+
+ useShallowEffect(() => {
+ fetchData();
+ }, []);
+
+ const fetchData = async () => {
+ await grafikBerdasarkanJenisKelamin.findMany.load();
+ if (grafikBerdasarkanJenisKelamin.findMany.data) {
+ updateChartData(grafikBerdasarkanJenisKelamin.findMany.data);
+ }
+ };
+
+ if(!grafikBerdasarkanJenisKelamin.findMany.data) return
+ Grafik Berdasarkan Jenis Kelamin Responden
+
+
+
+ return (
+
+ Grafik Berdasarkan Jenis Kelamin Responden
+ {mounted && donutData.length > 0 && (
+
+
+
+
+
+ {donutData.map((entry, index) => (
+ |
+ ))}
+
+
+
+
+
+ Perempuan: {donutData.find((entry) => entry.name === 'Perempuan')?.value}
+
+
+
+ Laki-laki: {donutData.find((entry) => entry.name === 'Laki-laki')?.value}
+
+
+ )}
+
+ );
+}
+
+export default GrafikBerdasarkanJenisKelamin;
diff --git a/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_pilihan_responden/page.tsx b/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_pilihan_responden/page.tsx
new file mode 100644
index 00000000..57a14c08
--- /dev/null
+++ b/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_pilihan_responden/page.tsx
@@ -0,0 +1,96 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+'use client'
+import stateGrafikResponden from '@/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanResponden';
+import colors from '@/con/colors';
+import { Stack, Title, Box, Center, Flex, Text, Skeleton } from '@mantine/core';
+import { useShallowEffect } from '@mantine/hooks';
+import React, { useEffect, useState } from 'react';
+import { PieChart, Pie, Cell } from 'recharts';
+import { useProxy } from 'valtio/utils';
+
+function GrafikBerdasarkanResponden() {
+ const grafikBerdasarkanResponden = useProxy(stateGrafikResponden.grafikBerdasarkanResponden)
+ const [donutData, setDonutData] = useState([]);
+ const [mounted, setMounted] = useState(false);
+
+ useEffect(() => {
+ setMounted(true);
+ }, [])
+
+ const updateChartData = (data: any) => {
+ if (data && data.length > 0) {
+ const totalSangatBaik = data.reduce((acc: number, cur: any) => acc + Number(cur.sangatbaik || 0), 0);
+ const totalBaik = data.reduce((acc: number, cur: any) => acc + Number(cur.baik || 0), 0);
+ const totalKurangBaik = data.reduce((acc: number, cur: any) => acc + Number(cur.kurangbaik || 0), 0);
+ const totalTidakBaik = data.reduce((acc: number, cur: any) => acc + Number(cur.tidakbaik || 0), 0);
+ setDonutData([
+ { name: 'sangatbaik', value: totalSangatBaik, color: colors['blue-button'], key: 'sangatbaik' },
+ { name: 'baik', value: totalBaik, color: '#10A85AFF', key: 'baik' },
+ { name: 'kurangbaik', value: totalKurangBaik, color: '#B3AA12FF', key: 'kurangbaik' },
+ { name: 'tidakbaik', value: totalTidakBaik, color: '#B21313FF', key: 'tidakbaik' }
+ ]);
+ }
+ };
+
+ useShallowEffect(() => {
+ fetchData();
+ }, []);
+
+ const fetchData = async () => {
+ await grafikBerdasarkanResponden.findMany.load();
+ if (grafikBerdasarkanResponden.findMany.data) {
+ updateChartData(grafikBerdasarkanResponden.findMany.data);
+ }
+ };
+
+ if (!grafikBerdasarkanResponden.findMany.data) return
+ Grafik Berdasarkan Responden
+
+
+ return (
+
+ Grafik Berdasarkan Responden
+ {mounted && donutData.length > 0 && (
+
+
+
+
+ {donutData.map((entry, index) => (
+ |
+ ))}
+
+
+
+
+
+ Sangat Baik: {donutData.find((entry) => entry.name === 'sangatbaik')?.value}
+
+
+
+ Baik: {donutData.find((entry) => entry.name === 'baik')?.value}
+
+
+
+ Kurang Baik: {donutData.find((entry) => entry.name === 'kurangbaik')?.value}
+
+
+
+ Tidak Baik: {donutData.find((entry) => entry.name === 'tidakbaik')?.value}
+
+
+ )}
+
+ );
+}
+
+export default GrafikBerdasarkanResponden;
diff --git a/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_umur_responden/page.tsx b/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_umur_responden/page.tsx
new file mode 100644
index 00000000..e1786eaa
--- /dev/null
+++ b/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_umur_responden/page.tsx
@@ -0,0 +1,97 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+'use client'
+import stateGrafikBerdasarkanUmur from '@/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanUmur';
+import colors from '@/con/colors';
+import { Stack, Title, Box, Center, Flex, Text, Skeleton } from '@mantine/core';
+import { useShallowEffect } from '@mantine/hooks';
+import React, { useEffect, useState } from 'react';
+import { PieChart, Pie, Cell } from 'recharts';
+import { useProxy } from 'valtio/utils';
+
+function GrafikBerdasarakanUmur() {
+ const grafikBerdasarkanUmur = useProxy(stateGrafikBerdasarkanUmur.grafikBerdasarkanUmur)
+ const [donutData, setDonutData] = useState([]);
+ const [mounted, setMounted] = useState(false);
+
+ useEffect(() => {
+ setMounted(true);
+ }, []);
+
+ const updateChartData = (data: any) => {
+ if (data && data.length > 0) {
+ const totalRemaja = data.reduce((acc: number, cur: any) => acc + Number(cur.remaja || 0), 0);
+ const totalDewasa = data.reduce((acc: number, cur: any) => acc + Number(cur.dewasa || 0), 0);
+ const totalOrangtua = data.reduce((acc: number, cur: any) => acc + Number(cur.orangtua || 0), 0);
+ const totalLansia = data.reduce((acc: number, cur: any) => acc + Number(cur.lansia || 0), 0);
+
+ setDonutData([
+ { name: 'Remaja', value: totalRemaja, color: colors['blue-button'], key: 'remaja' },
+ { name: 'Dewasa', value: totalDewasa, color: '#D32711FF', key: 'dewasa' },
+ { name: 'Orangtua', value: totalOrangtua, color: '#B46B04FF', key: 'orangtua' },
+ { name: 'Lansia', value: totalLansia, color: '#038617FF', key: 'lansia' }
+ ]);
+ }
+ };
+
+ useShallowEffect(() => {
+ fetchData();
+ }, []);
+
+ const fetchData = async () => {
+ await grafikBerdasarkanUmur.findMany.load();
+ if (grafikBerdasarkanUmur.findMany.data) {
+ updateChartData(grafikBerdasarkanUmur.findMany.data);
+ }
+ }
+
+ if(!grafikBerdasarkanUmur.findMany.data) return
+ Grafik Berdasarkan Umur Responden
+
+
+ return (
+
+ Grafik Berdasarkan Umur Responden
+ {mounted && donutData.length > 0 && (
+
+
+
+
+ {donutData.map((entry, index) => (
+ |
+ ))}
+
+
+
+
+
+ 17 - 25 tahun: {donutData.find((entry) => entry.name === 'remaja')?.value}
+
+
+
+ 26 - 45 tahun: {donutData.find((entry) => entry.name === 'dewasa')?.value}
+
+
+
+ 46 - 60 tahun: {donutData.find((entry) => entry.name === 'orangtua')?.value}
+
+
+
+ di atas 60 tahun: {donutData.find((entry) => entry.name === 'lansia')?.value}
+
+
+ )}
+
+ );
+}
+
+export default GrafikBerdasarakanUmur;
diff --git a/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/grafik_hasil_kepuasan_masyarakat/page.tsx b/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/grafik_hasil_kepuasan_masyarakat/page.tsx
new file mode 100644
index 00000000..d504cbb1
--- /dev/null
+++ b/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/grafik_hasil_kepuasan_masyarakat/page.tsx
@@ -0,0 +1,57 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+'use client'
+import stateGrafikHasilKepuasanMasyarakat from '@/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikHasilKepuasan';
+import colors from '@/con/colors';
+import { Box, Skeleton, Stack, Text, Title } from '@mantine/core';
+import { useMediaQuery, useShallowEffect } from '@mantine/hooks';
+import React, { useEffect, useState } from 'react';
+import { BarChart, Tooltip, XAxis, YAxis, Legend, Bar } from 'recharts';
+import { useProxy } from 'valtio/utils';
+
+function GrafikHasilKepuasan() {
+ const grafikHasilKepuasan = useProxy(stateGrafikHasilKepuasanMasyarakat.grafikHasilKepuasanMasyarakat)
+ const [chartData, setChartData] = useState([]);
+ const [mounted, setMounted] = useState(false);
+ const isTablet = useMediaQuery('(max-width: 1024px)')
+ const isMobile = useMediaQuery('(max-width: 768px)')
+
+ useEffect(() => {
+ setMounted(true);
+ }, [])
+
+ useShallowEffect(() => {
+ const fetchData = async () => {
+ await grafikHasilKepuasan.findMany.load();
+ if (grafikHasilKepuasan.findMany.data && grafikHasilKepuasan.findMany.data.length > 0) {
+ setChartData(grafikHasilKepuasan.findMany.data);
+ }
+ };
+ fetchData();
+ }, []);
+
+ if(!grafikHasilKepuasan.findMany.data) return
+ Grafik Hasil Kepuasan Masyarakat Terhadap Pelayanan Publik
+
+
+
+ return (
+
+
+ Grafik Hasil Kepuasan Masyarakat Terhadap Pelayanan Publik
+
+
+ {mounted && chartData.length > 0 && (
+
+
+
+
+
+
+
+ )}
+
+
+ );
+}
+
+export default GrafikHasilKepuasan;
diff --git a/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/page.tsx b/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/page.tsx
index 5f20eafc..13ffbee0 100644
--- a/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/page.tsx
+++ b/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/page.tsx
@@ -1,38 +1,11 @@
import colors from '@/con/colors';
-import { Stack, Box, Paper, Text, Center, Flex, ColorSwatch, } from '@mantine/core';
-import React from 'react';
+import { Box, Paper, Stack, Text } from '@mantine/core';
import BackButton from '../../desa/layanan/_com/BackButto';
-import { BarChart, DonutChart } from '@mantine/charts';
+import GrafikBerdasarkanJenisKelamin from './grafik_berdasarkan_jenis_kelamin/page';
+import GrafikBerdasarkanResponden from './grafik_berdasarkan_pilihan_responden/page';
+import GrafikBerdasarakanUmur from './grafik_berdasarkan_umur_responden/page';
+import GrafikHasilKepuasan from './grafik_hasil_kepuasan_masyarakat/page';
-const dataBar = [
- { pelayanan: 'Persyaratan', kepuasan: 90 },
- { pelayanan: 'Prosedur', kepuasan: 98 },
- { pelayanan: 'Kecepatan', kepuasan: 92 },
- { pelayanan: 'Biaya / Tarif', kepuasan: 85 },
- { pelayanan: 'Produk Layanan', kepuasan: 89 },
- { pelayanan: 'Kompetensi Pelaksana', kepuasan: 91 },
- { pelayanan: 'Perilaku Pelaksana', kepuasan: 90 },
- { pelayanan: 'Penanganan Pengaduan', kepuasan: 93 },
- { pelayanan: 'Sarana dan Prasarana', kepuasan: 91 },
-]
-const dataJenisKelamin = [
- { name: 'Perempuan', value: 90, color: '#3291CB' },
- { name: 'Laki - Laki', value: 10, color: colors['blue-button'] },
-]
-const dataResponden = [
- { name: 'Sangat Baik', value: 60, color: 'green' },
- { name: 'Baik', value: 20, color: 'blue' },
- { name: 'Kurang Baik', value: 10, color: 'orange' },
- { name: 'Tidak Baik', value: 10, color: 'red' },
-
-]
-const dataUmur = [
- { name: '17 - 25 tahun', value: 60, color: 'green' },
- { name: '26 - 45 tahun', value: 20, color: 'blue' },
- { name: '46 - 60 tahun', value: 10, color: 'orange' },
- { name: 'di atas 60 tahun', value: 10, color: 'red' },
-
-]
function Page() {
return (
@@ -48,116 +21,23 @@ function Page() {
-
-
- Grafik Hasil Kepuasan Masyarakat Terhadap Pelayanan Publik
-
-
+
+
-
- Grafik Berdasarkan Jenis Kelamin Responden
-
-
-
-
-
-
-
- Perempuan
-
-
-
-
-
- Laki - Laki
-
-
-
-
+
-
- Grafik Berdasarkan Pilihan Responden
-
-
-
-
-
-
-
- Sangat Baik
-
-
-
-
-
- Baik
-
-
-
-
-
- Kurang Baik
-
-
-
-
-
- Tidak Baik
-
-
-
-
+
-
- Grafik Berdasarkan Umur Responden
-
-
-
-
-
-
-
- 17 – 25 tahun
-
-
-
-
-
- 26 – 45 tahun
-
-
-
-
-
- 46 – 60 tahun
-
-
-
-
-
- di atas 60 tahun
-
-
-
-
+
diff --git a/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/jenis_infromasi/jenisInformasiSelector.tsx b/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/jenis_infromasi/jenisInformasiSelector.tsx
new file mode 100644
index 00000000..3b81266f
--- /dev/null
+++ b/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/jenis_infromasi/jenisInformasiSelector.tsx
@@ -0,0 +1,48 @@
+// components/jenisInformasiSelector.tsx
+'use client';
+import { Skeleton, Group, Select } from '@mantine/core';
+import { useShallowEffect } from '@mantine/hooks';
+import { Prisma } from '@prisma/client';
+import React from 'react';
+import { useProxy } from 'valtio/utils';
+import statePermohonanInformasi from '@/app/admin/(dashboard)/_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik';
+
+export default function JenisInformasiSelector({ onChange }: {
+ onChange: (value: Prisma.JenisInformasiDimintaGetPayload<{
+ select: {
+ id: true;
+ name: true
+ }
+ }>) => void;
+}) {
+ const jenisInformasiState = useProxy(statePermohonanInformasi);
+
+ useShallowEffect(() => {
+ jenisInformasiState.jenisInformasiDiminta.findMany.load();
+ }, []);
+
+ if (!jenisInformasiState.jenisInformasiDiminta.findMany.data) {
+ return ;
+ }
+
+ // Add a check for data before mapping
+ const data = jenisInformasiState.jenisInformasiDiminta.findMany.data;
+ if (!data) return ;
+
+ return (
+
+ ({
+ value: item.id,
+ label: item.name,
+ }))}
+ onChange={(v) => {
+ const selectedData = data.find((item) => item.id === v);
+ if (selectedData) onChange(selectedData);
+ }}
+ />
+
+ );
+}
diff --git a/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/memperoleh_informasi/memperolehInfromasi.tsx b/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/memperoleh_informasi/memperolehInfromasi.tsx
new file mode 100644
index 00000000..e521caf0
--- /dev/null
+++ b/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/memperoleh_informasi/memperolehInfromasi.tsx
@@ -0,0 +1,46 @@
+import statePermohonanInformasi from '@/app/admin/(dashboard)/_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik';
+import { Group, Select, Skeleton } from '@mantine/core';
+import { useShallowEffect } from '@mantine/hooks';
+import { Prisma } from '@prisma/client';
+import React from 'react';
+import { useProxy } from 'valtio/utils';
+
+function MemperolehInformasi({ onChange }: {
+ onChange: (value: Prisma.CaraMemperolehInformasiGetPayload<{
+ select: {
+ id: true,
+ name: true
+ }
+ }>) => void
+}) {
+ const memperolehInformasiState = useProxy(statePermohonanInformasi)
+
+ useShallowEffect(() => {
+ memperolehInformasiState.caraMemperolehInformasi.findMany.load()
+ }, [])
+
+ if (!memperolehInformasiState.caraMemperolehInformasi.findMany.data)
+ return
+
+ const data = memperolehInformasiState.caraMemperolehInformasi.findMany.data;
+ if (!data) return
+
+ return (
+
+ ({
+ value: item.id,
+ label: item.name,
+ }))}
+ onChange={(v) => {
+ const selectedData = data.find((item) => item.id === v);
+ if (selectedData) onChange(selectedData);
+ }}
+ />
+
+ );
+}
+
+export default MemperolehInformasi;
diff --git a/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/page.tsx b/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/page.tsx
index 229acb31..894e9110 100644
--- a/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/page.tsx
+++ b/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/page.tsx
@@ -1,123 +1,39 @@
'use client'
+import statePermohonanInformasi from '@/app/admin/(dashboard)/_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik';
import colors from '@/con/colors';
-import { ActionIcon, Box, Button, Center, Checkbox, Combobox, ComboboxOption, Group, Input, InputBase, Paper, SimpleGrid, Stack, Text, Textarea, TextInput, useCombobox } from '@mantine/core';
+import { ActionIcon, Box, Button, Center, Checkbox, Group, Paper, SimpleGrid, Stack, Text, TextInput } from '@mantine/core';
import { IconDownload } from '@tabler/icons-react';
-import BackButton from '../../desa/layanan/_com/BackButto';
import { useRouter } from 'next/navigation';
-import { useState } from 'react';
+import { useProxy } from 'valtio/utils';
+import BackButton from '../../desa/layanan/_com/BackButto';
+import JenisInformasiSelector from './jenis_infromasi/jenisInformasiSelector';
+import MemperolehInformasi from './memperoleh_informasi/memperolehInfromasi';
+import MemperolehSalinan from './salinan_informasi/salinanInformasi';
const data = [
- {
- id: 1,
- number: '1',
- title: "Langkah 1",
- desc: "Pemohon informasi publik mengajukan permohonan informasi kepada badan publik baik langsung maupun melalui surat elektronik",
- },
- {
- id: 2,
- number: '2',
- title: "Langkah 2",
- desc: "Isi formulir permohonan informasi dengan data diri (nama, alamat, telepon), jenis, format, dan cara penyampaian informasi, serta lampiran fotokopi kartu identitas.",
- },
- {
- id: 3,
- number: '3',
- title: "Langkah 3",
- desc: "PPID akan memproses permohonan sesuai dengan ketentuan",
- },
- {
- id: 4,
- number: '4',
- title: "Langkah 4",
- desc: "Petugas PPID menyampaikan informasi sesuai permohonan kepada pemohon informasi.",
- },
-]
+ { id: 1, number: '1', title: "Langkah 1", desc: "Pemohon informasi publik mengajukan permohonan informasi kepada badan publik baik langsung maupun melalui surat elektronik" },
+ { id: 2, number: '2', title: "Langkah 2", desc: "Isi formulir permohonan informasi dengan data diri (nama, alamat, telepon), jenis, format, dan cara penyampaian informasi, serta lampiran fotokopi kartu identitas." },
+ { id: 3, number: '3', title: "Langkah 3", desc: "PPID akan memproses permohonan sesuai dengan ketentuan" },
+ { id: 4, number: '4', title: "Langkah 4", desc: "Petugas PPID menyampaikan informasi sesuai permohonan kepada pemohon informasi." },
+];
-const jenisInformasi = [
- {
- id: 1,
- jenis: 'Keuangan Desa'
- },
- {
- id: 2,
- jenis: 'Pembangunan Desa'
- },
- {
- id: 3,
- jenis: 'Data Demografi'
- },
- {
- id: 4,
- jenis: 'Lainnya'
- },
-]
-
-const memperolehInformasi = [
- {
- id: 1,
- jenis: 'Melihat/Membaca/Mendengarkan/Mencatat'
- },
- {
- id: 2,
- jenis: 'Mendapatkan Salinan Informasi (Hardcopy)'
- },
- {
- id: 3,
- jenis: 'Mendapatkan Salinan Informasi (Softcopy)'
- }
-]
-
-const mendapatkanInformasi = [
- {
- id: 1,
- jenis: 'Mengambil Langsung'
- },
- {
- id: 2,
- jenis: 'Dikirim via Post'
- },
- {
- id: 3,
- jenis: 'Dikirim via Email'
- }
-]
function Page() {
- const combobox = useCombobox({
- onDropdownClose: () => combobox.resetSelectedOption(),
- });
+ const permohonanInformasiPublikState = useProxy(statePermohonanInformasi);
+ const router = useRouter();
- const combobox2 = useCombobox({
- onDropdownClose: () => combobox2.resetSelectedOption(),
- });
+ const submitForms = () => {
+ const { create } = permohonanInformasiPublikState.statepermohonanInformasiPublik;
- const combobox3 = useCombobox({
- onDropdownClose: () => combobox3.resetSelectedOption(),
- });
+ if (create.form.name && create.form.nik && create.form.notelp && create.form.alamat && create.form.email &&
+ create.form.jenisInformasiDimintaId && create.form.caraMemperolehInformasiId && create.form.caraMemperolehSalinanInformasiId) {
+ create.create();
+ router.push('/darmasaba/permohonan/berhasil');
+ } else {
+ console.log("Validasi gagal, form tidak lengkap");
+ // Display error message to user
+ }
+ };
- const [value, setValue] = useState(null);
- const [value2, setValue2] = useState(null);
- const [value3, setValue3] = useState(null);
-
-
-
- const options = jenisInformasi.map((item) => (
-
- {item.jenis}
-
- ))
-
- const options2 = memperolehInformasi.map((item) => (
-
- {item.jenis}
-
- ))
-
- const options3 = mendapatkanInformasi.map((item) => (
-
- {item.jenis}
-
- ))
- const router = useRouter()
return (
@@ -130,33 +46,20 @@ function Page() {
Tata Cara Permohonan
-
- {data.map((v, k) => {
- return (
-
-
-
-
- {v.number}
-
-
-
- {v.title}
-
-
- {v.desc}
-
-
-
- )
- })}
+
+ {data.map((v, k) => (
+
+
+
+
+ {v.number}
+
+
+ {v.title}
+ {v.desc}
+
+
+ ))}
}>
@@ -165,132 +68,45 @@ function Page() {
- Formulir Permohonan Informasi
-
-
-
-
-
-
- {/* ComboBox */}
-
- Jenis Informasi yang diminta
- {
- setValue(val);
- combobox.closeDropdown();
+
+ Formulir Permohonan Informasi
+ {
+ permohonanInformasiPublikState.statepermohonanInformasiPublik.create.form.name = val.target.value;
+ }} />
+ {
+ permohonanInformasiPublikState.statepermohonanInformasiPublik.create.form.nik = val.target.value;
+ }} />
+ {
+ permohonanInformasiPublikState.statepermohonanInformasiPublik.create.form.notelp = val.target.value;
+ }} />
+ {
+ permohonanInformasiPublikState.statepermohonanInformasiPublik.create.form.alamat = val.target.value;
+ }} />
+ {
+ permohonanInformasiPublikState.statepermohonanInformasiPublik.create.form.email = val.target.value;
+ }} />
+ {
+ permohonanInformasiPublikState.statepermohonanInformasiPublik.create.form.jenisInformasiDimintaId = val.id;
}}
- >
-
- }
- onClick={() => combobox.toggleDropdown()}
- rightSectionPointerEvents="none"
- >
- {value || --Pilih Jenis Informasi-- }
-
-
-
-
- {options}
-
-
-
-
- {/* ComboBox2 */}
-
- Cara Memperoleh Informasi
- {
- setValue2(val);
- combobox2.closeDropdown();
- }}
- >
-
- }
- onClick={() => combobox2.toggleDropdown()}
- rightSectionPointerEvents="none"
- >
- {value2 || --Pilih Cara Memperoleh-- }
-
-
-
-
- {options2}
-
-
-
- {/* ComboBox3 */}
-
- Cara Mendapatkan Salinan Informasi
- {
- setValue3(val);
- combobox3.closeDropdown();
- }}
- >
-
- }
- onClick={() => combobox3.toggleDropdown()}
- rightSectionPointerEvents="none"
- >
- {value3 || --Pilih Cara Mendapatkan-- }
-
-
-
-
- {options3}
-
-
-
-
-
-
- router.push('/darmasaba/permohonan/berhasil')} bg={"green"} fullWidth>
- Kirim Permohonan
-
+ {
+ permohonanInformasiPublikState.statepermohonanInformasiPublik.create.form.caraMemperolehInformasiId = val.id;
+ }}
+ />
+ {
+ permohonanInformasiPublikState.statepermohonanInformasiPublik.create.form.caraMemperolehSalinanInformasiId = val.id;
+ }}
+ />
+
+
+
+
+ Kirim Permohonan
+
+
@@ -300,4 +116,4 @@ function Page() {
);
}
-export default Page;
+export default Page;
\ No newline at end of file
diff --git a/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/salinan_informasi/salinanInformasi.tsx b/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/salinan_informasi/salinanInformasi.tsx
new file mode 100644
index 00000000..c88dda51
--- /dev/null
+++ b/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/salinan_informasi/salinanInformasi.tsx
@@ -0,0 +1,43 @@
+import statePermohonanInformasi from '@/app/admin/(dashboard)/_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik';
+import { Skeleton, Group, Select } from '@mantine/core';
+import { useShallowEffect } from '@mantine/hooks';
+import { Prisma } from '@prisma/client';
+import React from 'react';
+import { useProxy } from 'valtio/utils';
+
+function MemperolehSalinan({ onChange }: {
+ onChange: (value: Prisma.CaraMemperolehSalinanInformasiGetPayload<{
+ select: {
+ id: true,
+ name: true
+ }
+ }>) => void
+}) {
+ const memperolehSalinanInformasiState = useProxy(statePermohonanInformasi)
+ useShallowEffect(() => {
+ memperolehSalinanInformasiState.caraMemperolehSalinanInformasi.findMany.load()
+ }, [])
+
+ if (!memperolehSalinanInformasiState.caraMemperolehSalinanInformasi.findMany.data) return
+
+ const data = memperolehSalinanInformasiState.caraMemperolehSalinanInformasi.findMany.data
+ if (!data) return
+
+ return (
+
+ ({
+ value: item.id,
+ label: item.name,
+ }))}
+ onChange={(v) => {
+ const selectedData = data.find((item) => item.id === v);
+ if (selectedData) onChange(selectedData);
+ }}
+ />
+
+ );
+}
+export default MemperolehSalinan;
diff --git a/src/app/darmasaba/(pages)/ppid/permohonan-keberatan-informasi-publik/page.tsx b/src/app/darmasaba/(pages)/ppid/permohonan-keberatan-informasi-publik/page.tsx
index 691ebcd7..43a56543 100644
--- a/src/app/darmasaba/(pages)/ppid/permohonan-keberatan-informasi-publik/page.tsx
+++ b/src/app/darmasaba/(pages)/ppid/permohonan-keberatan-informasi-publik/page.tsx
@@ -1,9 +1,12 @@
'use client'
+import permohonanKeberatanInformasi from '@/app/admin/(dashboard)/_state/ppid/permohonan_keberatan_informasi_publik/permohonanKeberatanInformasi';
+import { PPIDTextEditor } from '@/app/admin/(dashboard)/ppid/_com/PPIDTextEditor';
import colors from '@/con/colors';
-import { Box, Button, Center, Group, Paper, SimpleGrid, Stack, Text, Textarea, TextInput } from '@mantine/core';
+import { Box, Button, Center, Group, Paper, SimpleGrid, Stack, Text, TextInput } from '@mantine/core';
import { IconFileCheck, IconForms, IconHourglassOff, IconPhoneRinging } from '@tabler/icons-react';
-import BackButton from '../../desa/layanan/_com/BackButto';
import { useRouter } from 'next/navigation';
+import { useProxy } from 'valtio/utils';
+import BackButton from '../../desa/layanan/_com/BackButto';
const data = [
{
@@ -32,6 +35,15 @@ const data = [
},
]
function Page() {
+ const stateKeberatan = useProxy(permohonanKeberatanInformasi)
+ const submit = () => {
+ if (stateKeberatan.create.form.name && stateKeberatan.create.form.email && stateKeberatan.create.form.notelp && stateKeberatan.create.form.alasan) {
+ stateKeberatan.create.create()
+ router.push('/darmasaba/permohonan/berhasil')
+ } else {
+ console.log("Validasi gagal, form tidak lengkap")
+ }
+ }
const router = useRouter();
return (
@@ -76,33 +88,41 @@ function Page() {
- Formulir Permohonan Keberatan
-
-
-
-
- router.push('/darmasaba/permohonan/berhasil')} bg={"green"} fullWidth>
- Kirim Permohonan
-
+
+ Formulir Permohonan Keberatan
+ {
+ stateKeberatan.create.form.name = val.target.value
+ }}
+ />
+ {
+ stateKeberatan.create.form.email = val.target.value
+ }}
+ />
+ {
+ stateKeberatan.create.form.notelp = val.target.value
+ }}
+ />
+ Alasan Permohonan Keberatan
+ {
+ stateKeberatan.create.form.alasan = val
+ }}
+
+ />
+
+ Kirim Permohonan
+
+
Kontak PPID