diff --git a/prisma/data/list-caraMemperolehInformasi.json b/prisma/data/list-caraMemperolehInformasi.json new file mode 100644 index 00000000..c3f7fdad --- /dev/null +++ b/prisma/data/list-caraMemperolehInformasi.json @@ -0,0 +1,5 @@ +[ + {"name": "Melihat/Membaca/Mendengarkan/Mencatat"}, + {"name": "Mendapatkan Salinan Informasi (Hardcopy)"}, + {"name": "Mendapatkan Salinan Informasi (Softcopy)"} +] \ No newline at end of file diff --git a/prisma/data/list-caraMemperolehSalinanInformasi.json b/prisma/data/list-caraMemperolehSalinanInformasi.json new file mode 100644 index 00000000..6587f648 --- /dev/null +++ b/prisma/data/list-caraMemperolehSalinanInformasi.json @@ -0,0 +1,5 @@ +[ + { "name": "Mengambil Langsung" }, + { "name": "Dikirim Via Post" }, + { "name": "Dikirim Via Email" } +] diff --git a/prisma/data/list-jenisInfromasi.json b/prisma/data/list-jenisInfromasi.json new file mode 100644 index 00000000..393523e8 --- /dev/null +++ b/prisma/data/list-jenisInfromasi.json @@ -0,0 +1,6 @@ +[ + { "name": "Keuangan Desa" }, + { "name": "Pembangunan Desa" }, + { "name": "Data Demografi" }, + { "name": "Lainnya" } +] diff --git a/prisma/data/ppid/profile-ppid/profilePPid.json b/prisma/data/ppid/profile-ppid/profilePPid.json new file mode 100644 index 00000000..04d71d97 --- /dev/null +++ b/prisma/data/ppid/profile-ppid/profilePPid.json @@ -0,0 +1,7 @@ +[ + {"name": "

I.B Surya Prabhawa Manuaba, S.H., M.H.

"}, + {"biodata" : "

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.

"}, + {"riwayat" : "

Riwayat Karir

"}, + {"pengalaman" : "

Pengalaman Organisasi

"}, + {"unggulan" : "

Program Kerja Unggulan

Pemberdayaan Ekonomi dan UMKM

Peningkatan Infrastruktur Desa

"} +] \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 96e49b8c..34be5b4e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -48,6 +48,39 @@ model AppMenuChild { } //========================================= MENU PPID ========================================= // +// ========================================= VISI MISI PPID ========================================= // +model VisiPPID { + id String @id @default(cuid()) + content String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} + +model MisiPPID { + id String @id @default(cuid()) + content String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} + +// ========================================= PROFILE PPID ========================================= // +model ProfilePPID { + id String @id @default(cuid()) + name String @unique + biodata String + riwayat String + pengalaman String + unggulan String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} + // ========================================= DAFTAR INFORMASI PUBLIK ========================================= // model DaftarInformasiPublik { id String @id @default(cuid()) @@ -61,7 +94,70 @@ model DaftarInformasiPublik { isActive Boolean @default(true) } -//========================================= MENU PPID ========================================= // +//=========================================PERMOHONAN INFORMASI PUBLIK========================= // +model PermohonanInformasiPublik { + id String @id @default(cuid()) + nomor Int @default(autoincrement()) + name String + nik String + notelp String + alamat String + email String + jenisInformasiDiminta JenisInformasiDiminta? @relation(fields: [jenisInformasiDimintaId], references: [id]) + jenisInformasiDimintaId String? + caraMemperolehInformasi CaraMemperolehInformasi? @relation(fields: [caraMemperolehInformasiId], references: [id]) + caraMemperolehInformasiId String? + caraMemperolehSalinanInformasi CaraMemperolehSalinanInformasi? @relation(fields: [caraMemperolehSalinanInformasiId], references: [id]) + caraMemperolehSalinanInformasiId String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} + +model JenisInformasiDiminta { + id String @id @default(cuid()) + name String @unique + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) + PermohonanInformasiPublik PermohonanInformasiPublik[] +} + +model CaraMemperolehInformasi { + id String @id @default(cuid()) + name String @unique + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) + PermohonanInformasiPublik PermohonanInformasiPublik[] +} + +model CaraMemperolehSalinanInformasi { + id String @id @default(cuid()) + name String @unique + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) + PermohonanInformasiPublik PermohonanInformasiPublik[] +} + +//=========================================PERMOHONAN INFORMASI KEBERATAN PUBLIK========================= // +model FormulirPermohonanKeberatan { + id String @id @default(cuid()) + name String + email String + notelp String + alasan String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} + // ========================================= IKM ========================================= // model IndeksKepuasanMasyarakat { id Int @id @default(autoincrement()) diff --git a/prisma/seed.ts b/prisma/seed.ts index 5f296d13..b334bc9e 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -1,8 +1,11 @@ +import prisma from '@/lib/prisma' +import categoryPengumuman from './data/category-pengumuman.json' +import katagoryBerita from './data/katagory-berita.json' +import caraMemperolehInformasi from './data/list-caraMemperolehInformasi.json' +import caraMemperolehSalinanInformasi from './data/list-caraMemperolehSalinanInformasi.json' +import jenisInformasiDiminta from './data/list-jenisInfromasi.json' import layanan from './data/list-layanan.json' import potensi from './data/list-potensi.json' -import katagoryBerita from './data/katagory-berita.json' -import categoryPengumuman from './data/category-pengumuman.json' -import prisma from '@/lib/prisma'; (async () => { for (const l of layanan) { await prisma.layanan.upsert({ @@ -67,6 +70,54 @@ import prisma from '@/lib/prisma'; } console.log("category pengumuman success ...") + + for (const j of jenisInformasiDiminta) { + await prisma.jenisInformasiDiminta.upsert({ + where: { + name: j.name + }, + update: { + name: j.name + }, + create: { + name: j.name + } + }) + } + console.log("jenis informasi diminta success ...") + + for (const c of caraMemperolehInformasi) { + await prisma.caraMemperolehInformasi.upsert({ + where: { + name: c.name + }, + update: { + name: c.name + }, + create: { + name: c.name + } + }) + } + console.log("cara memperoleh informasi success ...") + + for (const c of caraMemperolehSalinanInformasi) { + await prisma.caraMemperolehSalinanInformasi.upsert({ + where: { + name: c.name + }, + update: { + name: c.name + }, + create: { + name: c.name + } + }) + } + console.log("cara memperoleh salinan informasi success ...") + + + })().then(() => prisma.$disconnect()).catch((e) => { console.error(e) prisma.$disconnect() diff --git a/src/app/admin/(dashboard)/_state/desa/berita.ts b/src/app/admin/(dashboard)/_state/desa/berita.ts index 817c5127..ea5bdfbf 100644 --- a/src/app/admin/(dashboard)/_state/desa/berita.ts +++ b/src/app/admin/(dashboard)/_state/desa/berita.ts @@ -87,4 +87,4 @@ const stateDashboardBerita = proxy({ berita, }); -export default stateDashboardBerita; +export default stateDashboardBerita; \ No newline at end of file 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 new file mode 100644 index 00000000..4487056f --- /dev/null +++ b/src/app/admin/(dashboard)/_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik.ts @@ -0,0 +1,120 @@ +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 templateForm = z.object({ + name: z.string().min(3, "Nama minimal 3 karakter"), + nik: z.string().min(3, "NIK minimal 3 karakter"), + notelp: z.string().min(3, "Nomor Telepon minimal 3 karakter"), + alamat: z.string().min(3, "Alamat minimal 3 karakter"), + email: z.string().min(3, "Email minimal 3 karakter"), + jenisInformasiDimintaId: z.string().nonempty(), + caraMemperolehInformasiId: z.string().nonempty(), + caraMemperolehSalinanInformasiId: z.string().nonempty(), +}) + +const jenisInformasiDiminta = proxy({ + findMany: { + data: null as + | null + | Prisma.JenisInformasiDimintaGetPayload<{ omit: { isActive: true } }>[], + async load(){ + const res = await ApiFetch.api.ppid.permohonaninformasipublik.jenisInformasi["find-many"].get(); + if (res.status === 200) { + jenisInformasiDiminta.findMany.data = res.data?.data ?? []; + } + } + } +}) + +const caraMemperolehInformasi = proxy({ + findMany: { + data: null as + | null + | Prisma.CaraMemperolehInformasiGetPayload<{ omit: { isActive: true } }>[], + async load() { + const res = await ApiFetch.api.ppid.permohonaninformasipublik.memperolehInformasi["find-many"].get(); + if (res.status === 200) { + caraMemperolehInformasi.findMany.data = res.data?.data ?? []; + } + } + } +}) + +const caraMemperolehSalinanInformasi = proxy({ + findMany: { + data: null as + | null + | Prisma.CaraMemperolehSalinanInformasiGetPayload<{ omit: { isActive: true } }>[], + async load() { + const res = await ApiFetch.api.ppid.permohonaninformasipublik.salinanInformasi["find-many"].get(); + if (res.status === 200) { + caraMemperolehSalinanInformasi.findMany.data = res.data?.data ?? []; + } + } + } +}) + +type PermohonanInformasiPublikForm = Prisma.PermohonanInformasiPublikGetPayload<{ + select: { + name: true; + nik: true; + notelp: true; + alamat: true; + email: true; + jenisInformasiDimintaId: true; + caraMemperolehInformasiId: true; + caraMemperolehSalinanInformasiId: true; + }; +}>; + +const permohonanInformasiPublikForm = proxy({ + create: { + form: {} as PermohonanInformasiPublikForm, + loading: false, + async create(){ + const cek = templateForm.safeParse(permohonanInformasiPublikForm.create.form); + if(!cek.success) { + const err = `[${cek.error.issues + .map((v) => `${v.path.join(".")}`) + .join("\n")}] required`; + return toast.error(err); + } + try { + permohonanInformasiPublikForm.create.loading = true; + const res = await ApiFetch.api.ppid.permohonaninformasipublik["create"].post(permohonanInformasiPublikForm.create.form); + if (res.status === 200) { + permohonanInformasiPublikForm.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; + } + } + }, + findMany: { + data: null as + | Prisma.PermohonanInformasiPublikGetPayload<{ omit: { isActive: true } }>[] + | null, + async load() { + const res = await ApiFetch.api.ppid.permohonaninformasipublik["find-many"].get(); + if (res.status === 200) { + permohonanInformasiPublikForm.findMany.data = res.data?.data ?? []; + } + } + } +}) + +const statePermohonanInformasi = proxy({ + permohonanInformasiPublikForm, + jenisInformasiDiminta, + caraMemperolehInformasi, + caraMemperolehSalinanInformasi +}) + +export default statePermohonanInformasi; 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 new file mode 100644 index 00000000..3e8f4f41 --- /dev/null +++ b/src/app/admin/(dashboard)/_state/ppid/permohonan_keberatan_informasi_publik/permohonanKeberatanInformasi.ts @@ -0,0 +1,68 @@ +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 templateForm = z.object({ + name: z.string().min(3, "Nama minimal 3 karakter"), + email: z.string().min(3, "Email minimal 3 karakter"), + notelp: z.string().min(3, "Nomor Telepon minimal 3 karakter"), + alasan: z.string().min(3, "Alasan minimal 3 karakter"), +}) + +type PermohonanKeberatanInformasiForm = Prisma.FormulirPermohonanKeberatanGetPayload<{ + select: { + name: true; + email: true; + notelp: true; + alasan: true; + }; +}>; + +const permohonanKeberatanInformasiForm = proxy({ + create: { + form: {} as PermohonanKeberatanInformasiForm, + loading: false, + async create(){ + const cek = templateForm.safeParse(permohonanKeberatanInformasiForm.create.form); + if(!cek.success) { + const err = `[${cek.error.issues + .map((v) => `${v.path.join(".")}`) + .join("\n")}] required`; + return toast.error(err); + } + try { + permohonanKeberatanInformasiForm.create.loading = true; + const res = await ApiFetch.api.ppid.permohonankeberataninformasipublik["create"].post(permohonanKeberatanInformasiForm.create.form); + if (res.status === 200) { + permohonanKeberatanInformasiForm.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; + } + }, + }, + findMany: { + data: null as + | Prisma.FormulirPermohonanKeberatanGetPayload<{omit: {isActive: true}}>[] + | null, + async load() { + const res = await ApiFetch.api.ppid.permohonankeberataninformasipublik["find-many"].get(); + if (res.status === 200) { + permohonanKeberatanInformasiForm.findMany.data = res.data?.data ?? []; + } + } + } +}); + +const statePermohonanKeberatan = proxy({ + permohonanKeberatanInformasiForm, +}) + +export default statePermohonanKeberatan; + diff --git a/src/app/admin/(dashboard)/_state/ppid/profile_ppid/profile_PPID.ts b/src/app/admin/(dashboard)/_state/ppid/profile_ppid/profile_PPID.ts new file mode 100644 index 00000000..e35f6062 --- /dev/null +++ b/src/app/admin/(dashboard)/_state/ppid/profile_ppid/profile_PPID.ts @@ -0,0 +1,69 @@ +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 templateForm = z.object({ + name: z.string().min(3, "Nama minimal 3 karakter"), + biodata: z.string().min(3, "Biodata minimal 3 karakter"), + riwayat: z.string().min(3, "Riwayat minimal 3 karakter"), + pengalaman: z.string().min(3, "Pengalaman minimal 3 karakter"), + unggulan: z.string().min(3, "Unggulan minimal 3 karakter"), +}) + +type ProfilePPIDForm = Prisma.ProfilePPIDGetPayload<{ + select: { + name: true; + biodata: true; + riwayat: true; + pengalaman: true; + unggulan: true; + } +}> + +const profilePPID = proxy({ + create: { + form: {} as ProfilePPIDForm, + loading: false, + async create() { + const cek = templateForm.safeParse(profilePPID.create.form); + if (!cek.success) { + const err = `[${cek.error.issues + .map((v) => `${v.path.join(".")}`) + .join("\n")}] required`; + return toast.error(err); + } + try { + profilePPID.create.loading = true; + const res = await ApiFetch.api.ppid.profileppid["create"].post(profilePPID.create.form); + if (res.status === 200) { + profilePPID.findMany.load(); + return toast.success("success create"); + } + return toast.error("failed create"); + } catch (error) { + console.log((error as Error).message); + } finally { + profilePPID.create.loading = false; + } + } + }, + findMany: { + data: null as + | Prisma.ProfilePPIDGetPayload<{omit: {isActive: true}}>[] + | null, + async load() { + const res = await ApiFetch.api.ppid.profileppid["find-many"].get(); + if (res.status === 200) { + profilePPID.findMany.data = res.data?.data ?? []; + } + } + } +}) + +const stateProfilePPID = proxy({ + profilePPID +}) + +export default stateProfilePPID; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/desa/berita/page.tsx b/src/app/admin/(dashboard)/desa/berita/page.tsx index 26c3df72..fd79b4d3 100644 --- a/src/app/admin/(dashboard)/desa/berita/page.tsx +++ b/src/app/admin/(dashboard)/desa/berita/page.tsx @@ -10,9 +10,9 @@ import { BeritaEditor } from './_com/BeritaEditor'; function Page() { return ( - - + + ); diff --git a/src/app/admin/(dashboard)/ppid/_com/PPIDTextEditor.tsx b/src/app/admin/(dashboard)/ppid/_com/PPIDTextEditor.tsx new file mode 100644 index 00000000..b540c2e2 --- /dev/null +++ b/src/app/admin/(dashboard)/ppid/_com/PPIDTextEditor.tsx @@ -0,0 +1,94 @@ +'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'; + +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:

'; + +export function PPIDTextEditor({ onSubmit, onChange, showSubmit = true }: { + onSubmit?: (val: string) => void, + onChange: (val: string) => void, + showSubmit?: boolean }) { + const editor = useEditor({ + extensions: [ + StarterKit, + Underline, + Link, + Superscript, + SubScript, + Highlight, + TextAlign.configure({ types: ['heading', 'paragraph'] }), + ], + immediatelyRender: false, + content, + onUpdate : ({editor}) => { + onChange(editor.getHTML()) + } + }); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {showSubmit && ( + + )} + + ); +} \ No newline at end of file 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 60d146dd..9ee3ca61 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,5 +1,5 @@ 'use client' -import { Box, Button, Group, SimpleGrid, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, TextInput, Title } from '@mantine/core'; +import { Box, Button, Group, Paper, SimpleGrid, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, TextInput, Title } from '@mantine/core'; import React from 'react'; import { useProxy } from 'valtio/utils'; import stateDaftarInformasiPublik from '../../_state/ppid/daftar_informasi_publik/daftarInformasiPublik'; @@ -20,35 +20,37 @@ function Page() { - - Daftar Informasi Publik Desa Darmasaba - { - daftarInformasi.create.form.jenisInformasi = val.target.value - }} - /> - { - daftarInformasi.create.form.deskripsi = val - }} - /> - { - daftarInformasi.create.form.tanggal = val.target.value - }} - /> - - - - + + + Daftar Informasi Publik Desa Darmasaba + { + daftarInformasi.create.form.jenisInformasi = val.target.value + }} + /> + { + daftarInformasi.create.form.deskripsi = val + }} + /> + { + daftarInformasi.create.form.tanggal = val.target.value + }} + /> + + + + + @@ -64,46 +66,48 @@ function ListDaftarInformasi() { listData.findMany.load() }, []) if (!listData.findMany.data) return - {Array.from({length: 10}).map((v, k) => )} + {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/_ui/grafik_berdasarkan_jenis_kelamin_responden/page.tsx b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_berdasarkan_jenis_kelamin_responden/page.tsx index 93b30c06..18a8bf35 100644 --- a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_berdasarkan_jenis_kelamin_responden/page.tsx +++ b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_berdasarkan_jenis_kelamin_responden/page.tsx @@ -2,7 +2,7 @@ 'use client' import stateGrafikBerdasarkanJenisKelamin from '@/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanJenisKelamin'; import colors from '@/con/colors'; -import { Box, Button, Center, Flex, Stack, Text, TextInput, Title } from '@mantine/core'; +import { Box, Button, Center, Flex, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { useEffect, useState } from 'react'; import { Cell, Pie, PieChart } from 'recharts'; @@ -21,7 +21,7 @@ function GrafikBerdasarkanJenisKelamin() { 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' } @@ -44,15 +44,15 @@ function GrafikBerdasarkanJenisKelamin() { try { // Simpan data baru await grafikBerdasarkanJenisKelamin.create.create(); - + // Muat ulang data await grafikBerdasarkanJenisKelamin.findMany.load(); - + // Update chart dengan data baru if (grafikBerdasarkanJenisKelamin.findMany.data) { updateChartData(grafikBerdasarkanJenisKelamin.findMany.data); } - + // Reset form setelah submit grafikBerdasarkanJenisKelamin.create.form.laki = ''; grafikBerdasarkanJenisKelamin.create.form.perempuan = ''; @@ -64,72 +64,76 @@ function GrafikBerdasarkanJenisKelamin() { return ( - Grafik Hasil Kepuasan Masyarakat Terhadap Pelayanan Publik - { - grafikBerdasarkanJenisKelamin.create.form.laki = val.currentTarget.value; - }} - /> - { - grafikBerdasarkanJenisKelamin.create.form.perempuan = val.currentTarget.value; - }} - /> - + + Grafik Hasil Kepuasan Masyarakat Terhadap Pelayanan Publik + { + grafikBerdasarkanJenisKelamin.create.form.laki = val.currentTarget.value; + }} + /> + { + grafikBerdasarkanJenisKelamin.create.form.perempuan = val.currentTarget.value; + }} + /> + + {/* Chart */} - - Grafik Berdasarkan Jenis Kelamin Responden - {mounted && donutData.length > 0 && ( - -
- - - + + 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} - -
- )} -
+ + + {donutData.map((entry, index) => ( + + ))} + +
+
+ + + Perempuan: {donutData.find((entry) => entry.name === 'Perempuan')?.value} + + + + Laki-laki: {donutData.find((entry) => entry.name === 'Laki-laki')?.value} + +
+ )} +
+
); diff --git a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_berdasarkan_responden/page.tsx b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_berdasarkan_responden/page.tsx index f4d8651d..1a578cba 100644 --- a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_berdasarkan_responden/page.tsx +++ b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_berdasarkan_responden/page.tsx @@ -2,7 +2,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import stateGrafikResponden from '@/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanResponden'; import colors from '@/con/colors'; -import { Box, Button, Center, Flex, Stack, Text, TextInput, Title } from '@mantine/core'; +import { Box, Button, Center, Flex, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import React, { useEffect, useState } from 'react'; import { PieChart, Pie, Cell } from 'recharts'; @@ -68,96 +68,103 @@ function GrafikBerdasarkanResponden() { return ( - Grafik Berdasarkan Responden - { - grafikBerdasarkanResponden.create.form.sangatbaik = val.currentTarget.value; - }} - /> - { - grafikBerdasarkanResponden.create.form.baik = val.currentTarget.value; - }} - /> - { - grafikBerdasarkanResponden.create.form.kurangbaik = val.currentTarget.value; - }} - /> - { - grafikBerdasarkanResponden.create.form.tidakbaik = val.currentTarget.value; - }} - /> - + + + Grafik Berdasarkan Responden + { + grafikBerdasarkanResponden.create.form.sangatbaik = val.currentTarget.value; + }} + /> + { + grafikBerdasarkanResponden.create.form.baik = val.currentTarget.value; + }} + /> + { + grafikBerdasarkanResponden.create.form.kurangbaik = val.currentTarget.value; + }} + /> + { + grafikBerdasarkanResponden.create.form.tidakbaik = val.currentTarget.value; + }} + /> + + + + + {/* Chart */} - - Grafik Berdasarkan Responden - {mounted && donutData.length > 0 && ( - -
- - + + 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} - -
- )} -
+ + {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} + +
+ )} +
+
); diff --git a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_berdasarkan_umur/page.tsx b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_berdasarkan_umur/page.tsx index b85ed036..5e3d0e1f 100644 --- a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_berdasarkan_umur/page.tsx +++ b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_berdasarkan_umur/page.tsx @@ -1,7 +1,7 @@ 'use client' /* eslint-disable @typescript-eslint/no-explicit-any */ import colors from '@/con/colors'; -import { Box, Button, Center, Flex, Stack, Text, TextInput, Title } from '@mantine/core'; +import { Box, Button, Center, Flex, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import React, { useEffect, useState } from 'react'; import { useProxy } from 'valtio/utils'; import stateGrafikBerdasarkanUmur from '@/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanUmur'; @@ -37,117 +37,125 @@ function GrafikBerdasarakanUmur() { fetchData(); }, []); -const fetchData = async () => { - await grafikBerdasarkanUmur.findMany.load(); - if (grafikBerdasarkanUmur.findMany.data) { - updateChartData(grafikBerdasarkanUmur.findMany.data); - } -} - -const handleSubmit = async () => { - try { - await grafikBerdasarkanUmur.create.create(); + const fetchData = async () => { await grafikBerdasarkanUmur.findMany.load(); if (grafikBerdasarkanUmur.findMany.data) { updateChartData(grafikBerdasarkanUmur.findMany.data); } - } catch (error) { - console.error("Error submitting data:", error); } -} + + const handleSubmit = async () => { + try { + await grafikBerdasarkanUmur.create.create(); + await grafikBerdasarkanUmur.findMany.load(); + if (grafikBerdasarkanUmur.findMany.data) { + updateChartData(grafikBerdasarkanUmur.findMany.data); + } + } catch (error) { + console.error("Error submitting data:", error); + } + } return ( - Grafik Berdasarkan Umur Responden - { - grafikBerdasarkanUmur.create.form.remaja = val.currentTarget.value; - }} - /> - { - grafikBerdasarkanUmur.create.form.dewasa = val.currentTarget.value; - }} - /> - { - grafikBerdasarkanUmur.create.form.orangtua = val.currentTarget.value; - }} - /> - { - grafikBerdasarkanUmur.create.form.lansia = val.currentTarget.value; - }} - /> - + + + Grafik Berdasarkan Umur Responden + { + grafikBerdasarkanUmur.create.form.remaja = val.currentTarget.value; + }} + /> + { + grafikBerdasarkanUmur.create.form.dewasa = val.currentTarget.value; + }} + /> + { + grafikBerdasarkanUmur.create.form.orangtua = val.currentTarget.value; + }} + /> + { + grafikBerdasarkanUmur.create.form.lansia = val.currentTarget.value; + }} + /> + + + + + {/* Chart */} - - Grafik Berdasarkan Umur Responden - {mounted && donutData.length > 0 && ( - -
- - + + 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} - -
- )} -
+ + {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} + +
+ )} +
+
); diff --git a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_hasil_kepuasan_masyarakat/page.tsx b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_hasil_kepuasan_masyarakat/page.tsx index 92596971..5ece0a34 100644 --- a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_hasil_kepuasan_masyarakat/page.tsx +++ b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_ui/grafik_hasil_kepuasan_masyarakat/page.tsx @@ -2,7 +2,7 @@ 'use client' import stateGrafikHasilKepuasanMasyarakat from '@/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikHasilKepuasan'; import colors from '@/con/colors'; -import { Box, Button, TextInput, Title } from '@mantine/core'; +import { Box, Button, Paper, Stack, TextInput, Title } from '@mantine/core'; import { useMediaQuery, useShallowEffect } from '@mantine/hooks'; import React, { useEffect, useState } from 'react'; import { Bar, BarChart, Legend, Tooltip, XAxis, YAxis } from 'recharts'; @@ -32,53 +32,61 @@ function GrafikHasilKepuasan() { return ( - Grafik Hasil Kepuasan Masyarakat Terhadap Pelayanan Publik - { - grafikHasilKepuasan.create.form.label = val.currentTarget.value; - }} - /> - { - grafikHasilKepuasan.create.form.kepuasan = val.currentTarget.value; - }} - /> - + + + Grafik Hasil Kepuasan Masyarakat Terhadap Pelayanan Publik + { + grafikHasilKepuasan.create.form.label = val.currentTarget.value; + }} + /> + { + grafikHasilKepuasan.create.form.kepuasan = val.currentTarget.value; + }} + /> + + + {/* Chart */} - Data Kepuasan Masyarakat - {mounted && chartData.length > 0 && ( - - - - - - - - )} + + + Data Kepuasan Masyarakat + {mounted && chartData.length > 0 && ( + + + + + + + + )} + + diff --git a/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/jenisInformasi.tsx b/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/jenisInformasi.tsx new file mode 100644 index 00000000..90a1c6f7 --- /dev/null +++ b/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/jenisInformasi.tsx @@ -0,0 +1,41 @@ +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 = 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 new file mode 100644 index 00000000..b5dfc2b8 --- /dev/null +++ b/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/memperolehSalinan.tsx @@ -0,0 +1,45 @@ +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 ( + +