diff --git a/src/app/admin/(dashboard)/desa/berita/kategori-berita/page.tsx b/src/app/admin/(dashboard)/desa/berita/kategori-berita/page.tsx index 961f11a8..842ccb3c 100644 --- a/src/app/admin/(dashboard)/desa/berita/kategori-berita/page.tsx +++ b/src/app/admin/(dashboard)/desa/berita/kategori-berita/page.tsx @@ -86,7 +86,7 @@ function ListKategoriBerita({ search }: { search: string }) { - + <Title order={4} lh={1.2}> Daftar Kategori Berita @@ -44,25 +43,29 @@ function ListDokterTenagaMedis({ search }: { search: string }) { totalPages } = stateFasilitasKesehatan.findMany + const [debouncedSearch] = useDebouncedValue(search, 1000); + useShallowEffect(() => { - load(page, 10, search) - }, [page, search]) + load(page, 10, debouncedSearch) + }, [page, debouncedSearch]) const filteredData = data || [] if (loading || !data) { return ( - + ) } + return ( - - + + {/* Judul + Tombol Tambah */} - Daftar Dokter dan Tenaga Medis + Daftar Dokter dan Tenaga Medis + Daftar Dokter dan Tenaga Medis - {/* Tabel */} - + {/* Desktop Table */} + - Nama Dokter - Spesialis - Jadwal - Aksi + Nama Dokter + Spesialis + Jadwal + Aksi @@ -93,21 +96,17 @@ function ListDokterTenagaMedis({ search }: { search: string }) { filteredData.map((item) => ( - - - {item.name} - - + + {item.name} + - + {item.specialist || '-'} - + - - - + @@ -128,8 +127,8 @@ function ListDokterTenagaMedis({ search }: { search: string }) { ) : ( -
- +
+ Tidak ada fasilitas kesehatan yang cocok
@@ -139,6 +138,47 @@ function ListDokterTenagaMedis({ search }: { search: string }) {
+ + {/* Mobile Cards */} + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + Nama Dokter + {item.name} + + + Spesialis + {item.specialist || '-'} + + + Jadwal + + + + + )) + ) : ( +
+ + Tidak ada fasilitas kesehatan yang cocok + +
+ )} +
{/* Pagination */} @@ -160,4 +200,4 @@ function ListDokterTenagaMedis({ search }: { search: string }) { ) } -export default DokterTenagaMedis; +export default DokterTenagaMedis; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/page.tsx index 5943590e..8a405c04 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/page.tsx @@ -5,8 +5,6 @@ import { Box, Button, Center, - Grid, - GridCol, Group, Pagination, Paper, @@ -23,82 +21,138 @@ import { Title, Tooltip } from '@mantine/core'; -import { useShallowEffect } from '@mantine/hooks'; +import { useDebouncedValue, useShallowEffect } from '@mantine/hooks'; import { IconCoin, IconDeviceImacCog, IconPlus, IconReportMedical, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { useProxy } from 'valtio/utils'; import fasilitasKesehatanState from '../../../_state/kesehatan/data_kesehatan_warga/fasilitasKesehatan'; - function FasilitasKesehatan() { const [search, setSearch] = useState(""); - const router = useRouter() + const router = useRouter(); return ( - - - Fasilitas Kesehatan - - - + + + + Fasilitas Kesehatan + + + Fasilitas Kesehatan + + - router.push('/admin/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/dokter-tenaga-medis')} size="lg" radius="xl" color="green.6"> + router.push('/admin/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/dokter-tenaga-medis')} + size="lg" + radius="xl" + color="green.6" + > - router.push('/admin/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/tarif-layanan')} size="lg" radius="xl" color="blue.6"> + router.push('/admin/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/tarif-layanan')} + size="lg" + radius="xl" + color="blue.6" + > - } - w="133%" value={search} onChange={(e) => setSearch(e.currentTarget.value)} + fz={{ base: 'xs', md: 'sm' }} + px="sm" + py="xs" /> - - - +
+ + + + Fasilitas Kesehatan + + + Fasilitas Kesehatan + + + + router.push('/admin/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/dokter-tenaga-medis')} + size="lg" + radius="xl" + color="green.6" + > + + + + + router.push('/admin/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/tarif-layanan')} + size="lg" + radius="xl" + color="blue.6" + > + + + + } + value={search} + onChange={(e) => setSearch(e.currentTarget.value)} + fz={{ base: 'xs', md: 'sm' }} + px="sm" + py="xs" + /> + + +
); } - function ListFasilitasKesehatan({ search }: { search: string }) { - const stateFasilitasKesehatan = useProxy(fasilitasKesehatanState.fasilitasKesehatan) + const stateFasilitasKesehatan = useProxy(fasilitasKesehatanState.fasilitasKesehatan); const router = useRouter(); + const [debouncedSearch] = useDebouncedValue(search, 1000); const { data, page, totalPages, loading, load } = stateFasilitasKesehatan.findMany; useShallowEffect(() => { - - load(page, 10, search); - }, [page, search]); + load(page, 10, debouncedSearch); + }, [page, debouncedSearch]); const filteredData = data || []; if (loading || !data) { return ( - + - ) + ); } return ( - - - {/* Judul + Tombol Tambah */} + + - Daftar Fasilitas Kesehatan + + Daftar Fasilitas Kesehatan + + + Daftar Fasilitas Kesehatan + - {/* Tabel */} - + {/* Desktop Table */} + @@ -129,27 +185,23 @@ function ListFasilitasKesehatan({ search }: { search: string }) { filteredData.map((item) => ( - - - {item.name} - - + + {item.name} + - + {item.dokterdantenagamedis?.length ? `${item.dokterdantenagamedis.length} dokter` : '-'} - + - - - {item.tarifdanlayanan?.length - ? `${item.tarifdanlayanan.length} layanan` - : '-'} - - + + {item.tarifdanlayanan?.length + ? `${item.tarifdanlayanan.length} layanan` + : '-'} +
+ + {/* Mobile Card View */} + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + Fasilitas Kesehatan + + + {item.name} + + + + + Jumlah Dokter + + + {item.dokterdantenagamedis?.length + ? `${item.dokterdantenagamedis.length} dokter` + : '-'} + + + + + Jumlah Layanan + + + {item.tarifdanlayanan?.length + ? `${item.tarifdanlayanan.length} layanan` + : '-'} + + + + + )) + ) : ( +
+ + Tidak ada fasilitas kesehatan yang cocok + +
+ )} +
{/* Pagination */} @@ -199,7 +313,7 @@ function ListFasilitasKesehatan({ search }: { search: string }) { />
- ) + ); } -export default FasilitasKesehatan; +export default FasilitasKesehatan; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/tarif-layanan/[id]/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/tarif-layanan/[id]/page.tsx index 7ff34a37..3be7c9fa 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/tarif-layanan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/tarif-layanan/[id]/page.tsx @@ -95,7 +95,7 @@ function EditTarifLayanan() { }; return ( - + {/* Back Button + Title */} @@ -39,6 +38,7 @@ function ListTarifLayanan({ search }: { search: string }) { const router = useRouter(); const [modalHapus, setModalHapus] = useState(false); const [selectedId, setSelectedId] = useState(null); + const [debouncedSearch] = useDebouncedValue(search, 10000); const { data, @@ -46,36 +46,39 @@ function ListTarifLayanan({ search }: { search: string }) { load, page, totalPages - } = stateFasilitasKesehatan.findMany + } = stateFasilitasKesehatan.findMany; useShallowEffect(() => { - load(page, 10, search) - }, [page, search]) + load(page, 10, debouncedSearch); + }, [page, debouncedSearch]); const handleDelete = () => { if (selectedId) { stateFasilitasKesehatan.delete.byId(selectedId); setModalHapus(false); setSelectedId(null); - load(page, 10, search); + load(page, 10, debouncedSearch); } }; - const filteredData = data || [] + const filteredData = data || []; if (loading || !data) { return ( - + - ) + ); } + return ( - - + + {/* Judul + Tombol Tambah */} - Daftar Tarif dan Layanan + + Daftar Tarif dan Layanan + - {/* Tabel */} - + {/* Desktop Table */} + - Layanan - Tarif - Edit - Hapus + + + Layanan + + + + + Tarif + + + + + Edit + + + + + Hapus + + @@ -106,18 +125,16 @@ function ListTarifLayanan({ search }: { search: string }) { filteredData.map((item) => ( - + {item.layanan || '-'} - + - - - {item.tarif} - - + + {item.tarif} + - + - + @@ -148,8 +167,8 @@ function ListTarifLayanan({ search }: { search: string }) { ) : ( -
- +
+ Tidak ada fasilitas kesehatan yang cocok
@@ -159,6 +178,64 @@ function ListTarifLayanan({ search }: { search: string }) {
+ + {/* Mobile Cards */} + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + Layanan + + + {item.layanan || '-'} + + + + + Tarif + + + {item.tarif} + + + + + + + + )) + ) : ( +
+ + Tidak ada fasilitas kesehatan yang cocok + +
+ )} +
{/* Pagination */} @@ -176,6 +253,7 @@ function ListTarifLayanan({ search }: { search: string }) { radius="md" /> + setModalHapus(false)} @@ -183,7 +261,7 @@ function ListTarifLayanan({ search }: { search: string }) { text="Apakah anda yakin ingin menghapus tarif layanan ini?" />
- ) + ); } -export default TarifLayanan; +export default TarifLayanan; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/edit/page.tsx index 9252f2e4..3e1cf301 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/edit/page.tsx @@ -145,7 +145,7 @@ function EditJadwalKegiatan() { }; return ( - + {/* Header */} - {/* Tabel */} - + {/* Desktop Table */} + - Nama - Tanggal - Waktu - Lokasi - Aksi + Nama + Tanggal + Waktu + Lokasi + Aksi @@ -100,14 +101,12 @@ function ListJadwalKegiatan({ search }: { search: string }) { filteredData.map((item) => ( - - - {item.informasijadwalkegiatan.name} - - + + {item.informasijadwalkegiatan.name} + - + {new Date(item.informasijadwalkegiatan.tanggal).toLocaleDateString( 'id-ID', { @@ -116,19 +115,17 @@ function ListJadwalKegiatan({ search }: { search: string }) { year: 'numeric', } )} - + - + {item.informasijadwalkegiatan.waktu} - + - - - {item.informasijadwalkegiatan.lokasi} - - + + {item.informasijadwalkegiatan.lokasi} + @@ -149,8 +148,8 @@ function ListJadwalKegiatan({ search }: { search: string }) { ) : ( -
- +
+ Tidak ada jadwal kegiatan yang cocok
@@ -160,6 +159,72 @@ function ListJadwalKegiatan({ search }: { search: string }) {
+ + {/* Mobile Cards */} + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + Nama + + {item.informasijadwalkegiatan.name} + + + + Tanggal + + {new Date(item.informasijadwalkegiatan.tanggal).toLocaleDateString( + 'id-ID', + { + day: '2-digit', + month: 'long', + year: 'numeric', + } + )} + + + + Waktu + + {item.informasijadwalkegiatan.waktu} + + + + Lokasi + + {item.informasijadwalkegiatan.lokasi} + + + + + + + + )) + ) : ( +
+ + Tidak ada jadwal kegiatan yang cocok + +
+ )} +
{/* Pagination */} @@ -181,4 +246,4 @@ function ListJadwalKegiatan({ search }: { search: string }) { ); } -export default JadwalKegiatan; +export default JadwalKegiatan; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/penderita_penyakit/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/penderita_penyakit/[id]/edit/page.tsx index f135f7b2..8fb38ec1 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/penderita_penyakit/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/penderita_penyakit/[id]/edit/page.tsx @@ -110,7 +110,7 @@ function EditGrafikHasilKepuasan() { }; return ( - + {/* Header */} - {/* Tabel */} - + {/* Desktop Table */} + @@ -146,29 +162,21 @@ function ListGrafikHasilKepuasanMasyarakat({ search }: { search: string }) { {filteredData.length > 0 ? ( filteredData.map((item) => ( - - - {item.nama} - + + {item.nama} - - - {new Date(item.tanggal).toLocaleDateString('id-ID', { - day: '2-digit', - month: 'long', - year: 'numeric', - })} - + + {new Date(item.tanggal).toLocaleDateString('id-ID', { + day: '2-digit', + month: 'long', + year: 'numeric', + })} - - - {item.jenisKelamin} - + + {item.jenisKelamin} - - - {item.penyakit} - + + {item.penyakit} @@ -190,7 +200,7 @@ function ListGrafikHasilKepuasanMasyarakat({ search }: { search: string }) {
- + Tidak ada data kepuasan masyarakat yang cocok
@@ -200,6 +210,72 @@ function ListGrafikHasilKepuasanMasyarakat({ search }: { search: string }) {
+ + {/* Mobile Card View */} + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + Nama + + + {item.nama} + + + + Tanggal + + + {new Date(item.tanggal).toLocaleDateString('id-ID', { + day: '2-digit', + month: 'long', + year: 'numeric', + })} + + + + Jenis Kelamin + + + {item.jenisKelamin} + + + + Penyakit + + + {item.penyakit} + + + + + + )) + ) : ( +
+ + Tidak ada data kepuasan masyarakat yang cocok + +
+ )} +
{/* Pagination */} @@ -218,38 +294,47 @@ function ListGrafikHasilKepuasanMasyarakat({ search }: { search: string }) { /> - {/* Chart */} - - - Penderita Penyakit - {mounted && diseaseChartData.length > 0 ? ( -
- - - - - - - -
- ) : ( - Belum ada data untuk ditampilkan dalam grafik - )} -
-
-
+ {/* Chart Section */} + + + Penderita Penyakit + + + {mounted && diseaseChartData.length > 0 ? ( +
+ + + + + + + +
+ ) : ( +
+ + Belum ada data untuk ditampilkan dalam grafik + +
+ )} +
+
); } -export default GrafikHasilKepuasanMasyarakat; +export default GrafikHasilKepuasanMasyarakat; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/[id]/edit/page.tsx index ae458717..5cb84c0b 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/[id]/edit/page.tsx @@ -106,7 +106,7 @@ function EditKelahiran() { }; return ( - + {/* Header */} - {/* Header Search */} setSearch(e.currentTarget.value)} /> - ); @@ -61,34 +58,32 @@ function Kelahiran() { function ListKelahiran({ search }: { search: string }) { const statePersentase = useProxy(persentasekelahiran.kelahiran); const router = useRouter(); - + const [debouncedSearch] = useDebouncedValue(search, 1000); // 500ms delay const { data, page, totalPages, loading, load } = statePersentase.findMany; - useShallowEffect(() => { - load(page, 10, search); - }, [page, search]); - + load(page, 10, debouncedSearch); + }, [page, debouncedSearch]); const filteredData = data || []; - if (loading || !data) { return ( - + ); } - return ( - - + + {/* Judul + Tombol Tambah */} - - Daftar Data Kelahiran + + + Daftar Data Kelahiran + - - {/* Tabel */} - - + {/* Desktop Table */} + +
- Nama - Tanggal - Jenis Kelamin - Alamat - Aksi + Nama + Tanggal + Jenis Kelamin + Alamat + Aksi @@ -121,32 +115,28 @@ function ListKelahiran({ search }: { search: string }) { filteredData.map((item) => ( - - - {item.nama} - - + + {item.nama} + - + {new Date(item.tanggal).toLocaleDateString('id-ID', { day: '2-digit', month: 'long', year: 'numeric', })} - + - + {item.jenisKelamin} - + - - - {item.alamat} - - + + {item.alamat} + @@ -167,8 +158,8 @@ function ListKelahiran({ search }: { search: string }) { ) : ( -
- +
+ Tidak ada data kelahiran yang cocok
@@ -178,27 +169,83 @@ function ListKelahiran({ search }: { search: string }) {
+ + {/* Mobile Card View */} + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + Nama + {item.nama} + + + Tanggal + + {new Date(item.tanggal).toLocaleDateString('id-ID', { + day: '2-digit', + month: 'long', + year: 'numeric', + })} + + + + Jenis Kelamin + {item.jenisKelamin} + + + Alamat + {item.alamat} + + + + + + + )) + ) : ( +
+ + Tidak ada data kelahiran yang cocok + +
+ )} +
- {/* Pagination */} -
- { - load(newPage, 10); - window.scrollTo({ top: 0, behavior: 'smooth' }); - }} - total={totalPages} - mt="md" - mb="md" - color="blue" - radius="md" - /> -
-
+ {totalPages > 1 && ( +
+ { + load(newPage, 10); + window.scrollTo({ top: 0, behavior: 'smooth' }); + }} + total={totalPages} + mt="md" + mb="md" + color="blue" + radius="md" + /> +
+ )} +
); } - export default Kelahiran; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/[id]/edit/page.tsx index 2606a523..72dac9dc 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/[id]/edit/page.tsx @@ -114,7 +114,7 @@ function EditKematian() { }; return ( - + {/* Header */} - {/* Header dengan Search */} setSearch(e.currentTarget.value)} /> - ); } - function ListKematian({ search }: { search: string }) { const statePersentase = useProxy(persentasekelahiran.kematian); const router = useRouter(); - + const [debouncedSearch] = useDebouncedValue(search, 1000); const { data, page, totalPages, loading, load } = statePersentase.findMany; - useShallowEffect(() => { - load(page, 10, search); - }, [page, search]); - + load(page, 10, debouncedSearch); + }, [page, debouncedSearch]); const filteredData = data || []; - if (loading || !data) { return ( - + ); } - return ( - - + + - Daftar Data Kematian + Daftar Data Kematian + Daftar Data Kematian - - + {/* Tabel untuk desktop */} + - Nama - Tanggal - Jenis Kelamin - Alamat - Aksi + Nama + Tanggal + Jenis Kelamin + Alamat + Aksi @@ -119,45 +111,39 @@ function ListKematian({ search }: { search: string }) { filteredData.map((item) => ( - - - {item.nama} - - + + {item.nama} + - + {new Date(item.tanggal).toLocaleDateString('id-ID', { day: '2-digit', month: 'long', year: 'numeric', })} - + - - {item.jenisKelamin} - + {item.jenisKelamin} - - - {item.alamat} - - + + {item.alamat} + @@ -165,8 +151,8 @@ function ListKematian({ search }: { search: string }) { ) : ( -
- +
+ Tidak ada data kematian yang cocok
@@ -176,27 +162,80 @@ function ListKematian({ search }: { search: string }) {
+ + {/* Card untuk mobile */} + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + Nama + {item.nama} + + + Tanggal + + {new Date(item.tanggal).toLocaleDateString('id-ID', { + day: '2-digit', + month: 'long', + year: 'numeric', + })} + + + + Jenis Kelamin + {item.jenisKelamin} + + + Alamat + {item.alamat} + + + + + + + )) + ) : ( +
+ + Tidak ada data kematian yang cocok + +
+ )} +
- {/* Pagination */} -
- { - load(newPage, 10, search); - window.scrollTo({ top: 0, behavior: 'smooth' }); - }} - total={totalPages} - mt="md" - mb="md" - color="blue" - radius="md" - /> -
+ {totalPages > 1 && ( +
+ { + load(newPage, 10, search); + window.scrollTo({ top: 0, behavior: 'smooth' }); + }} + total={totalPages} + color="blue" + radius="md" + /> +
+ )}
); } - export default Kematian; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/page.tsx index 97f198bd..fa678124 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/page.tsx @@ -3,275 +3,317 @@ 'use client' import persentasekelahiran from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/persentaseKelahiran'; import colors from '@/con/colors'; -import { ActionIcon, Badge, Box, Center, Flex, Tooltip as MantineTooltip, Paper, Select, Skeleton, Stack, Table, Text, Title } from '@mantine/core'; +import { ActionIcon, Badge, Box, Center, Flex, Group, Paper, Select, Skeleton, Stack, Table, Text, Title, Tooltip as MantineTooltip } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconBabyCarriage, IconGrave2 } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; -import { Bar, BarChart, Legend, ResponsiveContainer, Tooltip, TooltipProps, XAxis, YAxis } from 'recharts'; +import { Bar, BarChart, Legend, ResponsiveContainer, Tooltip as RechartsTooltip, TooltipProps, XAxis, YAxis } from 'recharts'; import { useProxy } from 'valtio/utils'; - type TooltipPayload = { - name: string; - value: number; - payload: any; - color: string; - dataKey: string; + name: string; + value: number; + payload: any; + color: string; + dataKey: string; }; - type CustomTooltipProps = TooltipProps & { - active?: boolean; - payload?: TooltipPayload[]; - label?: string; + active?: boolean; + payload?: TooltipPayload[]; + label?: string; }; - function PersentaseDataKelahiranKematian() { - return ( - - - - ); + return ( + + + + ); } - function GrafikPersentaseKelahiranKematian() { - const router = useRouter(); + const router = useRouter(); + type DataTahunan = { + tahun: string; + totalKelahiran: number; + totalKematian: number; + data: Array<{ + id: string; + bulan: string; + kelahiran: number; + kematian: number; + }>; + }; - type DataTahunan = { - tahun: string; - totalKelahiran: number; - totalKematian: number; - data: Array<{ - id: string; - bulan: string; - kelahiran: number; - kematian: number; - }>; - }; + // ✅ Fungsi hitung tahunan + bulanan + const countByYearAndMonth = (kelahiran: any[], kematian: any[]): DataTahunan[] => { + const dataTahunan: Record = {}; + const namaBulan = [ + 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', + 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember' + ]; - // ✅ Fungsi hitung tahunan + bulanan - const countByYearAndMonth = (kelahiran: any[], kematian: any[]): DataTahunan[] => { - const dataTahunan: Record = {}; + kelahiran?.forEach((item: any) => { + const date = new Date(item.tanggal); + const tahun = date.getFullYear().toString(); + const bulanIndex = date.getMonth(); + if (!dataTahunan[tahun]) { + dataTahunan[tahun] = { + tahun, + totalKelahiran: 0, + totalKematian: 0, + data: namaBulan.map((nama, idx) => ({ + id: `${tahun}-${idx + 1}`, + bulan: nama, + kelahiran: 0, + kematian: 0 + })) + }; + } - const namaBulan = [ - 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', - 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember' - ]; + dataTahunan[tahun].totalKelahiran += 1; + dataTahunan[tahun].data[bulanIndex].kelahiran += 1; + }); + kematian?.forEach((item: any) => { + const date = new Date(item.tanggal); + const tahun = date.getFullYear().toString(); + const bulanIndex = date.getMonth(); - // Proses kelahiran - kelahiran?.forEach((item: any) => { - const date = new Date(item.tanggal); - const tahun = date.getFullYear().toString(); - const bulanIndex = date.getMonth(); + if (!dataTahunan[tahun]) { + dataTahunan[tahun] = { + tahun, + totalKelahiran: 0, + totalKematian: 0, + data: namaBulan.map((nama, idx) => ({ + id: `${tahun}-${idx + 1}`, + bulan: nama, + kelahiran: 0, + kematian: 0 + })) + }; + } + dataTahunan[tahun].totalKematian += 1; + dataTahunan[tahun].data[bulanIndex].kematian += 1; + }); - if (!dataTahunan[tahun]) { - dataTahunan[tahun] = { - tahun, - totalKelahiran: 0, - totalKematian: 0, - data: namaBulan.map((nama, idx) => ({ - id: `${tahun}-${idx + 1}`, - bulan: nama, - kelahiran: 0, - kematian: 0 - })) - }; - } + return Object.values(dataTahunan).sort((a, b) => parseInt(a.tahun) - parseInt(b.tahun)); + }; + const statePersentase = useProxy(persentasekelahiran); + const [chartData, setChartData] = useState([]); + const [selectedYear, setSelectedYear] = useState(null); - dataTahunan[tahun].totalKelahiran += 1; - dataTahunan[tahun].data[bulanIndex].kelahiran += 1; - }); + const formatNumber = (num: number) => new Intl.NumberFormat('id-ID').format(num); + const CustomTooltip = ({ active, payload, label }: CustomTooltipProps) => { + if (active && payload && payload.length) { + return ( + + Tahun {label} + Kelahiran: {formatNumber(payload[0].value)} + Kematian: {formatNumber(payload[1].value)} + + ); + } + return null; + }; - // Proses kematian - kematian?.forEach((item: any) => { - const date = new Date(item.tanggal); - const tahun = date.getFullYear().toString(); - const bulanIndex = date.getMonth(); + useShallowEffect(() => { + statePersentase.kelahiran.findMany.load(1, 1000); + statePersentase.kematian.findMany.load(1, 1000); + }, []); + useEffect(() => { + if (statePersentase.kelahiran.findMany.data && statePersentase.kematian.findMany.data) { + const hasil = countByYearAndMonth( + statePersentase.kelahiran.findMany.data, + statePersentase.kematian.findMany.data + ); - if (!dataTahunan[tahun]) { - dataTahunan[tahun] = { - tahun, - totalKelahiran: 0, - totalKematian: 0, - data: namaBulan.map((nama, idx) => ({ - id: `${tahun}-${idx + 1}`, - bulan: nama, - kelahiran: 0, - kematian: 0 - })) - }; - } + setChartData(hasil); + setSelectedYear(hasil[0]?.tahun || null); + } + }, [statePersentase.kelahiran.findMany.data, statePersentase.kematian.findMany.data]); + if (!statePersentase.kelahiran.findMany.data || !statePersentase.kematian.findMany.data) { + return ; + } - dataTahunan[tahun].totalKematian += 1; - dataTahunan[tahun].data[bulanIndex].kematian += 1; - }); + const selectedYearData = chartData.find(d => d.tahun === selectedYear); + return ( + + + + + Statistik Kelahiran & Kematian + + + + router.push('/admin/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran')}> + + + + + router.push('/admin/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian')}> + + + + + - return Object.values(dataTahunan).sort((a, b) => parseInt(a.tahun) - parseInt(b.tahun)); - }; + {chartData.length === 0 ? ( +
+ + Belum ada data untuk ditampilkan + +
+ ) : ( + <> + + ({ value: item.tahun, label: item.tahun }))} - value={selectedYear} - onChange={(value) => setSelectedYear(value || null)} - size="sm" - radius="md" - /> - - - - - - - - - } /> - - - - - - - - - {selectedYearData && ( - - - Rincian Tahun {selectedYear} - {formatNumber(selectedYearData.totalKelahiran)} kelahiran - {formatNumber(selectedYearData.totalKematian)} kematian - - - - - Bulan - Kelahiran - Kematian - - - - {selectedYearData.data.length > 0 ? ( - <> - {selectedYearData.data.map((item) => ( - - {item.bulan} - {formatNumber(item.kelahiran)} - {formatNumber(item.kematian)} - - ))} - - Total - {formatNumber(selectedYearData.totalKelahiran)} - {formatNumber(selectedYearData.totalKematian)} - - - ) : ( - - Tidak ada rincian bulanan - - )} - -
-
- )} - - )} -
-
- ); + {/* Total row mobile */} + {selectedYearData.data.length > 0 && ( + + Total + + Kelahiran + + {formatNumber(selectedYearData.totalKelahiran)} + + + + Kematian + + {formatNumber(selectedYearData.totalKematian)} + + + + )} +
+ + + )} + + )} + + + ); } - export default PersentaseDataKelahiranKematian; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/[id]/edit/page.tsx index 39473173..286a6e29 100644 --- a/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/[id]/edit/page.tsx @@ -141,7 +141,7 @@ function EditInfoWabahPenyakit() { }; return ( - + {/* Header */} - {/* Tabel */} - + {/* Desktop Table */} + @@ -100,16 +106,19 @@ function ListInfoWabahPenyakit({ search }: { search: string }) { filteredData.map((item) => ( - - - {item.name} - - + + {item.name} + - - - + )) ) : ( - -
- + +
+ Tidak ada data info wabah penyakit yang cocok
@@ -137,6 +148,53 @@ function ListInfoWabahPenyakit({ search }: { search: string }) {
+ + {/* Mobile Card List */} + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + Judul + + + {item.name} + + + + Deskripsi Singkat + + + + + + + )) + ) : ( +
+ + Tidak ada data info wabah penyakit yang cocok + +
+ )} +
{/* Pagination */} @@ -144,8 +202,8 @@ function ListInfoWabahPenyakit({ search }: { search: string }) { { - load(newPage, 10) - window.scrollTo({ top: 0, behavior: 'smooth' }) + load(newPage, 10); + window.scrollTo({ top: 0, behavior: 'smooth' }); }} total={totalPages} mt="md" @@ -155,7 +213,7 @@ function ListInfoWabahPenyakit({ search }: { search: string }) { />
- ) + ); } -export default InfoWabahPenyakit; +export default InfoWabahPenyakit; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/kesehatan/kontak-darurat/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/kontak-darurat/[id]/edit/page.tsx index 21af40ca..9244a2fc 100644 --- a/src/app/admin/(dashboard)/kesehatan/kontak-darurat/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/kontak-darurat/[id]/edit/page.tsx @@ -128,7 +128,7 @@ function EditKontakDarurat() { if (loading) return Loading...; return ( - + - - + + Daftar Kontak Darurat + + - {/* Tabel */} - + {/* Desktop Table */} + @@ -98,16 +97,12 @@ function ListKontakDarurat({ search }: { search: string }) { filteredData.map((item) => ( - - - {item.name} - - + + {item.name} + - - - + )) ) : ( - +
- Tidak ada data kontak darurat yang cocok + Tidak ada data kontak darurat yang cocok
@@ -133,6 +128,40 @@ function ListKontakDarurat({ search }: { search: string }) {
+ + {/* Mobile Card View */} + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + Judul + {item.name} + + + Deskripsi + + + + + + )) + ) : ( +
+ Tidak ada data kontak darurat yang cocok +
+ )} +
{/* Pagination */} @@ -151,7 +180,7 @@ function ListKontakDarurat({ search }: { search: string }) { />
- ) + ); } -export default KontakDarurat; +export default KontakDarurat; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/[id]/edit/page.tsx index ecf4d166..1cb79f35 100644 --- a/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/[id]/edit/page.tsx @@ -144,7 +144,7 @@ function EditPenangananDarurat() { if (loading) return Loading...; return ( - + {/* Header */} - {/* Tabel */} - + {/* Desktop Table */} + - Judul - Deskripsi - Aksi + Judul + Deskripsi + Aksi @@ -95,22 +101,19 @@ function ListPenangananDarurat({ search }: { search: string }) { filteredData.map((item) => ( - - - {item.name} - - + + {item.name} + - - - + )) ) : ( - +
- Tidak ada data penanganan darurat + + Tidak ada data penanganan darurat +
@@ -138,6 +143,56 @@ function ListPenangananDarurat({ search }: { search: string }) {
+ + {/* Mobile Card View */} + + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + Judul + + {item.name} + + + + Deskripsi + + + + + + + + )) + ) : ( +
+ + Tidak ada data penanganan darurat + +
+ )} +
+
{/* Pagination */} @@ -159,4 +214,4 @@ function ListPenangananDarurat({ search }: { search: string }) { ); } -export default PenangananDarurat; +export default PenangananDarurat; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/kesehatan/posyandu/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/posyandu/[id]/edit/page.tsx index 8882f40a..61422ed9 100644 --- a/src/app/admin/(dashboard)/kesehatan/posyandu/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/posyandu/[id]/edit/page.tsx @@ -124,7 +124,7 @@ function EditPosyandu() { }; return ( - + {/* Tombol Back */} - + + {/* Desktop Table */} + - Nama Posyandu - Nomor Posyandu - Deskripsi - Aksi + Nama Posyandu + Nomor Posyandu + Deskripsi + Aksi {filteredData.length > 0 ? ( filteredData.map((item) => ( - - - - {item.name} - - + + + {item.name} + - - - - {item.nomor || '-'} - - + + + {item.nomor || '-'} + - - - - + + - + @@ -143,7 +138,9 @@ function ListPosyandu({ search }: { search: string }) {
- Tidak ada data posyandu yang cocok + + Tidak ada data posyandu yang cocok +
@@ -151,7 +148,66 @@ function ListPosyandu({ search }: { search: string }) {
+ + {/* Mobile Cards */} + + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + + Nama Posyandu + + + {item.name} + + + + + Nomor Posyandu + + + {item.nomor || '-'} + + + + + Deskripsi + + + + + + + )) + ) : ( +
+ + Tidak ada data posyandu yang cocok + +
+ )} +
+
+
+ - {/* Tabel */} - + {/* Desktop Table */} + - Judul - Deskripsi Singkat - Deskripsi - Aksi + + Judul + + + Deskripsi Singkat + + + Deskripsi + + + Aksi + @@ -95,28 +106,25 @@ function ListProgramKesehatan({ search }: { search: string }) { filteredData.map((item) => ( - + {item.name} - - - - + + - - - - + + @@ -125,7 +133,9 @@ function ListProgramKesehatan({ search }: { search: string }) {
- Tidak ada program kesehatan yang cocok + + Tidak ada program kesehatan yang cocok +
@@ -133,6 +143,52 @@ function ListProgramKesehatan({ search }: { search: string }) {
+ + {/* Mobile Card View */} + + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + Judul + {item.name} + + + Deskripsi Singkat + + + + + + Deskripsi + + + + + + + + )) + ) : ( +
+ + Tidak ada program kesehatan yang cocok + +
+ )} +
+
{/* Pagination */} @@ -154,4 +210,4 @@ function ListProgramKesehatan({ search }: { search: string }) { ); } -export default ProgramKesehatan; +export default ProgramKesehatan; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/kesehatan/puskesmas/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/puskesmas/[id]/edit/page.tsx index 4b3a4350..93fcc4d0 100644 --- a/src/app/admin/(dashboard)/kesehatan/puskesmas/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/puskesmas/[id]/edit/page.tsx @@ -201,7 +201,7 @@ function EditPuskesmas() { }; return ( - + {/* Header dengan tombol back */} + - + {/* Desktop Table */} + - Nama Puskesmas - Alamat - Kontak - Aksi + + + Nama Puskesmas + + + + + Alamat + + + + + Kontak + + + + + Aksi + + @@ -95,34 +113,33 @@ function ListPuskesmas({ search }: { search: string }) { filteredData.map((item) => ( - - - {item.name} - - + + {item.name} + - - - {item.alamat} - - + + {item.alamat} + - - - {item.kontak.kontakPuskesmas} - - + + {item.kontak.kontakPuskesmas} + @@ -130,8 +147,10 @@ function ListPuskesmas({ search }: { search: string }) { ) : ( -
- Tidak ada data puskesmas yang cocok +
+ + Tidak ada data puskesmas yang cocok +
@@ -139,6 +158,61 @@ function ListPuskesmas({ search }: { search: string }) {
+ + {/* Mobile Cards */} + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + + Nama Puskesmas + + + {item.name} + + + + + Alamat + + + {item.alamat} + + + + + Kontak + + + {item.kontak.kontakPuskesmas} + + + + + + )) + ) : ( +
+ + Tidak ada data puskesmas yang cocok + +
+ )} +
{/* Pagination */} @@ -150,8 +224,7 @@ function ListPuskesmas({ search }: { search: string }) { window.scrollTo({ top: 0, behavior: 'smooth' }); }} total={totalPages} - mt="md" - mb="md" + my="md" color="blue" radius="md" /> @@ -160,4 +233,4 @@ function ListPuskesmas({ search }: { search: string }) { ); } -export default Puskesmas; +export default Puskesmas; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/landing-page/SDGs/page.tsx b/src/app/admin/(dashboard)/landing-page/SDGs/page.tsx index d9ce5d93..14a04a97 100644 --- a/src/app/admin/(dashboard)/landing-page/SDGs/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/SDGs/page.tsx @@ -60,7 +60,7 @@ function ListSdgsDesa({ search }: { search: string }) { - + <Title order={4} lh={1.2}> Daftar Sdgs Desa