From 6e109ffe00567e71fdef38ef1c5d07caa61ce653 Mon Sep 17 00:00:00 2001 From: nico Date: Mon, 14 Jul 2025 14:33:08 +0800 Subject: [PATCH] FIX UI Admin Menu PPID --- prisma/schema.prisma | 7 +- src/app/admin/(dashboard)/_com/header.tsx | 2 +- .../daftarInformasiPublik.ts | 58 ++++--- .../grafikBerdasarkanJenisKelamin.ts | 87 ++++++----- .../grafikBerdasarkanResponden.ts | 77 +++++----- .../grafikBerdasarkanUmur.ts | 57 ++++--- .../grafikHasilKepuasan.ts | 77 +++++----- .../admin/(dashboard)/desa/berita/page.tsx | 23 +-- .../[id]/edit/page.tsx | 34 +++-- .../[id]/page.tsx | 4 +- .../create/page.tsx | 14 +- .../page.tsx | 98 ++++++++---- .../create/page.tsx | 20 ++- .../page.tsx | 135 +++++++++++------ .../create/page.tsx | 2 +- .../grafik_berdasarkan_responden/page.tsx | 135 +++++++++++------ .../grafik_berdasarkan_umur/page.tsx | 142 ++++++++++++------ .../grafik_hasil_kepuasan_masyarakat/page.tsx | 135 +++++++++++------ .../ppid/daftar_informasi_publik/create.ts | 15 +- .../_lib/ppid/daftar_informasi_publik/edit.ts | 18 ++- .../ppid/daftar_informasi_publik/find-many.ts | 47 +++++- .../find-many.ts | 43 +++++- .../ikm/grafik_berdasarkan_umur/find-many.ts | 45 +++++- .../ppid/ikm/grafik_berdasarkan_umur/index.ts | 2 +- .../find-many.ts | 48 +++++- .../ppid/ikm/grafik_responden/find-many.ts | 45 +++++- 26 files changed, 899 insertions(+), 471 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 87df5618..7bbc4c7c 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -152,7 +152,7 @@ model DaftarInformasiPublik { id String @id @default(cuid()) jenisInformasi String deskripsi String - tanggal String + tanggal DateTime @db.Date createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) @@ -1314,7 +1314,7 @@ model Belanja { updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) isActive Boolean @default(true) - ApbDesa ApbDesa[] @relation("ApbDesaBelanja") + ApbDesa ApbDesa[] @relation("ApbDesaBelanja") } model Pembiayaan { @@ -1325,8 +1325,9 @@ model Pembiayaan { updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) isActive Boolean @default(true) - ApbDesa ApbDesa[] @relation("ApbDesaPembiayaan") + ApbDesa ApbDesa[] @relation("ApbDesaPembiayaan") } + // ========================================= INOVASI ========================================= // // ========================================= DESA DIGITAL / SMART VILLAGE ========================================= // model DesaDigital { diff --git a/src/app/admin/(dashboard)/_com/header.tsx b/src/app/admin/(dashboard)/_com/header.tsx index 6aadc3ea..39735f4d 100644 --- a/src/app/admin/(dashboard)/_com/header.tsx +++ b/src/app/admin/(dashboard)/_com/header.tsx @@ -19,7 +19,7 @@ const HeaderSearch = ({ onChange, }: HeaderSearchProps) => { return ( - + {title} diff --git a/src/app/admin/(dashboard)/_state/ppid/daftar_informasi_publik/daftarInformasiPublik.ts b/src/app/admin/(dashboard)/_state/ppid/daftar_informasi_publik/daftarInformasiPublik.ts index eee0179a..fba89a42 100644 --- a/src/app/admin/(dashboard)/_state/ppid/daftar_informasi_publik/daftarInformasiPublik.ts +++ b/src/app/admin/(dashboard)/_state/ppid/daftar_informasi_publik/daftarInformasiPublik.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import ApiFetch from "@/lib/api-fetch"; import { Prisma } from "@prisma/client"; import { toast } from "react-toastify"; @@ -16,17 +17,9 @@ const defaultForm = { tanggal: "", }; -type DaftarInformasi = Prisma.DaftarInformasiPublikGetPayload<{ - select: { - jenisInformasi: true; - deskripsi: true; - tanggal: true; - }; -}>; - const daftarInformasiPublik = proxy({ create: { - form: {} as DaftarInformasi, + form: {...defaultForm}, loading: false, async create() { const cek = templateDaftarInformasi.safeParse( @@ -56,15 +49,38 @@ const daftarInformasiPublik = proxy({ }, }, findMany: { - data: null as - | Prisma.DaftarInformasiPublikGetPayload<{ omit: { isActive: true } }>[] - | null, - async load() { - const res = await ApiFetch.api.ppid.daftarinformasipublik[ - "find-many" - ].get(); - if (res.status === 200) { - daftarInformasiPublik.findMany.data = res.data?.data ?? []; + data: null as any[] | null, + page: 1, + totalPages: 1, + total: 0, + loading: false, + load: async (page = 1, limit = 10) => { // Change to arrow function + daftarInformasiPublik.findMany.loading = true; // Use the full path to access the property + daftarInformasiPublik.findMany.page = page; + try { + const res = await ApiFetch.api.ppid.daftarinformasipublik[ + "find-many" + ].get({ + query: { page, limit }, + }); + + if (res.status === 200 && res.data?.success) { + daftarInformasiPublik.findMany.data = res.data.data || []; + daftarInformasiPublik.findMany.total = res.data.total || 0; + daftarInformasiPublik.findMany.totalPages = res.data.totalPages || 1; + } else { + console.error("Failed to load daftar informasi publik:", res.data?.message); + daftarInformasiPublik.findMany.data = []; + daftarInformasiPublik.findMany.total = 0; + daftarInformasiPublik.findMany.totalPages = 1; + } + } catch (error) { + console.error("Error loading daftar informasi publik:", error); + daftarInformasiPublik.findMany.data = []; + daftarInformasiPublik.findMany.total = 0; + daftarInformasiPublik.findMany.totalPages = 1; + } finally { + daftarInformasiPublik.findMany.loading = false; } }, }, @@ -186,7 +202,9 @@ const daftarInformasiPublik = proxy({ } try { daftarInformasiPublik.edit.loading = true; - + const formattedTanggal = this.form.tanggal + ? new Date(this.form.tanggal).toISOString() + : undefined; const response = await fetch( `/api/ppid/daftarinformasipublik/${this.id}`, { @@ -197,7 +215,7 @@ const daftarInformasiPublik = proxy({ body: JSON.stringify({ jenisInformasi: this.form.jenisInformasi, deskripsi: this.form.deskripsi, - tanggal: this.form.tanggal, + tanggal: formattedTanggal, }), } ); diff --git a/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanJenisKelamin.ts b/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanJenisKelamin.ts index b889d6a5..19539fdc 100644 --- a/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanJenisKelamin.ts +++ b/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanJenisKelamin.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import ApiFetch from "@/lib/api-fetch"; import { Prisma } from "@prisma/client"; import { toast } from "react-toastify"; @@ -9,71 +10,75 @@ const templateGrafikJenisKelamin = z.object({ perempuan: z.string().min(1, "Data perempuan harus diisi"), }); -type GrafikJenisKelamin = Prisma.GrafikBerdasarkanJenisKelaminGetPayload<{ - select: { - id: true; - laki: true; - perempuan: true; - }; -}>; - -const defaultForm: Omit & { id?: string } = { +const defaultForm = { laki: "", perempuan: "", }; const grafikBerdasarkanJenisKelamin = proxy({ create: { - form: defaultForm, + form: {...defaultForm}, loading: false, - async create() { - const cek = templateGrafikJenisKelamin.safeParse( - grafikBerdasarkanJenisKelamin.create.form - ); + async create(){ + const cek = templateGrafikJenisKelamin.safeParse(grafikBerdasarkanJenisKelamin.create.form); if (!cek.success) { - const err = `[${cek.error.issues - .map((v) => `${v.path.join(".")}`) - .join("\n")}] required`; - return toast.error(err); + const err = cek.error.issues.map((i) => i.message).join("\n"); + toast.error(err); + return; } + try { grafikBerdasarkanJenisKelamin.create.loading = true; const res = await ApiFetch.api.ppid.grafikberdasarkanjeniskelamin[ "create" ].post(grafikBerdasarkanJenisKelamin.create.form); if (res.status === 200) { - const id = res.data?.data?.id; - if (id) { - toast.success("Success create"); - grafikBerdasarkanJenisKelamin.create.form = { - laki: "", - perempuan: "", - }; - grafikBerdasarkanJenisKelamin.findMany.load(); - return id; - } + toast.success("Grafik berdasarkan jenis kelamin berhasil ditambahkan"); + await grafikBerdasarkanJenisKelamin.findMany.load(); + } else { + toast.error(res.data?.message ?? "Gagal tambah grafik berdasarkan jenis kelamin"); } - return toast.error("failed create"); } catch (error) { - console.log((error as Error).message); + console.error("Gagal create:", error); + toast.error("Terjadi kesalahan saat menambahkan grafik berdasarkan jenis kelamin"); } finally { grafikBerdasarkanJenisKelamin.create.loading = false; } }, }, findMany: { - data: null as - | Prisma.GrafikBerdasarkanJenisKelaminGetPayload<{ - omit: { isActive: true }; - }>[] - | null, + data: null as any[] | null, + page: 1, + totalPages: 1, + total: 0, loading: false, - async load() { - const res = await ApiFetch.api.ppid.grafikberdasarkanjeniskelamin[ - "find-many" - ].get(); - if (res.status === 200) { - grafikBerdasarkanJenisKelamin.findMany.data = res.data?.data ?? []; + load: async (page = 1, limit = 10) => { // Change to arrow function + grafikBerdasarkanJenisKelamin.findMany.loading = true; // Use the full path to access the property + grafikBerdasarkanJenisKelamin.findMany.page = page; + try { + const res = await ApiFetch.api.ppid.grafikberdasarkanjeniskelamin[ + "find-many" + ].get({ + query: { page, limit }, + }); + + if (res.status === 200 && res.data?.success) { + grafikBerdasarkanJenisKelamin.findMany.data = res.data.data || []; + grafikBerdasarkanJenisKelamin.findMany.total = res.data.total || 0; + grafikBerdasarkanJenisKelamin.findMany.totalPages = res.data.totalPages || 1; + } else { + console.error("Failed to load grafik berdasarkan jenis kelamin:", res.data?.message); + grafikBerdasarkanJenisKelamin.findMany.data = []; + grafikBerdasarkanJenisKelamin.findMany.total = 0; + grafikBerdasarkanJenisKelamin.findMany.totalPages = 1; + } + } catch (error) { + console.error("Error loading grafik berdasarkan jenis kelamin:", error); + grafikBerdasarkanJenisKelamin.findMany.data = []; + grafikBerdasarkanJenisKelamin.findMany.total = 0; + grafikBerdasarkanJenisKelamin.findMany.totalPages = 1; + } finally { + grafikBerdasarkanJenisKelamin.findMany.loading = false; } }, }, diff --git a/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanResponden.ts b/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanResponden.ts index 027669ad..f8caf999 100644 --- a/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanResponden.ts +++ b/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanResponden.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import ApiFetch from "@/lib/api-fetch"; import { Prisma } from "@prisma/client"; import { toast } from "react-toastify"; @@ -11,17 +12,7 @@ const templateGrafikResponden = z.object({ tidakbaik: z.string().min(1, "Data tidak baik harus diisi"), }); -type GrafikResponden = Prisma.GrafikBerdasarkanRespondenGetPayload<{ - select: { - id: true; - sangatbaik: true; - baik: true; - kurangbaik: true; - tidakbaik: true; - }; -}>; - -const defaultForm: Omit & { id?: string } = { +const defaultForm = { sangatbaik: "", baik: "", kurangbaik: "", @@ -30,7 +21,7 @@ const defaultForm: Omit & { id?: string } = { const grafikBerdasarkanResponden = proxy({ create: { - form: defaultForm, + form: {...defaultForm}, loading: false, async create() { const cek = templateGrafikResponden.safeParse( @@ -48,40 +39,52 @@ const grafikBerdasarkanResponden = proxy({ "create" ].post(grafikBerdasarkanResponden.create.form); if (res.status === 200) { - const id = res.data?.data?.id; - if (id) { - toast.success("Success create"); - grafikBerdasarkanResponden.create.form = { - sangatbaik: "", - baik: "", - kurangbaik: "", - tidakbaik: "", - }; - grafikBerdasarkanResponden.findMany.load(); - return id; - } + toast.success("Grafik berdasarkan responden berhasil ditambahkan"); + await grafikBerdasarkanResponden.findMany.load(); + } else { + toast.error(res.data?.message ?? "Gagal tambah grafik berdasarkan responden"); } - return toast.error("failed create"); } catch (error) { - console.log((error as Error).message); + console.error("Gagal create:", error); + toast.error("Terjadi kesalahan saat menambahkan grafik berdasarkan responden"); } finally { grafikBerdasarkanResponden.create.loading = false; } }, }, findMany: { - data: null as - | Prisma.GrafikBerdasarkanRespondenGetPayload<{ - omit: { isActive: true }; - }>[] - | null, + data: null as any[] | null, + page: 1, + totalPages: 1, + total: 0, loading: false, - async load() { - const res = await ApiFetch.api.ppid.grafikberdasarkanresponden[ - "find-many" - ].get(); - if (res.status === 200) { - grafikBerdasarkanResponden.findMany.data = res.data?.data ?? []; + load: async (page = 1, limit = 10) => { // Change to arrow function + grafikBerdasarkanResponden.findMany.loading = true; // Use the full path to access the property + grafikBerdasarkanResponden.findMany.page = page; + try { + const res = await ApiFetch.api.ppid.grafikberdasarkanresponden[ + "find-many" + ].get({ + query: { page, limit }, + }); + + if (res.status === 200 && res.data?.success) { + grafikBerdasarkanResponden.findMany.data = res.data.data || []; + grafikBerdasarkanResponden.findMany.total = res.data.total || 0; + grafikBerdasarkanResponden.findMany.totalPages = res.data.totalPages || 1; + } else { + console.error("Failed to load grafik berdasarkan responden:", res.data?.message); + grafikBerdasarkanResponden.findMany.data = []; + grafikBerdasarkanResponden.findMany.total = 0; + grafikBerdasarkanResponden.findMany.totalPages = 1; + } + } catch (error) { + console.error("Error loading grafikBerdasarkanResponden:", error); + grafikBerdasarkanResponden.findMany.data = []; + grafikBerdasarkanResponden.findMany.total = 0; + grafikBerdasarkanResponden.findMany.totalPages = 1; + } finally { + grafikBerdasarkanResponden.findMany.loading = false; } }, }, diff --git a/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanUmur.ts b/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanUmur.ts index eec88dc4..4eb184ad 100644 --- a/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanUmur.ts +++ b/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanUmur.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import ApiFetch from "@/lib/api-fetch"; import { Prisma } from "@prisma/client"; import { toast } from "react-toastify"; @@ -11,17 +12,7 @@ const templateGrafikUmur = z.object({ lansia: z.string().min(1, "Data lansia harus diisi"), }); -type GrafikUmur = Prisma.GrafikBerdasarkanUmurGetPayload<{ - select: { - id: true; - remaja: true; - dewasa: true; - orangtua: true; - lansia: true; - }; -}>; - -const defaultForm: Omit & { id?: string } = { +const defaultForm = { remaja: "", dewasa: "", orangtua: "", @@ -30,7 +21,7 @@ const defaultForm: Omit & { id?: string } = { const grafikBerdasarkanUmur = proxy({ create: { - form: defaultForm, + form: {...defaultForm}, loading: false, async create() { const cek = templateGrafikUmur.safeParse( @@ -70,18 +61,38 @@ const grafikBerdasarkanUmur = proxy({ }, }, findMany: { - data: null as - | Prisma.GrafikBerdasarkanUmurGetPayload<{ - omit: { isActive: true }; - }>[] - | null, + data: null as any[] | null, + page: 1, + totalPages: 1, + total: 0, loading: false, - async load() { - const res = await ApiFetch.api.ppid.grafikberdasarkanumur[ - "find-many" - ].get(); - if (res.status === 200) { - grafikBerdasarkanUmur.findMany.data = res.data?.data ?? []; + load: async (page = 1, limit = 10) => { // Change to arrow function + grafikBerdasarkanUmur.findMany.loading = true; // Use the full path to access the property + grafikBerdasarkanUmur.findMany.page = page; + try { + const res = await ApiFetch.api.ppid.grafikberdasarkanumur[ + "find-many" + ].get({ + query: { page, limit }, + }); + + if (res.status === 200 && res.data?.success) { + grafikBerdasarkanUmur.findMany.data = res.data.data || []; + grafikBerdasarkanUmur.findMany.total = res.data.total || 0; + grafikBerdasarkanUmur.findMany.totalPages = res.data.totalPages || 1; + } else { + console.error("Failed to load grafik berdasarkan umur:", res.data?.message); + grafikBerdasarkanUmur.findMany.data = []; + grafikBerdasarkanUmur.findMany.total = 0; + grafikBerdasarkanUmur.findMany.totalPages = 1; + } + } catch (error) { + console.error("Error loading grafik berdasarkan umur:", error); + grafikBerdasarkanUmur.findMany.data = []; + grafikBerdasarkanUmur.findMany.total = 0; + grafikBerdasarkanUmur.findMany.totalPages = 1; + } finally { + grafikBerdasarkanUmur.findMany.loading = false; } }, }, diff --git a/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikHasilKepuasan.ts b/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikHasilKepuasan.ts index dc735972..2b669f43 100644 --- a/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikHasilKepuasan.ts +++ b/src/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikHasilKepuasan.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import ApiFetch from "@/lib/api-fetch"; import { Prisma } from "@prisma/client"; import { toast } from "react-toastify"; @@ -9,22 +10,14 @@ const templateGrafikHasilKepuasanMasyarakat = z.object({ kepuasan: z.string().min(1, "Kepuasan harus diisi"), }); -type GrafikHasilKepuasanMasyarakat = Prisma.IndeksKepuasanMasyarakatGetPayload<{ - select: { - id: true; - label: true; - kepuasan: true; - }; -}>; - -const defaultForm: Omit & { id?: string } = { +const defaultForm = { label: "", kepuasan: "", }; const grafikHasilKepuasanMasyarakat = proxy({ create: { - form: defaultForm, + form: {...defaultForm}, loading: false, async create() { const cek = templateGrafikHasilKepuasanMasyarakat.safeParse( @@ -38,42 +31,52 @@ const grafikHasilKepuasanMasyarakat = proxy({ } try { grafikHasilKepuasanMasyarakat.create.loading = true; - const res = await ApiFetch.api.ppid.grafikhasilkepuasamanmasyarakat["create"].post( - grafikHasilKepuasanMasyarakat.create.form - ); + const res = await ApiFetch.api.ppid.grafikhasilkepuasamanmasyarakat["create"].post(grafikHasilKepuasanMasyarakat.create.form); if (res.status === 200) { - const id = res.data?.data?.id; - if (id) { - toast.success("Success create"); - grafikHasilKepuasanMasyarakat.create.form = { - label: "", - kepuasan: "", - }; - grafikHasilKepuasanMasyarakat.findMany.load(); - return id; - } + toast.success("Grafik hasil kepuasan masyarakat berhasil ditambahkan"); + await grafikHasilKepuasanMasyarakat.findMany.load(); + } else { + toast.error(res.data?.message ?? "Gagal tambah grafik hasil kepuasan masyarakat"); } - - return toast.error("failed create"); } catch (error) { - console.log((error as Error).message); + console.error("Gagal create:", error); + toast.error("Terjadi kesalahan saat menambahkan grafik hasil kepuasan masyarakat"); } finally { grafikHasilKepuasanMasyarakat.create.loading = false; } }, }, findMany: { - data: null as - | Prisma.IndeksKepuasanMasyarakatGetPayload<{ - omit: { isActive: true }; - }>[] - | null, - async load() { - const res = await ApiFetch.api.ppid.grafikhasilkepuasamanmasyarakat[ - "find-many" - ].get(); - if (res.status === 200) { - grafikHasilKepuasanMasyarakat.findMany.data = res.data?.data ?? []; + data: null as any[] | null, + page: 1, + totalPages: 1, + total: 0, + loading: false, + load: async (page = 1, limit = 10) => { // Change to arrow function + grafikHasilKepuasanMasyarakat.findMany.loading = true; // Use the full path to access the property + grafikHasilKepuasanMasyarakat.findMany.page = page; + try { + const res = await ApiFetch.api.ppid.grafikhasilkepuasamanmasyarakat["find-many"].get({ + query: { page, limit }, + }); + + if (res.status === 200 && res.data?.success) { + grafikHasilKepuasanMasyarakat.findMany.data = res.data.data || []; + grafikHasilKepuasanMasyarakat.findMany.total = res.data.total || 0; + grafikHasilKepuasanMasyarakat.findMany.totalPages = res.data.totalPages || 1; + } else { + console.error("Failed to load grafik hasil kepuasan masyarakat:", res.data?.message); + grafikHasilKepuasanMasyarakat.findMany.data = []; + grafikHasilKepuasanMasyarakat.findMany.total = 0; + grafikHasilKepuasanMasyarakat.findMany.totalPages = 1; + } + } catch (error) { + console.error("Error loading grafik hasil kepuasan masyarakat:", error); + grafikHasilKepuasanMasyarakat.findMany.data = []; + grafikHasilKepuasanMasyarakat.findMany.total = 0; + grafikHasilKepuasanMasyarakat.findMany.totalPages = 1; + } finally { + grafikHasilKepuasanMasyarakat.findMany.loading = false; } }, }, diff --git a/src/app/admin/(dashboard)/desa/berita/page.tsx b/src/app/admin/(dashboard)/desa/berita/page.tsx index 7ba706f9..84177860 100644 --- a/src/app/admin/(dashboard)/desa/berita/page.tsx +++ b/src/app/admin/(dashboard)/desa/berita/page.tsx @@ -1,6 +1,6 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Grid, GridCol, Image, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; +import { Box, Button, Center, Grid, GridCol, Image, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconCircleDashedPlus, IconDeviceImacCog, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -40,8 +40,8 @@ function ListBerita({ search }: { search: string }) { // Fetch pertama kali useShallowEffect(() => { - load(page); // awal page = 1 - }, []); + load(page, 10); // awal page = 1 + }, [page]); const filteredData = (data || []).filter((item) => { const keyword = search.toLowerCase(); @@ -57,14 +57,6 @@ function ListBerita({ search }: { search: string }) { return ( - load(newPage)} // ini penting! - total={totalPages} - mt="md" - mb="md" - /> - @@ -128,6 +120,15 @@ function ListBerita({ search }: { search: string }) { +
+ load(newPage)} // ini penting! + total={totalPages} + mt="md" + mb="md" + /> +
); } diff --git a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/edit/page.tsx index b5ffe26f..0e600ea3 100644 --- a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/edit/page.tsx @@ -10,17 +10,29 @@ import { useEffect, useState } from 'react'; import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; +interface FormDaftarInformasi { + jenisInformasi: string; + deskripsi: string; + tanggal: string; +} + function EditDaftarInformasiPublik() { const daftarInformasi = useProxy(daftarInformasiPublik) const router = useRouter() const params = useParams() - const [formData, setFormData] = useState({ - jenisInformasi: daftarInformasi.edit.form.jenisInformasi || '', - deskripsi: daftarInformasi.edit.form.deskripsi || '', - tanggal: daftarInformasi.edit.form.tanggal || '', + const [formData, setFormData] = useState({ + jenisInformasi: '', + deskripsi: '', + tanggal: '', }) + const formatDateForInput = (dateString: string) => { + if (!dateString) return ''; + const date = new Date(dateString); + return date.toISOString().split('T')[0]; + }; + useEffect(() => { const loadDaftarInformasi = async () => { const id = params?.id as string; @@ -48,12 +60,11 @@ function EditDaftarInformasiPublik() { try { daftarInformasi.edit.form = { ...daftarInformasi.edit.form, - jenisInformasi: formData.jenisInformasi, - deskripsi: formData.deskripsi, - tanggal: formData.tanggal, + jenisInformasi: formData.jenisInformasi.trim(), + deskripsi: formData.deskripsi.trim(), + tanggal: formData.tanggal.trim(), } await daftarInformasi.edit.update() - toast.success("Berita berhasil diperbarui!"); router.push("/admin/ppid/daftar-informasi-publik-desa-darmasaba"); } catch (error) { console.error("Error updating berita:", error); @@ -73,7 +84,7 @@ function EditDaftarInformasiPublik() { Edit Daftar Informasi Publik Desa Darmasaba Jenis Informasi} placeholder="masukkan jenis informasi" onChange={(val) => { setFormData({ @@ -93,8 +104,9 @@ function EditDaftarInformasiPublik() { /> Tanggal Publikasi} placeholder="masukkan tanggal publikasi" onChange={(val) => { setFormData({ diff --git a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/page.tsx b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/page.tsx index 8e70db82..c848bb14 100644 --- a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/page.tsx @@ -56,7 +56,9 @@ function DetailDaftarInformasiPublik() { Tanggal - {stateDaftarInformasi.findUnique.data?.tanggal} + {stateDaftarInformasi.findUnique.data?.tanggal + ? new Date(stateDaftarInformasi.findUnique.data.tanggal).toLocaleDateString() + : "-"} Deskripsi diff --git a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/create/page.tsx b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/create/page.tsx index 8a77e209..2e859e31 100644 --- a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/create/page.tsx +++ b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/create/page.tsx @@ -42,7 +42,7 @@ export default function CreateBerita() { Create Daftar Informasi Publik Desa Darmasaba Jenis Informasi} placeholder="masukkan jenis informasi" onChange={(val) => { daftarInformasi.create.form.jenisInformasi = val.target.value @@ -58,13 +58,13 @@ export default function CreateBerita() { /> { - daftarInformasi.create.form.tanggal = val.target.value - }} + label={Tanggal Publikasi} + type="date" + placeholder="Contoh: 2022-01-01" + value={daftarInformasi.create.form.tanggal} + onChange={(e) => (daftarInformasi.create.form.tanggal = e.currentTarget.value)} /> - + diff --git a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx index 95248ade..4154f049 100644 --- a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx +++ b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx @@ -1,12 +1,13 @@ +/* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { Box, Button, Grid, GridCol, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; -import { useShallowEffect } from '@mantine/hooks'; -import { IconCircleDashedPlus, IconDeviceImacCog, IconSearch } from '@tabler/icons-react'; +import { Box, Button, Center, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; +import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { useProxy } from 'valtio/utils'; import HeaderSearch from '../../_com/header'; +import JudulList from '../../_com/judulList'; import daftarInformasiPublik from '../../_state/ppid/daftar_informasi_publik/daftarInformasiPublik'; function DaftarInformasiPublik() { @@ -14,7 +15,7 @@ function DaftarInformasiPublik() { return ( } value={search} @@ -29,12 +30,14 @@ function ListDaftarInformasi({ search }: { search: string }) { const listData = useProxy(daftarInformasiPublik) const router = useRouter() - useShallowEffect(() => { - listData.findMany.load() - }, []) + const { data, page, totalPages, loading, load } = listData.findMany + + useEffect(() => { + load(page, 10) + }, [page]) - const filteredData = (listData.findMany.data || []).filter(item => { + const filteredData = (data || []).filter(item => { const keyword = search.toLowerCase(); return ( item.jenisInformasi.toLowerCase().includes(keyword) || @@ -42,28 +45,47 @@ function ListDaftarInformasi({ search }: { search: string }) { ); }); - if (!listData.findMany.data) { + if (loading || !data) { return ( - - + + - ) + ); + } + if (data.length === 0) { + return ( + + + + + + + + No + Jenis Informasi + Deskripsi + Detail + + +
+ Tidak ada data daftar informasi publik yang tersedia +
+
+
+ ); } return ( - + - - - List Daftar Informasi Publik Desa Darmasaba - - - - - + - No - Jenis Informasi - Deskripsi - Detail + No + Jenis Informasi + Deskripsi + Detail {filteredData.map((item, index) => ( - {index + 1} - {item.jenisInformasi} - - + {index + 1} + {item.jenisInformasi} + + @@ -98,6 +120,18 @@ function ListDaftarInformasi({ search }: { search: string }) { +
+ { + load(newPage, 10); + window.scrollTo(0, 0); + }} + total={totalPages} + mt="md" + mb="md" + /> +
) } diff --git a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin_responden/create/page.tsx b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin_responden/create/page.tsx index cc07a64d..1b18f995 100644 --- a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin_responden/create/page.tsx +++ b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin_responden/create/page.tsx @@ -24,16 +24,20 @@ function GrafikBerdasarkanJenisKelaminRespondenCreate() { } const handleSubmit = async () => { - const id = await stategrafikBerdasarkanJenisKelamin.create.create(); - if (id) { - const idStr = String(id); - await stategrafikBerdasarkanJenisKelamin.findUnique.load(idStr); - if (stategrafikBerdasarkanJenisKelamin.findUnique.data) { - setDonutData([stategrafikBerdasarkanJenisKelamin.findUnique.data]); + try { + const id = await stategrafikBerdasarkanJenisKelamin.create.create(); + if (typeof id !== 'undefined') { + const idStr = String(id); + await stategrafikBerdasarkanJenisKelamin.findUnique.load(idStr); + if (stategrafikBerdasarkanJenisKelamin.findUnique.data) { + setDonutData([stategrafikBerdasarkanJenisKelamin.findUnique.data]); + } } + resetForm(); + router.push("/admin/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin_responden"); + } catch (error) { + console.error('Error submitting form:', error); } - resetForm(); - router.push("/admin/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin_responden") } return ( diff --git a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin_responden/page.tsx b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin_responden/page.tsx index 79b22b48..c0295249 100644 --- a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin_responden/page.tsx +++ b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_jenis_kelamin_responden/page.tsx @@ -2,16 +2,16 @@ 'use client' import grafikBerdasarkanJenisKelamin from '@/app/admin/(dashboard)/_state/ppid/indeks_kepuasan_masyarakat/grafikBerdasarkanJenisKelamin'; import colors from '@/con/colors'; -import { Box, Button, Flex, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; +import { Box, Button, Center, Flex, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit, IconSearch, IconTrash } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import { Cell, Pie, PieChart } from 'recharts'; import { useProxy } from 'valtio/utils'; -import JudulListTab from '../../../_com/judulListTab'; -import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import HeaderSearch from '../../../_com/header'; +import JudulList from '../../../_com/judulList'; +import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; function GrafikBerdasarkanJenisKelamin() { const [search, setSearch] = useState(""); @@ -36,6 +36,32 @@ function ListGrafikBerdasarkanJenisKelamin({ search }: { search: string }) { const [modalHapus, setModalHapus] = useState(false) const [selectedId, setSelectedId] = useState(null) const router = useRouter(); + const { data, page, totalPages, loading, load } = stategrafikBerdasarkanJenisKelamin.findMany + + + useShallowEffect(() => { + setMounted(true); + load(page, 10) + }, [page]); + + useEffect(() => { + if (data) { + const totalLaki = data.reduce((acc: number, cur: any) => acc + Number(cur.laki || 0), 0); + const totalPerempuan = data.reduce((acc: number, cur: any) => acc + Number(cur.perempuan || 0), 0); + setDonutData([ + { name: 'laki', value: totalLaki, color: colors['blue-button'], key: 'laki' }, + { name: 'perempuan', value: totalPerempuan, color: '#10A85AFF', key: 'perempuan' } + ]); + } + }, [data]) + + const filteredData = (data || []).filter(item => { + const keyword = search.toLowerCase(); + return ( + item.laki.toString().toLowerCase().includes(keyword) || + item.perempuan.toString().toLowerCase().includes(keyword) + ); + }); const handleDelete = async () => { if (selectedId) { @@ -47,55 +73,56 @@ function ListGrafikBerdasarkanJenisKelamin({ search }: { search: string }) { } } - useShallowEffect(() => { - setMounted(true); - stategrafikBerdasarkanJenisKelamin.findMany.load() - }, []); - - useEffect(() => { - if (stategrafikBerdasarkanJenisKelamin.findMany.data) { - const totalLaki = stategrafikBerdasarkanJenisKelamin.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.laki || 0), 0); - const totalPerempuan = stategrafikBerdasarkanJenisKelamin.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.perempuan || 0), 0); - setDonutData([ - { name: 'laki', value: totalLaki, color: colors['blue-button'], key: 'laki' }, - { name: 'perempuan', value: totalPerempuan, color: '#10A85AFF', key: 'perempuan' } - ]); - } - }, [stategrafikBerdasarkanJenisKelamin.findMany.data]) - - const filteredData = (stategrafikBerdasarkanJenisKelamin.findMany.data || []).filter(item => { - const keyword = search.toLowerCase(); + if (loading || !data) { return ( - item.laki.toString().toLowerCase().includes(keyword) || - item.perempuan.toString().toLowerCase().includes(keyword) + + + ); - }); - - if (!stategrafikBerdasarkanJenisKelamin.findMany.data) { + } + if (data.length === 0) { return ( - - - - ) + + + + +
+ + + No + Laki-laki + Perempuan + Edit + Delete + + +
+ Tidak ada data berdasarkan jenis kelamin responden yang tersedia +
+
+
+ ); } return ( - - + } /> - Laki-laki - Perempuan - Edit - Delete + No + Laki-laki + Perempuan + Edit + Delete @@ -106,16 +133,17 @@ function ListGrafikBerdasarkanJenisKelamin({ search }: { search: string }) { ) : ( - filteredData.map((item) => ( + filteredData.map((item, index) => ( - {item.laki} - {item.perempuan} - + {index + 1} + {item.laki} + {item.perempuan} + - +
+
+ { + load(newPage, 10); + window.scrollTo(0, 0); + }} + total={totalPages} + mt="md" + mb="md" + /> +
{/* Chart */} - Grafik Berdasarkan Responden - {mounted && donutData.length > 0 ? ( + Grafik Berdasarkan Jenis Kelamin Responden + {mounted && donutData.length === 0 ? (Belum ada data untuk ditampilkan dalam grafik) : ( Perempuan: {donutData.find((entry) => entry.name === 'perempuan')?.value} - ) : ( - Belum ada data untuk ditampilkan dalam grafik )} diff --git a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_responden/create/page.tsx b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_responden/create/page.tsx index af8b6180..6a0e4875 100644 --- a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_responden/create/page.tsx +++ b/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/grafik_berdasarkan_responden/create/page.tsx @@ -45,7 +45,7 @@ function GrafikBerdasarkanRespondenCreate() { - Grafik Hasil Kepuasan Masyarakat Terhadap Pelayanan Publik + Grafik Hasil Kepuasan Masyarakat Berdasarkan Responden (null) const router = useRouter(); - const handleDelete = async () => { - if (selectedId) { - await stategrafikBerdasarkanResponden.delete.byId(selectedId); - setModalHapus(false); - setSelectedId(null); - - // Refresh data agar chart & tabel ikut update - stategrafikBerdasarkanResponden.findMany.load(); - } - } - + const { data, page, totalPages, loading, load } = stategrafikBerdasarkanResponden.findMany useShallowEffect(() => { setMounted(true) - stategrafikBerdasarkanResponden.findMany.load() - }, []) + load(page, 10) + }, [page]) - const filteredData = (stategrafikBerdasarkanResponden.findMany.data || []).filter(item => { + const filteredData = (data || []).filter(item => { const keyword = search.toLowerCase(); return ( item.sangatbaik.toString().toLowerCase().includes(keyword) || @@ -65,11 +55,11 @@ function ListGrafikBerdasarkanResponden({ search }: { search: string }) { }); useEffect(() => { - if (stategrafikBerdasarkanResponden.findMany.data) { - const totalSangatBaik = stategrafikBerdasarkanResponden.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.sangatbaik || 0), 0); - const totalBaik = stategrafikBerdasarkanResponden.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.baik || 0), 0); - const totalKurangBaik = stategrafikBerdasarkanResponden.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.kurangbaik || 0), 0); - const totalTidakBaik = stategrafikBerdasarkanResponden.findMany.data.reduce((acc: number, cur: any) => acc + Number(cur.tidakbaik || 0), 0); + if (data) { + const totalSangatBaik = data.reduce((acc: number, cur: any) => acc + Number(cur.sangatbaik || 0), 0); + const totalBaik = data.reduce((acc: number, cur: any) => acc + Number(cur.baik || 0), 0); + const totalKurangBaik = data.reduce((acc: number, cur: any) => acc + Number(cur.kurangbaik || 0), 0); + const totalTidakBaik = data.reduce((acc: number, cur: any) => acc + Number(cur.tidakbaik || 0), 0); setDonutData([ { name: 'sangatbaik', value: totalSangatBaik, color: colors['blue-button'], key: 'sangatbaik' }, { name: 'baik', value: totalBaik, color: '#10A85AFF', key: 'baik' }, @@ -78,34 +68,72 @@ function ListGrafikBerdasarkanResponden({ search }: { search: string }) { ]); } - }, [stategrafikBerdasarkanResponden.findMany.data]) + }, [data]) - if (!stategrafikBerdasarkanResponden.findMany.data) { + const handleDelete = async () => { + if (selectedId) { + await stategrafikBerdasarkanResponden.delete.byId(selectedId); + setModalHapus(false); + setSelectedId(null); + + // Refresh data agar chart & tabel ikut update + stategrafikBerdasarkanResponden.findMany.load(); + } + } + + if (loading || !data) { return ( - - - - ) + + + + ); + } + if (data.length === 0) { + return ( + + + + + + + + No + Sangat Baik + Baik + Kurang Baik + Tidak Baik + Edit + Delete + + +
+ Tidak ada data grafik berdasarkan responden yang tersedia +
+
+
+ ); } return ( - - + } /> - Sangat Baik - Baik - Kurang Baik - Tidak Baik - Edit - Delete + No + Sangat Baik + Baik + Kurang Baik + Tidak Baik + Edit + Delete @@ -116,18 +144,19 @@ function ListGrafikBerdasarkanResponden({ search }: { search: string }) { ) : ( - filteredData.map((item) => ( + filteredData.map((item, index) => ( - {item.sangatbaik} - {item.baik} - {item.kurangbaik} - {item.tidakbaik} - + {index + 1} + {item.sangatbaik} + {item.baik} + {item.kurangbaik} + {item.tidakbaik} + - +
+ + + No + Remaja + Dewasa + Orangtua + Lansia + Edit + Delete + + +
+ Tidak ada data grafik berdasarkan umur responden yang tersedia +
+
+
+ ); } return ( - + } @@ -98,12 +128,13 @@ function ListGrafikBerdasarakanUmur({ search }: { search: string }) { - Remaja - Dewasa - Orangtua - Lansia - Edit - Delete + No + Remaja + Dewasa + Orangtua + Lansia + Edit + Delete @@ -116,16 +147,17 @@ function ListGrafikBerdasarakanUmur({ search }: { search: string }) { ) : ( filteredData.map((item) => ( - {item.remaja} - {item.dewasa} - {item.orangtua} - {item.lansia} - + {filteredData.indexOf(item) + 1} + {item.remaja} + {item.dewasa} + {item.orangtua} + {item.lansia} + - +
+ + + No + Label + Jumlah Kepuasan + Edit + Delete + + +
+ Tidak ada data grafik hasil kepuasan masyarakat yang tersedia +
+ +
+ ); } return ( - - + } /> - Label - Jumlah Kepuasan - Edit - Delete + No + Label + Jumlah Kepuasan + Edit + Delete - {filteredData.map((item) => ( + {filteredData.map((item, index) => ( - {item.label} - {item.kepuasan} - + {index + 1} + {item.label} + {item.kepuasan} + - +
+
+ { + load(newPage, 10); + window.scrollTo(0, 0); + }} + total={totalPages} + mt="md" + mb="md" + /> +
{/* Chart */} - Data Kepuasan Masyarakat + Grafik Hasil Kepuasan Masyarakat {mounted && chartData.length > 0 ? ( diff --git a/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/create.ts b/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/create.ts index 6a22c5bc..2bd88541 100644 --- a/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/create.ts +++ b/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/create.ts @@ -1,21 +1,18 @@ import prisma from "@/lib/prisma"; -import { Prisma } from "@prisma/client"; import { Context } from "elysia"; -type FormCreate = Prisma.DaftarInformasiPublikGetPayload<{ - select: { - jenisInformasi: true; - deskripsi: true; - tanggal: true; - } -}> +type FormCreate = { + jenisInformasi: string; + deskripsi: string; + tanggal: string; +} export default async function daftarInformasiPublikCreate(context: Context) { const body = context.body as FormCreate; await prisma.daftarInformasiPublik.create({ data: { jenisInformasi: body.jenisInformasi, deskripsi: body.deskripsi, - tanggal: body.tanggal, + tanggal: new Date(body.tanggal), }, }) return { diff --git a/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/edit.ts b/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/edit.ts index 65e7b39b..4879d66d 100644 --- a/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/edit.ts +++ b/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/edit.ts @@ -1,6 +1,12 @@ import prisma from "@/lib/prisma"; import { Context } from "elysia"; +type FormEdit = { + jenisInformasi: string; + deskripsi: string; + tanggal: string; +}; + export default async function daftarInformasiPublikEdit(context: Context) { const id = context.params?.id; @@ -11,11 +17,7 @@ export default async function daftarInformasiPublikEdit(context: Context) { }; } - const { jenisInformasi, deskripsi, tanggal } = context.body as { - jenisInformasi: string; - deskripsi: string; - tanggal: string; - }; + const body = context.body as FormEdit; const existing = await prisma.daftarInformasiPublik.findUnique({ where: { @@ -33,9 +35,9 @@ export default async function daftarInformasiPublikEdit(context: Context) { const updated = await prisma.daftarInformasiPublik.update({ where: { id }, data: { - jenisInformasi, - deskripsi, - tanggal, + jenisInformasi: body.jenisInformasi, + deskripsi: body.deskripsi, + tanggal: new Date(body.tanggal), }, }); diff --git a/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/find-many.ts b/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/find-many.ts index 12bb8881..36676115 100644 --- a/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/find-many.ts +++ b/src/app/api/[[...slugs]]/_lib/ppid/daftar_informasi_publik/find-many.ts @@ -1,9 +1,44 @@ import prisma from "@/lib/prisma"; +import { Context } from "elysia"; + +// Di findMany.ts +export default async function daftarInformasiPublikFindMany(context: Context) { + const page = Number(context.query.page) || 1; + const limit = Number(context.query.limit) || 10; + const skip = (page - 1) * limit; + + try { + const [data, total] = await Promise.all([ + prisma.daftarInformasiPublik.findMany({ + where: { isActive: true }, + skip, + take: limit, + orderBy: { createdAt: 'desc' }, + }), + prisma.daftarInformasiPublik.count({ + where: { isActive: true } + }) + ]); + + const totalPages = Math.ceil(total / limit); -export default async function daftarInformasiPublikFindMany() { - const res = await prisma.daftarInformasiPublik.findMany(); return { - data: res - } -} - \ No newline at end of file + success: true, + message: "Success fetch daftar informasi publik with pagination", + data, + page, + totalPages, + total, + }; + } catch (e) { + console.error("Find many paginated error:", e); + return { + success: false, + message: "Failed fetch daftar informasi publik with pagination", + data: [], + page: 1, + totalPages: 1, + total: 0, + }; + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_berdasarkan_jenis_kelamin/find-many.ts b/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_berdasarkan_jenis_kelamin/find-many.ts index 0960c1d6..afdb7674 100644 --- a/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_berdasarkan_jenis_kelamin/find-many.ts +++ b/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_berdasarkan_jenis_kelamin/find-many.ts @@ -1,8 +1,43 @@ import prisma from "@/lib/prisma"; +import { Context } from "elysia"; -export default async function grafikBerdasarkanJenisKelaminFindMany() { - const res = await prisma.grafikBerdasarkanJenisKelamin.findMany(); - return { - data: res +export default async function grafikBerdasarkanJenisKelaminFindMany(context: Context) { + const page = Number(context.query.page) || 1; + const limit = Number(context.query.limit) || 10; + const skip = (page - 1) * limit; + + try { + const [data, total] = await Promise.all([ + prisma.grafikBerdasarkanJenisKelamin.findMany({ + where: { isActive: true }, + skip, + take: limit, + orderBy: { createdAt: 'desc' }, + }), + prisma.grafikBerdasarkanJenisKelamin.count({ + where: { isActive: true } + }) + ]); + + const totalPages = Math.ceil(total / limit); + + return { + success: true, + message: "Success fetch grafik berdasarkan jenis kelamin with pagination", + data, + page, + totalPages, + total, + }; + } catch (e) { + console.error("Find many paginated error:", e); + return { + success: false, + message: "Failed fetch grafik berdasarkan jenis kelamin with pagination", + data: [], + page: 1, + totalPages: 1, + total: 0, + }; } } \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_berdasarkan_umur/find-many.ts b/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_berdasarkan_umur/find-many.ts index d050abfc..1c98996f 100644 --- a/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_berdasarkan_umur/find-many.ts +++ b/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_berdasarkan_umur/find-many.ts @@ -1,8 +1,43 @@ import prisma from "@/lib/prisma"; +import { Context } from "elysia"; -export async function grafikBerdasarkanUmurFindMany(){ - const res = await prisma.grafikBerdasarkanUmur.findMany(); - return { - data: res - } +export default async function grafikBerdasarkanUmurFindMany(context: Context){ + const page = Number(context.query.page) || 1; + const limit = Number(context.query.limit) || 10; + const skip = (page - 1) * limit; + + try { + const [data, total] = await Promise.all([ + prisma.grafikBerdasarkanUmur.findMany({ + where: { isActive: true }, + skip, + take: limit, + orderBy: { createdAt: 'desc' }, + }), + prisma.grafikBerdasarkanUmur.count({ + where: { isActive: true } + }) + ]); + + const totalPages = Math.ceil(total / limit); + + return { + success: true, + message: "Success fetch grafik berdasarkan umur with pagination", + data, + page, + totalPages, + total, + }; + } catch (e) { + console.error("Find many paginated error:", e); + return { + success: false, + message: "Failed fetch grafik berdasarkan umur with pagination", + data: [], + page: 1, + totalPages: 1, + total: 0, + }; + } } \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_berdasarkan_umur/index.ts b/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_berdasarkan_umur/index.ts index 8b237b8e..dabe8928 100644 --- a/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_berdasarkan_umur/index.ts +++ b/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_berdasarkan_umur/index.ts @@ -1,9 +1,9 @@ import Elysia, { t } from "elysia"; -import { grafikBerdasarkanUmurFindMany } from "./find-many"; import { grafikBerdasarkanUmurCreate } from "./create"; import grafikBerdasarakanUmurUpdate from "./update"; import grafikBerdasarakanUmurFindById from "./find-by-id"; import grafikBerdasarkanUmurDelete from "./del"; +import grafikBerdasarkanUmurFindMany from "./find-many"; const GrafikBerdasarkanUmur = new Elysia({ prefix: "/grafikberdasarkanumur", diff --git a/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_hasil_kepuasan_masyarakat/find-many.ts b/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_hasil_kepuasan_masyarakat/find-many.ts index 6e39d8a5..f8cad8d2 100644 --- a/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_hasil_kepuasan_masyarakat/find-many.ts +++ b/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_hasil_kepuasan_masyarakat/find-many.ts @@ -1,8 +1,44 @@ import prisma from "@/lib/prisma"; +import { Context } from "elysia"; -export default async function grafikHasilKepuasanMasyarakatFindMany() { - const res = await prisma.indeksKepuasanMasyarakat.findMany(); - return { - data: res, - }; -} +// Di findMany.ts +export default async function grafikHasilKepuasanMasyarakatFindMany(context: Context) { + const page = Number(context.query.page) || 1; + const limit = Number(context.query.limit) || 10; + const skip = (page - 1) * limit; + + try { + const [data, total] = await Promise.all([ + prisma.indeksKepuasanMasyarakat.findMany({ + where: { isActive: true }, + skip, + take: limit, + orderBy: { createdAt: 'desc' }, + }), + prisma.indeksKepuasanMasyarakat.count({ + where: { isActive: true } + }) + ]); + + const totalPages = Math.ceil(total / limit); + + return { + success: true, + message: "Success fetch grafik hasil kepuasan masyarakat with pagination", + data, + page, + totalPages, + total, + }; + } catch (e) { + console.error("Find many paginated error:", e); + return { + success: false, + message: "Failed fetch grafik hasil kepuasan masyarakat with pagination", + data: [], + page: 1, + totalPages: 1, + total: 0, + }; + } +} \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_responden/find-many.ts b/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_responden/find-many.ts index cd853f5c..b19656b4 100644 --- a/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_responden/find-many.ts +++ b/src/app/api/[[...slugs]]/_lib/ppid/ikm/grafik_responden/find-many.ts @@ -1,8 +1,43 @@ import prisma from "@/lib/prisma"; +import { Context } from "elysia"; -export default async function grafikRespondenFindMany(){ - const res = await prisma.grafikBerdasarkanResponden.findMany(); - return{ - data: res - } +export default async function grafikRespondenFindMany(context: Context){ + const page = Number(context.query.page) || 1; + const limit = Number(context.query.limit) || 10; + const skip = (page - 1) * limit; + + try { + const [data, total] = await Promise.all([ + prisma.grafikBerdasarkanResponden.findMany({ + where: { isActive: true }, + skip, + take: limit, + orderBy: { createdAt: 'desc' }, + }), + prisma.grafikBerdasarkanResponden.count({ + where: { isActive: true } + }) + ]); + + const totalPages = Math.ceil(total / limit); + + return { + success: true, + message: "Success fetch grafik berdasarkan responden with pagination", + data, + page, + totalPages, + total, + }; + } catch (e) { + console.error("Find many paginated error:", e); + return { + success: false, + message: "Failed fetch grafik berdasarkan responden with pagination", + data: [], + page: 1, + totalPages: 1, + total: 0, + }; + } } \ No newline at end of file