diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 97bdedff..4fba70fc 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -672,17 +672,18 @@ model GalleryVideo { // ========================================= LAYANAN DESA ========================================= // model PelayananSuratKeterangan { - id String @id @default(cuid()) - name String - deskripsi String @db.Text - image FileStorage? @relation("PelayananSuratKeteranganImage", fields: [imageId], references: [id]) - imageId String? - image2 FileStorage? @relation("PelayananSuratKeteranganImage2", fields: [image2Id], references: [id]) - image2Id String? - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime @default(now()) - isActive Boolean @default(true) + id String @id @default(cuid()) + name String + deskripsi String @db.Text + image FileStorage? @relation("PelayananSuratKeteranganImage", fields: [imageId], references: [id]) + imageId String? + image2 FileStorage? @relation("PelayananSuratKeteranganImage2", fields: [image2Id], references: [id]) + image2Id String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) + AjukanPermohonan AjukanPermohonan[] } model PelayananTelunjukSaktiDesa { @@ -717,6 +718,20 @@ model PelayananPendudukNonPermanen { isActive Boolean @default(true) } +model AjukanPermohonan { + id String @id @default(cuid()) + nama String + nik String + alamat String + nomorKk String + kategori PelayananSuratKeterangan @relation(fields: [kategoriId], references: [id]) + kategoriId String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} + // ========================================= PENGHARGAAN ========================================= // model Penghargaan { id String @id @default(cuid()) @@ -1254,15 +1269,15 @@ model KontakDaruratToItem { // ========================================= PENCEGAHAN KRIMINALITAS ========================================= // model PencegahanKriminalitas { - id String @id @default(cuid()) - judul String - deskripsi String - deskripsiSingkat String - linkVideo String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime @default(now()) - isActive Boolean @default(true) + id String @id @default(cuid()) + judul String + deskripsi String + deskripsiSingkat String + linkVideo String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) } // ========================================= LAPORAN PUBLIK ========================================= // diff --git a/public/pudak-icon.png b/public/pudak-icon.png index 7aa60c17..c54c6062 100644 Binary files a/public/pudak-icon.png and b/public/pudak-icon.png differ diff --git a/src/app/admin/(dashboard)/_state/desa/layananDesa.ts b/src/app/admin/(dashboard)/_state/desa/layananDesa.ts index 3cc787a3..b11b67a8 100644 --- a/src/app/admin/(dashboard)/_state/desa/layananDesa.ts +++ b/src/app/admin/(dashboard)/_state/desa/layananDesa.ts @@ -71,6 +71,22 @@ const pelayananPendudukNonPermanenForm = { deskripsi: "", }; +const templateAjukanForm = z.object({ + nama: z.string().min(1).max(5000), + nik: z.string().min(1).max(5000), + alamat: z.string().min(1).max(5000), + nomorKk: z.string().min(1).max(5000), + kategoriId: z.string().min(1).max(5000), +}); + +const defaultAjukanForm = { + nama: "", + nik: "", + alamat: "", + nomorKk: "", + kategoriId: "", +}; + const suratKeterangan = proxy({ create: { form: { ...suratKeteranganForm }, @@ -146,6 +162,30 @@ const suratKeterangan = proxy({ } }, }, + findManyAll: { + data: null as Prisma.PelayananSuratKeteranganGetPayload<{ + omit: { isActive: true }; + }>[] | null, + loading: false, + load: async () => { + suratKeterangan.findManyAll.loading = true; + try { + const res = await ApiFetch.api.desa.layanan.pelayanansuratketerangan["findManyAll"].get(); + + if (res.status === 200 && res.data?.success) { + suratKeterangan.findManyAll.data = res.data.data || []; + } else { + suratKeterangan.findManyAll.data = []; + console.error("Failed to load surat keterangan all:", res.data?.message); + } + } catch (error) { + console.error("Error loading surat keterangan all:", error); + suratKeterangan.findManyAll.data = []; + } finally { + suratKeterangan.findManyAll.loading = false; + } + }, + }, findUnique: { data: null as Prisma.PelayananSuratKeteranganGetPayload<{ include: { @@ -769,11 +809,250 @@ const pelayananPendudukNonPermanen = proxy({ }, }); +const ajukanPermohonan = proxy({ + create: { + form: { ...defaultAjukanForm }, + loading: false, + async create() { + const cek = templateAjukanForm.safeParse( + ajukanPermohonan.create.form + ); + if (!cek.success) { + const err = `[${cek.error.issues + .map((v) => `${v.path.join(".")}`) + .join("\n")}] required`; + return toast.error(err); + } + try { + ajukanPermohonan.create.loading = true; + const res = await ApiFetch.api.desa.ajukanpermohonan[ + "create" + ].post(ajukanPermohonan.create.form); + if (res.status === 200) { + ajukanPermohonan.findMany.load(); + return toast.success("Ajukan permohonan berhasil disimpan!"); + } + return toast.error("Gagal menyimpan ajukan permohonan"); + } catch (error) { + console.log((error as Error).message); + } finally { + ajukanPermohonan.create.loading = false; + } + }, + resetForm() { + ajukanPermohonan.create.form = { ...defaultAjukanForm }; + }, + }, + findMany: { + data: null as Prisma.AjukanPermohonanGetPayload<{ + include: { + kategori: true; + }; + }>[] | null, + page: 1, + totalPages: 1, + total: 0, + loading: false, + search: "", + load: async (page = 1, limit = 10, search = "") => { + // Change to arrow function + ajukanPermohonan.findMany.loading = true; // Use the full path to access the property + ajukanPermohonan.findMany.page = page; + ajukanPermohonan.findMany.search = search; + try { + const query: any = { page, limit }; + if (search) query.search = search; + const res = await ApiFetch.api.desa.ajukanpermohonan[ + "findMany" + ].get({ + query, + }); + + if (res.status === 200 && res.data?.success) { + ajukanPermohonan.findMany.data = res.data.data || []; + ajukanPermohonan.findMany.total = res.data.total || 0; + ajukanPermohonan.findMany.totalPages = res.data.totalPages || 1; + } else { + console.error("Failed to load ajukan permohonan:", res.data?.message); + ajukanPermohonan.findMany.data = []; + ajukanPermohonan.findMany.total = 0; + ajukanPermohonan.findMany.totalPages = 1; + } + } catch (error) { + console.error("Error loading ajukan permohonan:", error); + ajukanPermohonan.findMany.data = []; + ajukanPermohonan.findMany.total = 0; + ajukanPermohonan.findMany.totalPages = 1; + } finally { + ajukanPermohonan.findMany.loading = false; + } + }, + }, + findUnique: { + data: null as Prisma.AjukanPermohonanGetPayload<{ + include: { + kategori: true; + } + }> | null, + async load(id: string) { + try { + const res = await fetch( + `/api/desa/ajukanpermohonan/${id}` + ); + if (res.ok) { + const data = await res.json(); + ajukanPermohonan.findUnique.data = data.data ?? null; + } else { + console.error("Failed to fetch ajukan permohonan:", res.statusText); + ajukanPermohonan.findUnique.data = null; + } + } catch (error) { + console.error("Error fetching ajukan permohonan:", error); + ajukanPermohonan.findUnique.data = null; + } + }, + }, + delete: { + loading: false, + async byId(id: string) { + if (!id) return toast.warn("ID tidak valid"); + try { + ajukanPermohonan.delete.loading = true; + const response = await fetch( + `/api/desa/ajukanpermohonan/del/${id}`, + { + method: "DELETE", + headers: { + "Content-Type": "application/json", + }, + } + ); + const result = await response.json(); + if (response.ok) { + toast.success(result.message || "Ajukan permohonan berhasil dihapus"); + await ajukanPermohonan.findMany.load(); // refresh list + } else { + toast.error(result.message || "Gagal menghapus ajukan permohonan"); + } + } catch (error) { + console.error("Gagal delete:", error); + toast.error("Terjadi kesalahan saat menghapus ajukan permohonan"); + } finally { + ajukanPermohonan.delete.loading = false; + } + }, + }, + edit: { + id: "", + form: { ...defaultAjukanForm }, + loading: false, + + async load(id: string) { + if (!id) { + toast.warn("ID tidak valid"); + return null; + } + try { + const response = await fetch( + `/api/desa/ajukanpermohonan/${id}`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + } + ); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const result = await response.json(); + if (result?.success) { + const data = result.data; + this.id = data.id; + this.form = { + nama: data.nama, + nik: data.nik, + alamat: data.alamat, + nomorKk: data.nomorKk, + kategoriId: data.kategoriId, + }; + return data; + } else { + throw new Error(result.message || "Gagal memuat data"); + } + } catch (error) { + console.error("Error fetching ajukan permohonan:", error); + toast.error( + error instanceof Error ? error.message : "Gagal memuat data" + ); + return null; + } + }, + async update() { + const cek = templateAjukanForm.safeParse( + ajukanPermohonan.edit.form + ); + if (!cek.success) { + const err = `[${cek.error.issues + .map((v) => `${v.path.join(".")}`) + .join("\n")}] required`; + return toast.error(err); + } + try { + ajukanPermohonan.edit.loading = true; + const response = await fetch( + `/api/desa/ajukanpermohonan/${this.id}`, + { + method: "PUT", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + nama: this.form.nama, + nik: this.form.nik, + alamat: this.form.alamat, + nomorKk: this.form.nomorKk, + kategoriId: this.form.kategoriId, + }), + } + ); + if (!response.ok) { + const errorData = await response.json().catch(() => ({})); + throw new Error( + errorData.message || `HTTP error! status: ${response.status}` + ); + } + const result = await response.json(); + if (result.success) { + toast.success(result.message || "Ajukan permohonan berhasil diupdate"); + await ajukanPermohonan.findMany.load(); // refresh list + return true; + } else { + throw new Error( + result.message || "Gagal mengupdate ajukan permohonan" + ); + } + } catch (error) { + console.error("Error updating ajukan permohonan:", error); + toast.error( + error instanceof Error + ? error.message + : "Terjadi kesalahan saat update ajukan permohonan" + ); + return false; + } finally { + ajukanPermohonan.edit.loading = false; + } + }, + }, +}); + const stateLayananDesa = proxy({ suratKeterangan, pelayananPerizinanBerusaha, pelayananTelunjukSaktiDesa, pelayananPendudukNonPermanen, + ajukanPermohonan, }); export default stateLayananDesa; diff --git a/src/app/admin/(dashboard)/desa/_com/layoutTabLayanan.tsx b/src/app/admin/(dashboard)/desa/_com/layoutTabLayanan.tsx index 94d786a9..4ec40e47 100644 --- a/src/app/admin/(dashboard)/desa/_com/layoutTabLayanan.tsx +++ b/src/app/admin/(dashboard)/desa/_com/layoutTabLayanan.tsx @@ -4,7 +4,7 @@ import colors from '@/con/colors'; import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title, Tooltip } from '@mantine/core'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; -import { IconFileText, IconBuildingStore, IconSparkles, IconUsers } from '@tabler/icons-react'; +import { IconFileText, IconBuildingStore, IconSparkles, IconUsers, IconUsersPlus } from '@tabler/icons-react'; function LayoutTabsLayanan({ children }: { children: React.ReactNode }) { const router = useRouter() @@ -37,6 +37,13 @@ function LayoutTabsLayanan({ children }: { children: React.ReactNode }) { href: "/admin/desa/layanan/pelayanan_penduduk_non_permanent", icon: , tooltip: "Pendataan penduduk non-permanent" + }, + { + label: "Ajukan Permohonan", + value: "ajukanpermohonan", + href: "/admin/desa/layanan/ajukan_permohonan", + icon: , + tooltip: "Ajukan permohonan" } ]; diff --git a/src/app/admin/(dashboard)/desa/berita/list-berita/page.tsx b/src/app/admin/(dashboard)/desa/berita/list-berita/page.tsx index 1e632b96..47b628d8 100644 --- a/src/app/admin/(dashboard)/desa/berita/list-berita/page.tsx +++ b/src/app/admin/(dashboard)/desa/berita/list-berita/page.tsx @@ -5,7 +5,6 @@ import { Button, Center, Group, - Image, Pagination, Paper, Skeleton, @@ -18,7 +17,7 @@ import { TableTr, Text, Title, - Tooltip, + Tooltip } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconCircleDashedPlus, IconDeviceImacCog, IconSearch } from '@tabler/icons-react'; @@ -87,7 +86,6 @@ function ListBerita({ search }: { search: string }) { Judul Kategori - Gambar Aksi @@ -96,7 +94,7 @@ function ListBerita({ search }: { search: string }) { filteredData.map((item) => ( - + {item.judul} @@ -107,19 +105,6 @@ function ListBerita({ search }: { search: string }) { {item.kategoriBerita?.name || '-'} - - - {item.image?.link ? ( - gambar - ) : ( - - )} - - + + + Edit Ajukan Permohonan + + + + + + setFormData({ ...formData, nama: e.target.value })} + required + /> + + setFormData({ ...formData, nik: e.target.value })} + required + /> + + setFormData({ ...formData, alamat: e.target.value })} + required + /> + + setFormData({ ...formData, nomorKk: e.target.value })} + required + /> + + ({ + label: item.name, + value: item.id, + }))} + value={stateCreate.create.form.kategoriId || null} + onChange={(val: string | null) => { + if (val) { + const selected = stateLayananDesa.suratKeterangan.findMany.data?.find( + (item) => item.id === val + ); + if (selected) { + stateCreate.create.form.kategoriId = selected.id; + } + } else { + stateCreate.create.form.kategoriId = ''; + } + }} + searchable + clearable + nothingFoundMessage="Tidak ditemukan" + required + /> + + + + + ); } diff --git a/src/app/darmasaba/(pages)/desa/layanan/page.tsx b/src/app/darmasaba/(pages)/desa/layanan/page.tsx index 15fbb8b8..87cc5aa7 100644 --- a/src/app/darmasaba/(pages)/desa/layanan/page.tsx +++ b/src/app/darmasaba/(pages)/desa/layanan/page.tsx @@ -22,7 +22,7 @@ export default function Page() { {/* Bagian Layanan */} - + Layanan Desa Darmasaba - + {detail.data?.judul} @@ -40,7 +40,7 @@ function Page() { {detail.data?.CategoryPengumuman?.name} - + diff --git a/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/page.tsx b/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/page.tsx new file mode 100644 index 00000000..42b22bec --- /dev/null +++ b/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/page.tsx @@ -0,0 +1,128 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +'use client'; + +import daftarInformasiPublik from '@/app/admin/(dashboard)/_state/ppid/daftar_informasi_publik/daftarInformasiPublik'; +import colors from '@/con/colors'; +import { + Box, + Button, + Center, + Divider, + Paper, + Skeleton, + Stack, + Text, +} from '@mantine/core'; +import { IconArrowBack } from '@tabler/icons-react'; +import { useParams, useRouter } from 'next/navigation'; +import { useEffect } from 'react'; +import { useProxy } from 'valtio/utils'; + +export default function DetailInformasiPublikUser() { + const state = useProxy(daftarInformasiPublik); + const router = useRouter(); + const params = useParams(); + + useEffect(() => { + if (params?.id) state.findUnique.load(params.id as string); + }, [params?.id]); + + const data = state.findUnique.data; + + if (!state.findUnique.data) { + return ( +
+ +
+ ); + } + + if (!data) { + return ( +
+ + + Informasi tidak ditemukan + + + +
+ ); + } + + return ( + + {/* Tombol Kembali */} + + + + + + Detail Informasi Publik + + + + + + + + Jenis Informasi + + + {data.jenisInformasi || '-'} + + + + + + Tanggal Publikasi + + + {data.tanggal + ? new Date(data.tanggal).toLocaleDateString('id-ID', { + day: '2-digit', + month: 'long', + year: 'numeric', + }) + : '-'} + + + + + + Deskripsi + + + + + + + + ); +} \ No newline at end of file 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 719ff015..1465f011 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 @@ -3,10 +3,13 @@ import daftarInformasiPublik from '@/app/admin/(dashboard)/_state/ppid/daftar_informasi_publik/daftarInformasiPublik'; import colors from '@/con/colors'; import { + Badge, Box, + Button, Center, Image, Pagination, + Paper, Skeleton, Stack, Table, @@ -17,21 +20,20 @@ import { TableTr, Text, TextInput, - Paper, - Badge, + Tooltip } from '@mantine/core'; -import { useShallowEffect } from '@mantine/hooks'; -import { IconSearch, IconFileInfo, IconMail, IconBrandWhatsapp } from '@tabler/icons-react'; +import { useDebouncedValue, useShallowEffect } from '@mantine/hooks'; +import { IconBrandWhatsapp, IconDeviceImacCog, IconFileInfo, IconMail, IconSearch } from '@tabler/icons-react'; import { useState } from 'react'; import { useProxy } from 'valtio/utils'; import BackButton from '../../desa/layanan/_com/BackButto'; -import { useDebouncedValue } from '@mantine/hooks'; +import { useTransitionRouter } from 'next-view-transitions'; function Page() { const listData = useProxy(daftarInformasiPublik) const [search, setSearch] = useState('') const [debouncedSearch] = useDebouncedValue(search, 500); // 500ms delay - + const router = useTransitionRouter() const { data, page, @@ -63,7 +65,7 @@ function Page() {
- Logo Desa Darmasaba + Logo Desa Darmasaba
Daftar Informasi Publik Desa Darmasaba @@ -99,38 +101,63 @@ function Page() {
) : ( - - - - No - Jenis Informasi - Deskripsi - Tanggal Publikasi - - - - {data.map((item, index) => ( - - {(page - 1) * 5 + index + 1} - - - {item.jenisInformasi} - - - - - - - {item.tanggal ? new Date(item.tanggal).toLocaleDateString('id-ID', { - day: '2-digit', - month: 'long', - year: 'numeric' - }) : '-'} - + +
+ + + No + Jenis Informasi + Deskripsi + Tanggal Publikasi + Aksi - ))} - -
+ + + {data.map((item, index) => ( + + {(page - 1) * 5 + index + 1} + + + + {item.jenisInformasi} + + + + + + + + + + + {item.tanggal ? new Date(item.tanggal).toLocaleDateString('id-ID', { + day: '2-digit', + month: 'long', + year: 'numeric' + }) : '-'} + + + + + + + + + + + ))} + + + )}
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 a9af79c6..92ec507a 100644 --- a/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/page.tsx +++ b/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/page.tsx @@ -4,7 +4,7 @@ import indeksKepuasanState from "@/app/admin/(dashboard)/_state/landing-page/ind import colors from "@/con/colors"; import { BarChart, PieChart } from '@mantine/charts'; import { Box, Button, Center, Container, Flex, Group, Modal, Paper, Select, SimpleGrid, Skeleton, Stack, Text, TextInput, Title } from "@mantine/core"; -import { useDisclosure, useShallowEffect } from "@mantine/hooks"; +import { useDisclosure, useMediaQuery, useShallowEffect } from "@mantine/hooks"; import { useState } from "react"; import { useProxy } from "valtio/utils"; @@ -24,7 +24,8 @@ function Kepuasan() { const [donutDataRating, setDonutDataRating] = useState([]); const [donutDataKelompokUmur, setDonutDataKelompokUmur] = useState([]); const [barChartData, setBarChartData] = useState>([]); - const [opened, { open, close }] = useDisclosure(false) + const [opened, { open, close }] = useDisclosure(false); + const isMobile = useMediaQuery("(max-width: 768px)"); const resetForm = () => { state.create.form = { @@ -140,12 +141,12 @@ function Kepuasan() { if ((loading && !data) || !data) { return ( - - - - - - + + + + + + ); @@ -412,50 +413,41 @@ function Kepuasan() { ); } return ( - - - - Indeks Kepuasan Masyarakat - - + + + + Indeks Kepuasan Masyarakat + + - - - - - - Pelayanan Terhadap Publik Desa Darmasaba + + + + + + Pelayanan Terhadap Publik Desa Darmasaba - Total Responden - - {state.findMany.total.toLocaleString('id-ID')} + Total Responden + + {state.findMany.total.toLocaleString("id-ID")} - - + + {/* Chart Jenis Kelamin */} @@ -465,28 +457,17 @@ function Kepuasan() { Belum ada data untuk ditampilkan dalam grafik ) : ( - - - -
- -
-
- - {donutDataJenisKelamin.map((entry) => ( - - - {entry.name}: {entry.value} - - ))} - -
+ + +
+ +
+
)}
@@ -501,35 +482,18 @@ function Kepuasan() { Belum ada data untuk ditampilkan dalam grafik ) : ( - - - -
- -
-
- - - {donutDataRating.map((entry) => ( - - - - {entry.name}: {entry.value} - - - ))} - - -
+ + +
+ +
+
)}
@@ -544,35 +508,18 @@ function Kepuasan() { Belum ada data untuk ditampilkan dalam grafik ) : ( - - - -
- -
-
- - - {donutDataKelompokUmur.map((entry) => ( - - - - {entry.name}: {entry.value} - - - ))} - - -
+ + +
+ +
+
)}
diff --git a/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx b/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx index ee7f1a56..46e5ef6b 100644 --- a/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx +++ b/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx @@ -32,9 +32,9 @@ function DesaAntiKorupsi() {
- Desa Anti Korupsi + Desa Anti Korupsi
- Desa antikorupsi mendorong pemerintahan jujur dan transparan. Keuangan desa dikelola terbuka dengan melibatkan warga mengawasi anggaran, sehingga digunakan tepat sasaran sesuai kebutuhan. + Desa antikorupsi mendorong pemerintahan jujur dan transparan. Keuangan desa dikelola terbuka dengan melibatkan warga mengawasi anggaran, sehingga digunakan tepat sasaran sesuai kebutuhan.
@@ -49,6 +49,7 @@ function DesaAntiKorupsi() { cols={{ base: 1, sm: 2, md: 3 }} spacing="lg" mt="lg" + mb="xl" > {data.map((v, k) => ( Ukur kebahagiaan warga, tingkatkan layanan desa! Dengan partisipasi aktif masyarakat, kami berkomitmen untuk terus memperbaiki layanan agar lebih transparan, efektif, dan sesuai dengan kebutuhan warga. Kepuasan Anda adalah prioritas utama kami dalam membangun desa yang lebih baik!
-
@@ -182,7 +182,7 @@ function Kepuasan() { {/* Chart Jenis Kelamin */} @@ -220,7 +217,7 @@ function Kepuasan() { withLabels withTooltip labelsType="percent" - size={200} + size={250} // Fixed size in pixels data={donutDataJenisKelamin} />
@@ -259,7 +256,7 @@ function Kepuasan() { labelsPosition="outside" labelsType="percent" withLabelsLine - size={200} + size={250} data={donutDataRating} /> @@ -302,7 +299,7 @@ function Kepuasan() { labelsPosition="outside" labelsType="percent" withLabelsLine - size={190} + size={250} data={donutDataKelompokUmur} /> @@ -419,7 +416,7 @@ function Kepuasan() { } return ( - +
Indeks Kepuasan Masyarakat
@@ -432,9 +429,15 @@ function Kepuasan() { - - Pelayanan Terhadap Publik Desa Darmasaba - + + + Pelayanan Terhadap Publik Desa Darmasaba + + Total Responden {state.findMany.total.toLocaleString('id-ID')} diff --git a/src/app/darmasaba/_com/main-page/potensi/index.tsx b/src/app/darmasaba/_com/main-page/potensi/index.tsx index d1bcdaba..e9b3593c 100644 --- a/src/app/darmasaba/_com/main-page/potensi/index.tsx +++ b/src/app/darmasaba/_com/main-page/potensi/index.tsx @@ -100,11 +100,11 @@ function Potensi() { style={{ zIndex: 1 }} > - + {v.name} - + {v.deskripsi}