diff --git a/eslint.config.mjs b/eslint.config.mjs index c85fb67c..88977ce6 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -11,6 +11,11 @@ const compat = new FlatCompat({ const eslintConfig = [ ...compat.extends("next/core-web-vitals", "next/typescript"), + { + rules: { + "@typescript-eslint/no-explicit-any": "warn", + }, + }, ]; export default eslintConfig; diff --git a/prisma/_seeder_list/ekonomi/seed_struktur_bumdes.ts b/prisma/_seeder_list/ekonomi/seed_struktur_bumdes.ts index da37dc5b..8258beac 100644 --- a/prisma/_seeder_list/ekonomi/seed_struktur_bumdes.ts +++ b/prisma/_seeder_list/ekonomi/seed_struktur_bumdes.ts @@ -1,8 +1,28 @@ import prisma from "@/lib/prisma"; import { loadJsonData } from "../../load-json"; -const posisiOrganisasiBumDes = loadJsonData("ekonomi/struktur-organisasi/posisi-organisasi-bumdes.json"); -const pegawai = loadJsonData("ekonomi/struktur-organisasi/pegawai-bumdes.json"); +interface PosisiOrganisasi { + id: string; + nama: string; + deskripsi: string; + hierarki: number; + parentId: string | null; +} + +interface PegawaiBumDes { + id: string; + namaLengkap: string; + gelarAkademik: string; + tanggalMasuk: string; + email: string; + telepon: string; + alamat: string; + posisiId: string; + isActive: boolean; +} + +const posisiOrganisasiBumDes = loadJsonData("ekonomi/struktur-organisasi/posisi-organisasi-bumdes.json"); +const pegawai = loadJsonData("ekonomi/struktur-organisasi/pegawai-bumdes.json"); export async function seedStrukturBumdes() { const flattenedPosisi = posisiOrganisasiBumDes.flat(); diff --git a/prisma/_seeder_list/ppid/struktur-ppid/seed_struktur_ppid.ts b/prisma/_seeder_list/ppid/struktur-ppid/seed_struktur_ppid.ts index efc45dd4..6ef08f5f 100644 --- a/prisma/_seeder_list/ppid/struktur-ppid/seed_struktur_ppid.ts +++ b/prisma/_seeder_list/ppid/struktur-ppid/seed_struktur_ppid.ts @@ -1,8 +1,29 @@ import prisma from "@/lib/prisma"; import { loadJsonData } from "../../../load-json"; -const pegawaiPpid = loadJsonData("ppid/struktur-ppid/pegawai-PPID.json"); -const posisiOrganisasiPPID = loadJsonData("ppid/struktur-ppid/posisi-organisasi-PPID.json"); +interface PegawaiPPID { + id: string; + namaLengkap: string; + gelarAkademik: string; + tanggalMasuk: string; + email: string; + telepon: string; + alamat: string; + imageName?: string; + posisiId: string; + isActive: boolean; +} + +interface PosisiOrganisasiPPID { + id: string; + nama: string; + deskripsi: string; + hierarki: number; + parentId: string | null; +} + +const pegawaiPpid = loadJsonData("ppid/struktur-ppid/pegawai-PPID.json"); +const posisiOrganisasiPPID = loadJsonData("ppid/struktur-ppid/posisi-organisasi-PPID.json"); export async function seedPegawaiPpid() { diff --git a/src/app/admin/(dashboard)/_state/kependudukan/dashboard.ts b/src/app/admin/(dashboard)/_state/kependudukan/dashboard.ts index 894ccbee..9b87502e 100644 --- a/src/app/admin/(dashboard)/_state/kependudukan/dashboard.ts +++ b/src/app/admin/(dashboard)/_state/kependudukan/dashboard.ts @@ -1,16 +1,35 @@ import ApiFetch from "@/lib/api-fetch"; import { proxy } from "valtio"; +interface DashboardSummary { + tahun: number; + summary: { + totalPenduduk: number; + totalKK: number; + totalKelahiran: number; + totalKemiskinan: number; + }; + dinamika: { + kelahiran: number; + kematian: number; + pindahMasuk: number; + pindahKeluar: number; + }; + agama: unknown[]; + umur: unknown[]; + banjar: unknown[]; +} + const kependudukanDashboard = proxy({ summary: { - data: null as any, + data: null as DashboardSummary | null, loading: false, async load() { kependudukanDashboard.summary.loading = true; try { const res = await ApiFetch.api.kependudukan.dashboard.summary.get(); if (res.status === 200 && res.data?.success) { - kependudukanDashboard.summary.data = res.data.data; + kependudukanDashboard.summary.data = res.data.data as unknown as DashboardSummary; } else { kependudukanDashboard.summary.data = null; } diff --git a/src/app/admin/(dashboard)/_state/kependudukan/data-banjar.ts b/src/app/admin/(dashboard)/_state/kependudukan/data-banjar.ts index d1240f3c..b134da9e 100644 --- a/src/app/admin/(dashboard)/_state/kependudukan/data-banjar.ts +++ b/src/app/admin/(dashboard)/_state/kependudukan/data-banjar.ts @@ -53,7 +53,7 @@ const dataBanjar = proxy({ }, findMany: { - data: null as any[] | null, + data: null as unknown[] | null, page: 1, totalPages: 1, loading: false, @@ -66,7 +66,7 @@ const dataBanjar = proxy({ dataBanjar.findMany.tahun = tahun; try { - const query: any = { page, limit }; + const query: Record = { page, limit }; if (search) query.search = search; if (tahun) query.tahun = tahun; @@ -90,7 +90,7 @@ const dataBanjar = proxy({ }, findUnique: { - data: null as any | null, + data: null as unknown | null, async load(id: string) { try { const res = await fetch(`/api/kependudukan/databanjar/${id}`); diff --git a/src/app/admin/(dashboard)/_state/kependudukan/distribusi-agama.ts b/src/app/admin/(dashboard)/_state/kependudukan/distribusi-agama.ts index 84dad8bf..5c8bda4d 100644 --- a/src/app/admin/(dashboard)/_state/kependudukan/distribusi-agama.ts +++ b/src/app/admin/(dashboard)/_state/kependudukan/distribusi-agama.ts @@ -49,7 +49,7 @@ const distribusiAgama = proxy({ }, findMany: { - data: null as any[] | null, + data: null as unknown[] | null, page: 1, totalPages: 1, loading: false, @@ -60,7 +60,7 @@ const distribusiAgama = proxy({ distribusiAgama.findMany.search = search; try { - const query: any = { page, limit }; + const query: Record = { page, limit }; if (tahun) query.tahun = tahun; if (search) query.search = search; @@ -84,7 +84,7 @@ const distribusiAgama = proxy({ }, findUnique: { - data: null as any | null, + data: null as unknown | null, async load(id: string) { try { const res = await fetch(`/api/kependudukan/distribusiagama/${id}`); diff --git a/src/app/admin/(dashboard)/_state/kependudukan/distribusi-umur.ts b/src/app/admin/(dashboard)/_state/kependudukan/distribusi-umur.ts index 665f2f50..7daecf03 100644 --- a/src/app/admin/(dashboard)/_state/kependudukan/distribusi-umur.ts +++ b/src/app/admin/(dashboard)/_state/kependudukan/distribusi-umur.ts @@ -49,7 +49,7 @@ const distribusiUmur = proxy({ }, findMany: { - data: null as any[] | null, + data: null as unknown[] | null, page: 1, totalPages: 1, loading: false, @@ -60,7 +60,7 @@ const distribusiUmur = proxy({ distribusiUmur.findMany.search = search; try { - const query: any = { page, limit }; + const query: Record = { page, limit }; if (tahun) query.tahun = tahun; if (search) query.search = search; @@ -84,7 +84,7 @@ const distribusiUmur = proxy({ }, findUnique: { - data: null as any | null, + data: null as unknown | null, async load(id: string) { try { const res = await fetch(`/api/kependudukan/distribusiumur/${id}`); diff --git a/src/app/admin/(dashboard)/_state/kependudukan/migrasi-penduduk.ts b/src/app/admin/(dashboard)/_state/kependudukan/migrasi-penduduk.ts index 0e7d32e3..1bcb6a74 100644 --- a/src/app/admin/(dashboard)/_state/kependudukan/migrasi-penduduk.ts +++ b/src/app/admin/(dashboard)/_state/kependudukan/migrasi-penduduk.ts @@ -55,7 +55,7 @@ const migrasiPenduduk = proxy({ }, findMany: { - data: null as any[] | null, + data: null as unknown[] | null, page: 1, totalPages: 1, loading: false, @@ -66,7 +66,7 @@ const migrasiPenduduk = proxy({ migrasiPenduduk.findMany.search = search; try { - const query: any = { page, limit }; + const query: Record = { page, limit }; if (tahun) query.tahun = tahun; if (search) query.search = search; @@ -90,7 +90,7 @@ const migrasiPenduduk = proxy({ }, findUnique: { - data: null as any | null, + data: null as unknown | null, async load(id: string) { try { const res = await fetch(`/api/kependudukan/migrasipenduduk/${id}`); diff --git a/src/app/admin/(dashboard)/kependudukan/_components/YearFilter.tsx b/src/app/admin/(dashboard)/kependudukan/_components/YearFilter.tsx index 41ef78b3..3e099d7b 100644 --- a/src/app/admin/(dashboard)/kependudukan/_components/YearFilter.tsx +++ b/src/app/admin/(dashboard)/kependudukan/_components/YearFilter.tsx @@ -1,4 +1,4 @@ -import { Select, Group } from '@mantine/core'; +import { Select } from '@mantine/core'; import { IconCalendar } from '@tabler/icons-react'; interface YearFilterProps { diff --git a/src/app/admin/(dashboard)/kependudukan/data-banjar/[id]/page.tsx b/src/app/admin/(dashboard)/kependudukan/data-banjar/[id]/page.tsx index 2bfbffa1..8f239d6c 100644 --- a/src/app/admin/(dashboard)/kependudukan/data-banjar/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kependudukan/data-banjar/[id]/page.tsx @@ -20,7 +20,7 @@ import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; import dataBanjar from '../../../_state/kependudukan/data-banjar'; -interface FormData { +interface DataBanjarForm { nama: string; penduduk: number; kk: number; @@ -33,14 +33,14 @@ export default function EditDataBanjar() { const { id } = useParams() as { id: string }; const stateDataBanjar = useProxy(dataBanjar); const [isSubmitting, setIsSubmitting] = useState(false); - const [formData, setFormData] = useState({ + const [formData, setFormData] = useState({ nama: '', penduduk: 0, kk: 0, miskin: 0, tahun: new Date().getFullYear(), }); - const [originalData, setOriginalData] = useState({ + const [originalData, setOriginalData] = useState({ nama: '', penduduk: 0, kk: 0, @@ -72,7 +72,7 @@ export default function EditDataBanjar() { stateDataBanjar.update.id = id; await stateDataBanjar.findUnique.load(id); - const data = stateDataBanjar.findUnique.data; + const data = stateDataBanjar.findUnique.data as DataBanjarForm | null; if (data) { setFormData({ nama: data.nama ?? '', @@ -101,14 +101,22 @@ export default function EditDataBanjar() { }, [id]); const handleChange = useCallback( - (field: keyof FormData) => - (value: any) => { + (field: keyof DataBanjarForm) => + (value: string | number | undefined) => { const val = field === 'penduduk' || field === 'kk' || field === 'miskin' || field === 'tahun' ? Number(value || 0) : value; - setFormData((prev) => ({ ...prev, [field]: val })); + setFormData((prev) => ({ ...prev, [field]: val as never })); + }, + [] + ); + + const handleChangeText = useCallback( + (field: keyof DataBanjarForm) => + (e: React.ChangeEvent) => { + setFormData((prev) => ({ ...prev, [field]: e.currentTarget.value as never })); }, [] ); @@ -173,7 +181,7 @@ export default function EditDataBanjar() { label="Nama Banjar" placeholder="Masukkan nama banjar" value={formData.nama} - onChange={handleChange('nama')} + onChange={handleChangeText('nama')} required /> diff --git a/src/app/admin/(dashboard)/kependudukan/data-banjar/create/page.tsx b/src/app/admin/(dashboard)/kependudukan/data-banjar/create/page.tsx index 64e8584f..51739f08 100644 --- a/src/app/admin/(dashboard)/kependudukan/data-banjar/create/page.tsx +++ b/src/app/admin/(dashboard)/kependudukan/data-banjar/create/page.tsx @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client'; import colors from '@/con/colors'; @@ -27,10 +25,6 @@ function CreateDataBanjar() { const [isSubmitting, setIsSubmitting] = useState(false); const currentYear = new Date().getFullYear(); - const yearOptions = Array.from({ length: 10 }, (_, i) => ({ - value: String(currentYear - i), - label: String(currentYear - i), - })); const isFormValid = () => { return ( diff --git a/src/app/admin/(dashboard)/kependudukan/data-banjar/page.tsx b/src/app/admin/(dashboard)/kependudukan/data-banjar/page.tsx index 36b49259..5ea4bf90 100644 --- a/src/app/admin/(dashboard)/kependudukan/data-banjar/page.tsx +++ b/src/app/admin/(dashboard)/kependudukan/data-banjar/page.tsx @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import colors from '@/con/colors'; import { @@ -89,7 +88,7 @@ function ListDataBanjar({ search, year }: { search: string; year?: number }) { load(page, 10, debouncedSearch, year); }, [page, debouncedSearch, year]); - const filteredData = data || []; + const filteredData = (data as DataBanjarType[]) || []; if (loading || !data) { return ( @@ -140,7 +139,7 @@ function ListDataBanjar({ search, year }: { search: string; year?: number }) { {filteredData.length > 0 ? ( - filteredData.map((item: DataBanjarType) => ( + filteredData.map((item) => ( {item.nama} {item.penduduk.toLocaleString('id-ID')} @@ -198,7 +197,7 @@ function ListDataBanjar({ search, year }: { search: string; year?: number }) { {filteredData.length > 0 ? ( - filteredData.map((item: DataBanjarType) => ( + filteredData.map((item) => ( diff --git a/src/app/admin/(dashboard)/kependudukan/distribusi-agama/[id]/page.tsx b/src/app/admin/(dashboard)/kependudukan/distribusi-agama/[id]/page.tsx index f382d689..6cac2c41 100644 --- a/src/app/admin/(dashboard)/kependudukan/distribusi-agama/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kependudukan/distribusi-agama/[id]/page.tsx @@ -9,7 +9,6 @@ import { Loader, Paper, Stack, - TextInput, Title, NumberInput, Select @@ -21,7 +20,7 @@ import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; import distribusiAgama from '../../../_state/kependudukan/distribusi-agama'; -interface FormData { +interface DistribusiAgamaForm { agama: string; jumlah: number; tahun: number; @@ -32,12 +31,12 @@ export default function EditDistribusiAgama() { const { id } = useParams() as { id: string }; const stateDistribusiAgama = useProxy(distribusiAgama); const [isSubmitting, setIsSubmitting] = useState(false); - const [formData, setFormData] = useState({ + const [formData, setFormData] = useState({ agama: '', jumlah: 0, tahun: new Date().getFullYear(), }); - const [originalData, setOriginalData] = useState({ + const [originalData, setOriginalData] = useState({ agama: '', jumlah: 0, tahun: new Date().getFullYear(), @@ -78,7 +77,7 @@ export default function EditDistribusiAgama() { stateDistribusiAgama.update.id = id; await stateDistribusiAgama.findUnique.load(id); - const data = stateDistribusiAgama.findUnique.data; + const data = stateDistribusiAgama.findUnique.data as DistribusiAgamaForm | null; if (data) { setFormData({ agama: data.agama ?? '', @@ -102,15 +101,18 @@ export default function EditDistribusiAgama() { loadData(); }, [id]); - const handleChange = useCallback( - (field: keyof FormData) => - (value: any) => { - const val = - field === 'jumlah' || field === 'tahun' - ? Number(value || 0) - : value; + const handleChangeNumber = useCallback( + (field: keyof DistribusiAgamaForm) => + (value: string | number) => { + setFormData((prev) => ({ ...prev, [field]: (typeof value === 'string' ? Number(value) || 0 : (value ?? 0)) as never })); + }, + [] + ); - setFormData((prev) => ({ ...prev, [field]: val })); + const handleChangeSelect = useCallback( + (field: keyof DistribusiAgamaForm) => + (value: string | null) => { + setFormData((prev) => ({ ...prev, [field]: (value || '') as never })); }, [] ); @@ -174,7 +176,7 @@ export default function EditDistribusiAgama() { placeholder="Pilih agama" data={agamaOptions} value={formData.agama} - onChange={handleChange('agama')} + onChange={handleChangeSelect('agama')} required searchable /> @@ -183,7 +185,7 @@ export default function EditDistribusiAgama() { label="Jumlah" placeholder="Masukkan jumlah" value={formData.jumlah} - onChange={handleChange('jumlah')} + onChange={handleChangeNumber('jumlah')} min={0} required /> @@ -193,7 +195,7 @@ export default function EditDistribusiAgama() { placeholder="Pilih tahun" data={yearOptions} value={String(formData.tahun)} - onChange={handleChange('tahun')} + onChange={handleChangeSelect('tahun')} required /> diff --git a/src/app/admin/(dashboard)/kependudukan/distribusi-agama/create/page.tsx b/src/app/admin/(dashboard)/kependudukan/distribusi-agama/create/page.tsx index 928d281d..59e79045 100644 --- a/src/app/admin/(dashboard)/kependudukan/distribusi-agama/create/page.tsx +++ b/src/app/admin/(dashboard)/kependudukan/distribusi-agama/create/page.tsx @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client'; import colors from '@/con/colors'; @@ -10,7 +8,6 @@ import { Loader, Paper, Stack, - TextInput, Title, NumberInput, Select diff --git a/src/app/admin/(dashboard)/kependudukan/distribusi-agama/page.tsx b/src/app/admin/(dashboard)/kependudukan/distribusi-agama/page.tsx index b7827de8..26d7e143 100644 --- a/src/app/admin/(dashboard)/kependudukan/distribusi-agama/page.tsx +++ b/src/app/admin/(dashboard)/kependudukan/distribusi-agama/page.tsx @@ -1,11 +1,9 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import colors from '@/con/colors'; import { Box, Button, Center, - Flex, Group, Pagination, Paper, @@ -23,7 +21,7 @@ import { import { useDebouncedValue, useShallowEffect } from '@mantine/hooks'; import { IconEdit, IconPlus, IconSearch, IconTrash } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { useProxy } from 'valtio/utils'; import { YearFilter } from '../_components/YearFilter'; import HeaderSearch from '../../_com/header'; @@ -87,7 +85,7 @@ function ListDistribusiAgama({ search, year }: { search: string; year?: number } load(page, 10, debouncedSearch, year); }, [page, debouncedSearch, year]); - const filteredData = data || []; + const filteredData = (data as DistribusiAgamaType[]) || []; if (loading || !data) { return ( @@ -136,7 +134,7 @@ function ListDistribusiAgama({ search, year }: { search: string; year?: number } {filteredData.length > 0 ? ( - filteredData.map((item: DistribusiAgamaType) => ( + filteredData.map((item) => ( {item.agama} {item.jumlah.toLocaleString('id-ID')} @@ -192,7 +190,7 @@ function ListDistribusiAgama({ search, year }: { search: string; year?: number } {filteredData.length > 0 ? ( - filteredData.map((item: DistribusiAgamaType) => ( + filteredData.map((item) => ( diff --git a/src/app/admin/(dashboard)/kependudukan/distribusi-umur/[id]/page.tsx b/src/app/admin/(dashboard)/kependudukan/distribusi-umur/[id]/page.tsx index 26f32af3..db247ffc 100644 --- a/src/app/admin/(dashboard)/kependudukan/distribusi-umur/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kependudukan/distribusi-umur/[id]/page.tsx @@ -20,7 +20,7 @@ import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; import distribusiUmur from '../../../_state/kependudukan/distribusi-umur'; -interface FormData { +interface DistribusiUmurForm { rentangUmur: string; jumlah: number; tahun: number; @@ -31,12 +31,12 @@ export default function EditDistribusiUmur() { const { id } = useParams() as { id: string }; const stateDistribusiUmur = useProxy(distribusiUmur); const [isSubmitting, setIsSubmitting] = useState(false); - const [formData, setFormData] = useState({ + const [formData, setFormData] = useState({ rentangUmur: '', jumlah: 0, tahun: new Date().getFullYear(), }); - const [originalData, setOriginalData] = useState({ + const [originalData, setOriginalData] = useState({ rentangUmur: '', jumlah: 0, tahun: new Date().getFullYear(), @@ -78,7 +78,7 @@ export default function EditDistribusiUmur() { stateDistribusiUmur.update.id = id; await stateDistribusiUmur.findUnique.load(id); - const data = stateDistribusiUmur.findUnique.data; + const data = stateDistribusiUmur.findUnique.data as DistribusiUmurForm | null; if (data) { setFormData({ rentangUmur: data.rentangUmur ?? '', @@ -102,15 +102,18 @@ export default function EditDistribusiUmur() { loadData(); }, [id]); - const handleChange = useCallback( - (field: keyof FormData) => - (value: any) => { - const val = - field === 'jumlah' || field === 'tahun' - ? Number(value || 0) - : value; + const handleChangeNumber = useCallback( + (field: keyof DistribusiUmurForm) => + (value: string | number) => { + setFormData((prev) => ({ ...prev, [field]: (typeof value === 'string' ? Number(value) || 0 : (value ?? 0)) as never })); + }, + [] + ); - setFormData((prev) => ({ ...prev, [field]: val })); + const handleChangeSelect = useCallback( + (field: keyof DistribusiUmurForm) => + (value: string | null) => { + setFormData((prev) => ({ ...prev, [field]: (value || '') as never })); }, [] ); @@ -174,7 +177,7 @@ export default function EditDistribusiUmur() { placeholder="Pilih rentang umur" data={rentangUmurOptions} value={formData.rentangUmur} - onChange={handleChange('rentangUmur')} + onChange={handleChangeSelect('rentangUmur')} required searchable /> @@ -183,7 +186,7 @@ export default function EditDistribusiUmur() { label="Jumlah" placeholder="Masukkan jumlah" value={formData.jumlah} - onChange={handleChange('jumlah')} + onChange={handleChangeNumber('jumlah')} min={0} required /> @@ -193,7 +196,7 @@ export default function EditDistribusiUmur() { placeholder="Pilih tahun" data={yearOptions} value={String(formData.tahun)} - onChange={handleChange('tahun')} + onChange={handleChangeSelect('tahun')} required /> diff --git a/src/app/admin/(dashboard)/kependudukan/distribusi-umur/create/page.tsx b/src/app/admin/(dashboard)/kependudukan/distribusi-umur/create/page.tsx index cfa3abd2..f57fae36 100644 --- a/src/app/admin/(dashboard)/kependudukan/distribusi-umur/create/page.tsx +++ b/src/app/admin/(dashboard)/kependudukan/distribusi-umur/create/page.tsx @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client'; import colors from '@/con/colors'; diff --git a/src/app/admin/(dashboard)/kependudukan/distribusi-umur/page.tsx b/src/app/admin/(dashboard)/kependudukan/distribusi-umur/page.tsx index a5e825fc..78dc62d5 100644 --- a/src/app/admin/(dashboard)/kependudukan/distribusi-umur/page.tsx +++ b/src/app/admin/(dashboard)/kependudukan/distribusi-umur/page.tsx @@ -1,11 +1,9 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import colors from '@/con/colors'; import { Box, Button, Center, - Flex, Group, Pagination, Paper, @@ -88,7 +86,7 @@ function ListDistribusiUmur({ search, year }: { search: string; year?: number }) load(page, 10, debouncedSearch, year); }, [page, debouncedSearch, year]); - const filteredData = data || []; + const filteredData = (data as DistribusiUmurType[]) || []; if (loading || !data) { return ( @@ -137,7 +135,7 @@ function ListDistribusiUmur({ search, year }: { search: string; year?: number }) {filteredData.length > 0 ? ( - filteredData.map((item: DistribusiUmurType) => ( + filteredData.map((item) => ( {item.rentangUmur} {item.jumlah.toLocaleString('id-ID')} @@ -193,7 +191,7 @@ function ListDistribusiUmur({ search, year }: { search: string; year?: number }) {filteredData.length > 0 ? ( - filteredData.map((item: DistribusiUmurType) => ( + filteredData.map((item) => ( diff --git a/src/app/admin/(dashboard)/kependudukan/migrasi-penduduk/[id]/page.tsx b/src/app/admin/(dashboard)/kependudukan/migrasi-penduduk/[id]/page.tsx index 2618bfcb..85b4582c 100644 --- a/src/app/admin/(dashboard)/kependudukan/migrasi-penduduk/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kependudukan/migrasi-penduduk/[id]/page.tsx @@ -22,7 +22,7 @@ import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; import migrasiPenduduk from '../../../_state/kependudukan/migrasi-penduduk'; -interface FormData { +interface MigrasiPendudukForm { jenis: string; nama: string; tanggal: string; @@ -36,7 +36,7 @@ export default function EditMigrasiPenduduk() { const { id } = useParams() as { id: string }; const stateMigrasiPenduduk = useProxy(migrasiPenduduk); const [isSubmitting, setIsSubmitting] = useState(false); - const [formData, setFormData] = useState({ + const [formData, setFormData] = useState({ jenis: '', nama: '', tanggal: '', @@ -44,7 +44,7 @@ export default function EditMigrasiPenduduk() { alasan: '', jenisKelamin: '', }); - const [originalData, setOriginalData] = useState({ + const [originalData, setOriginalData] = useState({ jenis: '', nama: '', tanggal: '', @@ -81,7 +81,7 @@ export default function EditMigrasiPenduduk() { stateMigrasiPenduduk.update.id = id; await stateMigrasiPenduduk.findUnique.load(id); - const data = stateMigrasiPenduduk.findUnique.data; + const data = stateMigrasiPenduduk.findUnique.data as MigrasiPendudukForm | null; if (data) { setFormData({ jenis: data.jenis ?? '', @@ -111,11 +111,18 @@ export default function EditMigrasiPenduduk() { loadData(); }, [id]); - const handleChange = useCallback( - (field: keyof FormData) => - (value: any) => { - const val = value || ''; - setFormData((prev) => ({ ...prev, [field]: val })); + const handleChangeText = useCallback( + (field: keyof MigrasiPendudukForm) => + (e: React.ChangeEvent) => { + setFormData((prev) => ({ ...prev, [field]: e.currentTarget.value as never })); + }, + [] + ); + + const handleChangeSelect = useCallback( + (field: keyof MigrasiPendudukForm) => + (value: string | null) => { + setFormData((prev) => ({ ...prev, [field]: (value || '') as never })); }, [] ); @@ -182,7 +189,7 @@ export default function EditMigrasiPenduduk() { placeholder="Pilih jenis migrasi" data={jenisOptions} value={formData.jenis} - onChange={handleChange('jenis')} + onChange={handleChangeSelect('jenis')} required /> @@ -190,7 +197,7 @@ export default function EditMigrasiPenduduk() { label="Nama" placeholder="Masukkan nama lengkap" value={formData.nama} - onChange={handleChange('nama')} + onChange={handleChangeText('nama')} required /> @@ -211,7 +218,7 @@ export default function EditMigrasiPenduduk() { label={formData.jenis === 'MASUK' ? 'Asal' : 'Tujuan'} placeholder={formData.jenis === 'MASUK' ? 'Masukkan asal' : 'Masukkan tujuan'} value={formData.asalTujuan} - onChange={handleChange('asalTujuan')} + onChange={handleChangeText('asalTujuan')} required /> @@ -219,7 +226,7 @@ export default function EditMigrasiPenduduk() { label="Alasan" placeholder="Masukkan alasan (opsional)" value={formData.alasan} - onChange={handleChange('alasan')} + onChange={handleChangeText('alasan')} autosize minRows={2} /> @@ -229,7 +236,7 @@ export default function EditMigrasiPenduduk() { placeholder="Pilih jenis kelamin" data={jenisKelaminOptions} value={formData.jenisKelamin} - onChange={handleChange('jenisKelamin')} + onChange={handleChangeSelect('jenisKelamin')} /> diff --git a/src/app/admin/(dashboard)/kependudukan/migrasi-penduduk/create/page.tsx b/src/app/admin/(dashboard)/kependudukan/migrasi-penduduk/create/page.tsx index 1161a378..506148c1 100644 --- a/src/app/admin/(dashboard)/kependudukan/migrasi-penduduk/create/page.tsx +++ b/src/app/admin/(dashboard)/kependudukan/migrasi-penduduk/create/page.tsx @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client'; import colors from '@/con/colors'; diff --git a/src/app/admin/(dashboard)/kependudukan/migrasi-penduduk/page.tsx b/src/app/admin/(dashboard)/kependudukan/migrasi-penduduk/page.tsx index 57b49f85..e8ec2ec7 100644 --- a/src/app/admin/(dashboard)/kependudukan/migrasi-penduduk/page.tsx +++ b/src/app/admin/(dashboard)/kependudukan/migrasi-penduduk/page.tsx @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import colors from '@/con/colors'; import { @@ -89,7 +88,7 @@ function ListMigrasiPenduduk({ search, year }: { search: string; year?: number } load(page, 10, debouncedSearch, year); }, [page, debouncedSearch, year]); - const filteredData = data || []; + const filteredData = (data as MigrasiPendudukType[]) || []; if (loading || !data) { return ( @@ -152,7 +151,7 @@ function ListMigrasiPenduduk({ search, year }: { search: string; year?: number } {filteredData.length > 0 ? ( - filteredData.map((item: MigrasiPendudukType) => ( + filteredData.map((item) => ( {filteredData.length > 0 ? ( - filteredData.map((item: MigrasiPendudukType) => ( + filteredData.map((item) => ( diff --git a/src/app/api/[[...slugs]]/_lib/kependudukan/dashboard/summary.ts b/src/app/api/[[...slugs]]/_lib/kependudukan/dashboard/summary.ts index 8d4eecdb..fbfb97c6 100644 --- a/src/app/api/[[...slugs]]/_lib/kependudukan/dashboard/summary.ts +++ b/src/app/api/[[...slugs]]/_lib/kependudukan/dashboard/summary.ts @@ -10,7 +10,6 @@ export default async function dashboardSummary() { totalKK, totalKelahiran, totalKemiskinan, - kelahiranData, kematianData, pindahMasukData, pindahKeluarData, diff --git a/src/app/api/[[...slugs]]/_lib/kependudukan/migrasi-penduduk/create.ts b/src/app/api/[[...slugs]]/_lib/kependudukan/migrasi-penduduk/create.ts index be309db3..8fc5742d 100644 --- a/src/app/api/[[...slugs]]/_lib/kependudukan/migrasi-penduduk/create.ts +++ b/src/app/api/[[...slugs]]/_lib/kependudukan/migrasi-penduduk/create.ts @@ -1,38 +1,34 @@ import prisma from "@/lib/prisma"; -import { Prisma } from "@prisma/client"; import { Context } from "elysia"; -type FormCreate = Prisma.MigrasiPendudukGetPayload<{ - select: { - jenis: true; - nama: true; - tanggal: true; - asalTujuan: true; - alasan: true; - jenisKelamin: true; - } -}> +type FormCreate = { + jenis: string; + nama: string; + tanggal: string; + asalTujuan: string; + alasan: string | null; +} export default async function migrasiPendudukCreate(context: Context) { const body = context.body as FormCreate; + const isMasuk = body.jenis === 'MASUK'; + const created = await prisma.migrasiPenduduk.create({ data: { - jenis: body.jenis, + jenis: body.jenis as 'MASUK' | 'KELUAR', nama: body.nama, tanggal: new Date(body.tanggal), - asalTujuan: body.asalTujuan, + asal: isMasuk ? body.asalTujuan : undefined, + tujuan: !isMasuk ? body.asalTujuan : undefined, alasan: body.alasan, - jenisKelamin: body.jenisKelamin, }, select: { id: true, jenis: true, nama: true, tanggal: true, - asalTujuan: true, alasan: true, - jenisKelamin: true, } }); return { diff --git a/src/app/api/[[...slugs]]/_lib/kependudukan/migrasi-penduduk/updt.ts b/src/app/api/[[...slugs]]/_lib/kependudukan/migrasi-penduduk/updt.ts index 904ae1e6..edcd538b 100644 --- a/src/app/api/[[...slugs]]/_lib/kependudukan/migrasi-penduduk/updt.ts +++ b/src/app/api/[[...slugs]]/_lib/kependudukan/migrasi-penduduk/updt.ts @@ -11,13 +11,12 @@ export default async function migrasiPendudukUpdate(context: Context) { } } - const {jenis, nama, tanggal, asalTujuan, alasan, jenisKelamin} = context.body as { + const {jenis, nama, tanggal, asalTujuan, alasan} = context.body as { jenis: string; nama: string; tanggal: string; asalTujuan: string; alasan?: string; - jenisKelamin?: string; } const existing = await prisma.migrasiPenduduk.findUnique({ @@ -36,12 +35,12 @@ export default async function migrasiPendudukUpdate(context: Context) { const updated = await prisma.migrasiPenduduk.update({ where: { id }, data: { - jenis, + jenis: jenis as 'MASUK' | 'KELUAR', nama, tanggal: new Date(tanggal), - asalTujuan, + asal: jenis === 'MASUK' ? asalTujuan : undefined, + tujuan: jenis === 'KELUAR' ? asalTujuan : undefined, alasan, - jenisKelamin, }, }) diff --git a/src/app/darmasaba/(pages)/kependudukan/dashboard/page.tsx b/src/app/darmasaba/(pages)/kependudukan/dashboard/page.tsx index ef4c7c51..09a0bfa4 100644 --- a/src/app/darmasaba/(pages)/kependudukan/dashboard/page.tsx +++ b/src/app/darmasaba/(pages)/kependudukan/dashboard/page.tsx @@ -1,8 +1,7 @@ 'use client' import colors from '@/con/colors'; -import { Stack, Box, Paper, Text, Title, SimpleGrid, Skeleton, Group, Badge, Center, Image } from '@mantine/core'; +import { Stack, Box, Paper, Text, Title, SimpleGrid, Skeleton, Group, Badge, Center } from '@mantine/core'; import { IconUsers, IconHome, IconBasket, IconCoin, IconDatabaseOff } from '@tabler/icons-react'; -import React from 'react'; import BackButton from '../../desa/layanan/_com/BackButto'; import { useProxy } from 'valtio/utils'; import kependudukanDashboard from '@/app/admin/(dashboard)/_state/kependudukan/dashboard'; diff --git a/src/app/darmasaba/(pages)/kependudukan/data-per-banjar/page.tsx b/src/app/darmasaba/(pages)/kependudukan/data-per-banjar/page.tsx index 2a6fd6b8..70116355 100644 --- a/src/app/darmasaba/(pages)/kependudukan/data-per-banjar/page.tsx +++ b/src/app/darmasaba/(pages)/kependudukan/data-per-banjar/page.tsx @@ -2,7 +2,6 @@ import colors from '@/con/colors'; import { Stack, Box, Paper, Text, Title, Skeleton, Table, Center } from '@mantine/core'; import { IconDatabaseOff } from '@tabler/icons-react'; -import React from 'react'; import BackButton from '../../desa/layanan/_com/BackButto'; import { useProxy } from 'valtio/utils'; import dataBanjar from '@/app/admin/(dashboard)/_state/kependudukan/data-banjar'; @@ -15,7 +14,16 @@ function Page() { state.findMany.load() }, []) - const data = state.findMany.data || []; + interface DataBanjarItem { + id: string; + nama: string; + penduduk: number; + kk: number; + miskin: number; + tahun: number; + } + + const data = (state.findMany.data as DataBanjarItem[]) || []; if (state.findMany.loading) { return ( diff --git a/src/app/darmasaba/(pages)/kependudukan/distribusi-agama/page.tsx b/src/app/darmasaba/(pages)/kependudukan/distribusi-agama/page.tsx index 1f332569..8a707dad 100644 --- a/src/app/darmasaba/(pages)/kependudukan/distribusi-agama/page.tsx +++ b/src/app/darmasaba/(pages)/kependudukan/distribusi-agama/page.tsx @@ -2,7 +2,6 @@ import colors from '@/con/colors'; import { Stack, Box, Paper, Text, Title, Skeleton, Flex, ColorSwatch, Center } from '@mantine/core'; import { IconDatabaseOff } from '@tabler/icons-react'; -import React from 'react'; import BackButton from '../../desa/layanan/_com/BackButto'; import { useProxy } from 'valtio/utils'; import distribusiAgama from '@/app/admin/(dashboard)/_state/kependudukan/distribusi-agama'; @@ -16,7 +15,14 @@ function Page() { state.findMany.load() }, []) - const data = state.findMany.data || []; + interface DistribusiAgamaItem { + id: string; + agama: string; + jumlah: number; + tahun: number; + } + + const data = (state.findMany.data as DistribusiAgamaItem[]) || []; if (state.findMany.loading) { return ( diff --git a/src/app/darmasaba/(pages)/kependudukan/distribusi-umur/page.tsx b/src/app/darmasaba/(pages)/kependudukan/distribusi-umur/page.tsx index 92841afb..091355bf 100644 --- a/src/app/darmasaba/(pages)/kependudukan/distribusi-umur/page.tsx +++ b/src/app/darmasaba/(pages)/kependudukan/distribusi-umur/page.tsx @@ -2,7 +2,6 @@ import colors from '@/con/colors'; import { Stack, Box, Paper, Text, Title, Skeleton, Center } from '@mantine/core'; import { IconDatabaseOff } from '@tabler/icons-react'; -import React from 'react'; import BackButton from '../../desa/layanan/_com/BackButto'; import { useProxy } from 'valtio/utils'; import distribusiUmur from '@/app/admin/(dashboard)/_state/kependudukan/distribusi-umur'; @@ -16,7 +15,14 @@ function Page() { state.findMany.load() }, []) - const data = state.findMany.data || []; + interface DistribusiUmurItem { + id: string; + rentangUmur: string; + jumlah: number; + tahun: number; + } + + const data = (state.findMany.data as DistribusiUmurItem[]) || []; if (state.findMany.loading) { return (